Python 删除/覆盖导入
我正在尝试使用Python 删除/覆盖导入,python,python-3.x,unit-testing,Python,Python 3.x,Unit Testing,我正在尝试使用unittest为intro CS类设置评分脚本。本质上,学生提交一个python文件student.py,其中包含一些通常相互依赖的函数(这意味着func3()可以在计算中使用func1()) 我通过比较student.func1的输出与correct.func1的输出来编写每个方法的单元测试,这是一种已知的正确实现方法(来自文件correct.py) 例如,假设func2在其计算中使用func1。 因此,无论是在默认情况下还是在student.func1测试失败时,我都想用co
unittest
为intro CS类设置评分脚本。本质上,学生提交一个python文件student.py
,其中包含一些通常相互依赖的函数(这意味着func3()
可以在计算中使用func1()
)
我通过比较student.func1
的输出与correct.func1
的输出来编写每个方法的单元测试,这是一种已知的正确实现方法(来自文件correct.py
)
例如,假设func2
在其计算中使用func1
。
因此,无论是在默认情况下还是在student.func1
测试失败时,我都想用correct.func1
覆盖student.func1
,因此student.func2
使用已知的正确实现(因此默认情况下并非完全错误)。我怎么能这样做呢?看起来setUp()
和tearDown()
与我想要的类似,但是我不知道如何在python中“取消导入”模块,并且到目前为止还没有找到任何关于它的资源
我对两种情况都感兴趣,
student.py
包含类,func1
,func2
是特定类的方法,并且当func1
和func2
只是在student.py
中一般定义时,最简单的方法是将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)
下面是一个失败/有效的dummy 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)
首先,我认为用正确的函数替换错误的函数是一个糟糕的举动。如果
func2
依赖于func1
,并且func1
以破坏func2
的方式被破坏,那么学生应该注意到func2
在测试中被破坏。类似地,如果他们误解了func1
的规范并注意到它太晚了,但是他们的所有其他函数都使用了不正确的func1
行为,他们不应该因为你把他们的func1
换成了其他函数所没有想到的东西而在所有东西上都扣分数。@user2357112我同意这不是一个完美的主意,我只是想这样做,因为我们目前发现错误的调试方法是用已知的工作代码替换损坏的代码,直到我们发现他们的哪些代码不工作为止。此外,这个脚本根本不是用来分配分数的,只是用来帮助手工评分(因此,如果他们通过了所有测试,就很好地表明一切都很完美,如果func7
失败,可能先看一下,等等)不起作用;其他函数仍将使用原始的func1
。您必须import student
和student.func1=正确。func1
。是的,您是对的。我忽略了学生代码调用func1的部分。好的,更好的版本。我不认为unittest实际上对测试执行顺序有任何保证,这似乎依赖于此。