Python unittest多次运行

时间:2018-01-25 22:38:50

标签: python python-unittest

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运行它时,它只运行一次。到底是怎么回事?为什么会跑两次?

3 个答案:

答案 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行。