ruby-on-rails - Ruby on Rails - 如何在用户上传的 Ruby 文件上运行自动化测试?
问题描述
我目前正在开发一个 Rails 应用程序(React 前端),该应用程序处理学生提交 Ruby 项目的压缩目录。这些文件通过 Paperclip 和 S3 存储在Assessment
模型上。目前,为了对学生提交的内容进行评分,我必须下载每个学生文件并从命令行单独使用 RSpec 进行测试。
我通过编写一个命令行脚本(在 Ruby 中)改进了工作流程,该脚本将获取一个 Zip 目录,一次对它们进行评分,并将每个单独的 RSpec 输出存储在 score.txt 文件中。
目标是允许学生通过门户上传他们的 .zip,并让他们立即使用 RSpec 自动测试。有没有办法做到这一点?
我做了很多搜索,到目前为止只能找到有关如何测试实时用户输入的建议(类似于 codecademy,或其他具有集成 IDE 的站点)。
解决方案
当然这是可行的。
解压缩文件,加载每个文件并在定义的方法/类上运行测试。
但至少有两件事需要考虑......
安全
学生可以覆盖您的test
方法以仅返回好成绩,或者随机或其他。因为您基本上是将他们的代码加载到对它们进行评分的同一过程中。当然,您可以使方法名称不明显,但通过默默无闻的安全性只是您的手指并希望幸运(例如,学生可以制作一个脚本,将您的源代码上传到某个地方以便稍后检查)
我会用一个小的 API 来解决它,它接受代码、源文件、调用方法并返回输出。因此,不是在您的空间中加载文件 - 您要求一个单独的应用程序产生输出,并在您的主应用程序中评估/磨碎它。
结果的一致性
即一个学生可以覆盖定义,Object.to_s
而其他学生会使用它,认为它是原始实现 - 从而使他们的代码无法产生所需的输出。
对此的解决方案是在单独的进程(不仅仅是线程)中运行每个测试
不幸的是,这让我们回到了安全问题——每个脚本都能够读取和更改运行它的应用程序可以访问的代码。
所以!那该怎么办?
我现在能想到的最简单的事情是启动一个容器(即 docker、rocket 或其他)并在那里运行代码。另一个好处是您可以与学生共享容器映像,他们可以在相同的环境中运行他们的代码,从而使结果与您想象的一样一致。
推荐阅读
- tensorflow - TensorFlow Opkernel 错误
- ajax - Windows 应用程序可能存在 CORS 问题
- azure - 具有多个环境变量的 Azure Docker 部署
- c# - SQL Server Id 列似乎在 C# 应用程序中被重置
- php - WooCommerce 数字下载引发 403 禁止错误
- visual-studio - Visual Studio 15.7 Final 上的 ASP.NET Core 2.1
- node.js - 如何在承诺中访问类的属性?
- android - 为什么我的 SVG 图像在设备 API 16 和 API 27 中看起来很模糊
- node.js - 车把无法显示图像
- android - shape.xml 没有出现界面