一个Python背可定制的自动签名机。
sp-autograder的Python项目详细描述
CS 41自动签名机
第41章:意外事故代码是斯坦福大学的一门关于Python编程语言的课程。这个完全用Python实现的autograder允许用户运行学生代码,运行解决方案代码,并比较两者的输出。autograder允许用户实现多个可以同时执行的测试,并允许用户挂接到模块中,并提供逻辑来对测试结果进行后处理。在
CS 41 autograder的示例运行。
在
离开地面
以下是使用这款自动签名机的步骤:
- 实例化
autograder.Autograder
。创建从autograder.Autograder
继承的对象,如class TestAutograder(Autograder):
。在 - 初始化父实例。我倾向于在我的子类的
__init__
方法中使用super().__init__
来实现这一点。该函数唯一需要的参数是student模块的名称,以字符串module_name
的形式提供。如果要添加到自动加载器,请指定has_custom_tests=True
。在 - Write
run_custom_tests
。重写run_custom_tests(self)
函数并添加任何自定义测试。执行该函数时,self.module
将包含student模块对象。在
测试
自动加载器模块有许多测试,它们以线性层次结构相互继承。在
BaseTest
:必须提供BaseTest
和{}。它只是比较两个对象,如果两个对象相同则通过,否则失败。在 - ^另外,{{{cd15}可与
IOTest
:IOTest
允许自动签名器覆盖{},并在学生和解决方案程序调用 input
时向他们提供输入。文本输入应作为in_params
提供。在FileIOTest
:AFileIOTest
被提供一个filename
,并从该文件的内容生成一个IOTest
。在
测试套件
autograder.testsuite
包含一个名为TestSuite
的类。此类允许用户向自动加载器添加多个测试,同时运行它们,并将结果制成表格。您可以通过将multiprocess=True
传递给TestSuite
的构造函数来启用并发性。您还可以通过传入函数作为参数ml
,使用机器学习算法钩住测试套件。所有测试完成后,ml
将被调用,其中i
第i
个条目对应于第i
次测试(一个表示学生通过了测试,零表示学生失败)。在
高级功能
模块覆盖
自动读取器支持module_overrides
参数,该参数应该是将字符串映射到对象的字典。自动加载器将覆盖学生文件中模块级的关联映射。在
设置和清理
每个测试都支持一个setup_fn
和一个cleanup_fn
,它们将分别在测试运行之前和之后被调用。这些函数可以用来修改文件系统和输入,或者在测试运行前后进行清理
渐进式差异
如果在命令行中使用--progressive
或-p
标志调用自动读取器,则当遇到每个程序中的第一个输出错误时,它将停止。它将提示分级机输入previor、SUBSEQ或BOTH,分别显示前面的行、后续的行或显示整个diff。在
已知问题
多处理问题
模块覆盖和渐进式差异功能在多处理模式下不起作用。无法修复渐进式差异功能,因为操作系统限制对sys.stdin
的访问,因此自动加载器无法向分级器请求输入。可以使用模块覆盖来修复问题,但是需要大量的重构。在
- 项目
标签: