首页 > 解决方案 > Ruby on Rails - 如何在用户上传的 Ruby 文件上运行自动化测试?

问题描述

我目前正在开发一个 Rails 应用程序(React 前端),该应用程序处理学生提交 Ruby 项目的压缩目录。这些文件通过 Paperclip 和 S3 存储在Assessment模型上。目前,为了对学生提交的内容进行评分,我必须下载每个学生文件并从命令行单独使用 RSpec 进行测试。

我通过编写一个命令行脚本(在 Ruby 中)改进了工作流程,该脚本将获取一个 Zip 目录,一次对它们进行评分,并将每个单独的 RSpec 输出存储在 score.txt 文件中。

目标是允许学生通过门户上传他们的 .zip,并让他们立即使用 RSpec 自动测试。有没有办法做到这一点?

我做了很多搜索,到目前为止只能找到有关如何测试实时用户输入的建议(类似于 codecademy,或其他具有集成 IDE 的站点)。

标签: ruby-on-railsrubytestingfile-uploadrspec

解决方案


当然这是可行的。

解压缩文件,加载每个文件并在定义的方法/类上运行测试。

但至少有两件事需要考虑......

安全

学生可以覆盖您的test方法以仅返回好成绩,或者随机或其他。因为您基本上是将他们的代码加载到对它们进行评分的同一过程中。当然,您可以使方法名称不明显,但通过默默无闻的安全性只是您的手指并希望幸运(例如,学生可以制作一个脚本,将您的源代码上传到某个地方以便稍后检查)

我会用一个小的 API 来解决它,它接受代码、源文件、调用方法并返回输出。因此,不是在您的空间中加载文件 - 您要求一个单独的应用程序产生输出,并在您的主应用程序中评估/磨碎它。

结果的一致性

即一个学生可以覆盖定义,Object.to_s而其他学生会使用它,认为它是原始实现 - 从而使他们的代码无法产生所需的输出。

对此的解决方案是在单独的进程(不仅仅是线程)中运行每个测试

不幸的是,这让我们回到了安全问题——每个脚本都能够读取和更改运行它的应用程序可以访问的代码。

所以!那该怎么办?

我现在能想到的最简单的事情是启动一个容器(即 docker、rocket 或其他)并在那里运行代码。另一个好处是您可以与学生共享容器映像,他们可以在相同的环境中运行他们的代码,从而使结果与您想象的一样一致。


推荐阅读