繁体   English   中英

Python单元测试多次运行

[英]Python unittest running multiple times

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中运行阶乘测试

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)...确定test_factorial4(cisc106checker.MyTestCase)...确定test_factorial5(cisc106checker.MyTestCase)...确定test_factorialnegative1(cisc106checker.MyTestCase) (cisc106checker.MyTestCase)...确定

================================================== ===================错误:test_factorialnegative1(cisc106checker.MyTestCase)---------------------- - - - - - - - - - - - - - - - - - - - - - - - - 追溯 (最近一次通话最近一次):文件“ /Users/tnj/PycharmProjects/AutoExam/cisc106checker.py”,行21,位于test_factorialnegative1 self.assertEqual(x.factorial(-1),0)中,文件“ / Users / tnj / PycharmProjects / AutoExam / mattsapQ16.py“,第10行,阶乘引发Exception(” Matt故意引发此异常“)异常:Matt故意引发此异常

-------------------------------------------------- --------------------在0.001秒内进行了5次测试

失败(错误= 1)ok test_factorial4(cisc106checker.MyTestCase)... ok test_factorial5(cisc106checker.MyTestCase)... ok test_factorialnegative1(cisc106checker.MyTestCase)...错误test_total(cisc106checker.MyTestCase)... ok

================================================== ===================错误:test_factorialnegative1(cisc106checker.MyTestCase)---------------------- - - - - - - - - - - - - - - - - - - - - - - - - 追溯 (最近一次通话最近一次):文件“ /Users/tnj/PycharmProjects/AutoExam/cisc106checker.py”,行21,位于test_factorialnegative1 self.assertEqual(x.factorial(-1),0)中,文件“ / Users / tnj / PycharmProjects / AutoExam / mattsapQ16.py“,第10行,阶乘引发Exception(” Matt故意引发此异常“)异常:Matt故意引发此异常

-------------------------------------------------- --------------------在0.005秒内进行了5次测试

失败(错误= 1)

但是,当我从checker.py运行它时,它只运行一次。 到底是怎么回事? 为什么要运行两次?

您外部的代码段在a.pya.py

total = 53 
checker.runTests()

在运行a.py时执行一次,然后在checker.py其导入时再次checker.py 因此runTests()被执行两次。

也许最好的事情是问:“我能给我的学生最好的脚手架是什么,这样他们可以轻松编写和运行测试?” 他们将同时编辑产品文件(a.py)和测试文件(checker.py),那么为什么要选择一个? 让他们运行checker.py来运行测试。 然后,您将不会引入导入循环,它们将具有可以理解的简单结构。

简短版本:使用解决方案,在文件的开头摆脱import checker ,在文件末尾checker.runTests()

较长版本:

通过在“生产代码”中调用测试,可以将代码附加到测试中。 而且您真的不想这样做。

要运行测试,您可以将测试文件的末尾更改为

if __name__ == '__main__':
    unittest.main()

并通过调用python my_test_file.py运行测试。

遵循简短版本中描述的步骤,还将解决您提到的循环依赖问题。

另一个易于执行的改进:您可以在第二行中编写import a ,并删除所有重复的import a行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM