tldr;我的单元测试运行了两次。知道为什么吗?
考虑我有2个文件:
a.py
checker.py
我对a.py有一个奇怪的要求。 a.py具有以下代码,并且需要具有以下代码:
import checker
def factorial(n):
if n == -1:
raise Exception("Raised this exception on purpose")
result = 1
for i in range(1,n+1):
result *= i
return result
total = 53
checker.runTests()
我需要能够在checker.py中运行factorial测试
import unittest
class MyTestCase(unittest.TestCase):
def test_factorial3(self):
import a
self.assertEqual(a.factorial(3), 6)
def test_factorial4(self):
import a
self.assertEqual(a.factorial(4), 24)
def test_factorial5(self):
import a
self.assertEqual(a.factorial(5), 120)
def test_factorialnegative1(self):
import a
self.assertEqual(a.factorial(-1), 0)
def test_total(self):
import a
self.assertEqual(a.total, 53)
def runTests():
runner = unittest.TextTestRunner(verbosity=2)
suite = unittest.TestLoader().loadTestsFromTestCase(MyTestCase)
runner.run(suite)
如果有更好的方法来处理循环依赖关系,我愿意接受如何改进checker.py的建议。但是,我的问题是,当我运行a.py时,我没有得到预期的输出,特别是测试运行两次?参见:
test_factorial3(cisc106checker.MyTestCase)... test_factorial3 (cisc106checker.MyTestCase)... ok test_factorial4 (cisc106checker.MyTestCase)... ok test_factorial5 (cisc106checker.MyTestCase)... ok test_factorialnegative1 (cisc106checker.MyTestCase)...错误test_total (cisc106checker.MyTestCase)...好的
=============================================== =======================错误:test_factorialnegative1(cisc106checker.MyTestCase) -------------------------------------------------- -------------------- Traceback(最近一次调用最后一次):文件 “/Users/tnj/PycharmProjects/AutoExam/cisc106checker.py”,第21行,in test_factorialnegative1 self.assertEqual(x.factorial(-1),0)文件“/Users/tnj/PycharmProjects/AutoExam/mattsapQ16.py”,第10行,in 阶乘 提高异常(“Matt故意提出此异常”)例外:Matt故意提出此异常
----------------------------------------------- -----------------------以0.001s进行5次测试
FAILED(errors = 1)ok test_factorial4(cisc106checker.MyTestCase)... ok test_factorial5(cisc106checker.MyTestCase)......好的 test_factorialnegative1(cisc106checker.MyTestCase)...错误 test_total(cisc106checker.MyTestCase)...好的
=============================================== =======================错误:test_factorialnegative1(cisc106checker.MyTestCase) -------------------------------------------------- -------------------- Traceback(最近一次调用最后一次):文件 “/Users/tnj/PycharmProjects/AutoExam/cisc106checker.py”,第21行,in test_factorialnegative1 self.assertEqual(x.factorial(-1),0)文件“/Users/tnj/PycharmProjects/AutoExam/mattsapQ16.py”,第10行,in 阶乘 提高异常(“Matt故意提出此异常”)例外:Matt故意提出此异常
----------------------------------------------- -----------------------以0.005s为单位进行5次测试
失败(错误= 1)
然而,当我从checker.py运行它时,它只运行一次。到底是怎么回事?为什么会跑两次?
答案 0 :(得分:2)
您以外的代码段在a.py
total = 53
checker.runTests()
运行a.py
时执行一次,然后在checker.py
中导入时再执行一次。所以runTests()
执行两次。
答案 1 :(得分:2)
也许更好的事情就是问,"我能给学生的最好的脚手架是什么,这样他们就可以轻松地编写和运行测试?"他们将编辑产品文件(a.py)和测试文件(checker.py),那么为什么选择一个而不是另一个呢?让他们运行checker.py来运行测试。然后你不会引入导入循环,他们将有一个他们可以理解的简单结构。
答案 2 :(得分:1)
简短版本:使用解决方案摆脱文件末尾的import checker
和文件末尾的checker.runTests()
。
更长的版本:
通过调用“生产代码”中的测试,您将代码附加到测试中。而你真的不想这样做。
要运行测试,您可以将测试文件的末尾更改为
if __name__ == '__main__':
unittest.main()
并通过调用python my_test_file.py
来运行测试。
遵循简短版本中描述的步骤也将解决您提到的循环依赖问题。
另一项易于改进的方法:您可以在第二行编写import a
并删除所有重复的import a
行。