我正在尝试使用unittest
为介绍CS类设置评分脚本。从本质上讲,学生提交了一个python文件student.py
,其中包含一些通常相互依赖的函数(意味着func3()
可能在其计算中使用func1()
)。
我正在为每个方法编写单元测试,方法是将student.func1
的输出与correct.func1
的输出进行比较,这是一种已知正确实现的方法(来自文件correct.py
)。
例如,假设func2
在其计算中使用func1
。
因此,默认情况下或student.func1
未通过某些测试时,我想用student.func1
覆盖correct.func1
,因此student.func2
使用已知的正确实现(因此不仅仅是默认是错的)。我怎么能这样做呢?似乎setUp()
和tearDown()
与我想要的类似,但我不知道如何在python中“unmport”模块,到目前为止还没有找到任何关于它的资源。 / p>
我对student.py
包含类,func1
,func2
是特定类的方法以及func1
和{{1}的情况感兴趣只是在func2
内定义。
答案 0 :(得分:3)
最简单的方法是将student
导入模块,然后在测试失败时捕获AssertionError
,并用您自己的好代码替换学生模块中的错误代码:
import student
import unittest
def safe_f1():
print("Safe f1")
return 1
class TestSomething(unittest.TestCase):
def test_f1(self):
try:
self.assertEqual(student.func1(), 1)
except AssertionError:
student.func1 = safe_f1
raise
def test_f2(self):
self.assertEqual(student.func2(), 2)
这是一个失败/工作的虚拟student.py:
def func1():
print("Bad f1")
return 2
def func2():
return func1() + 1
return 2
当我跑步时,我得到:
$ python -m unittest test.py
Bad f1
FSafe f1
.
======================================================================
FAIL: test_f1 (test.TestSomething)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/austin/Code/so/test.py", line 13, in test_f1
self.assertEqual(student.func1(), 1)
AssertionError: 2 != 1
----------------------------------------------------------------------
Ran 2 tests in 0.001s
FAILED (failures=1)