防止unittest调用sys.exit()

0 投票
1 回答
986 浏览
提问于 2025-04-18 16:23

我在使用Unittest的时候遇到问题,它总是调用sys.exit()。我在网上找到了一个相关的帖子,内容是关于如何解决这个问题。我修改了代码,变成了这样:

unittest.TextTestRunner().run(unittest.TestLoader().loadTestsFromTestCase(run_tests.Compare))

然后把它放在我的主程序里。我觉得我唯一改变的就是我的测试放在了一个叫做run_tests.py的单独文件里。这个文件的内容是:

import unittest
from list_of_globals import globvar

value1 = globvar.relerror
value2 = globvar.tolerance

class Compare(unittest.TestCase):
    def __init__(self,value1,value2):
        super(Compare, self).__init__()
        self.value1 = value1
        self.value2 = value2

    def runTest(self):
        self.assertTrue(self.value1 <  self.value2)

当我运行主程序的时候,出现了以下错误:

File "./main.py", line 44, in <module> unittest.TextTestRunner().run(unittest.TestLoader().loadTestsFromTestCase(run_tests.Compare)) File "/usr/lib64/python2.6/unittest.py", line 550, in loadTestsFromTestCase return self.suiteClass(map(testCaseClass, testCaseNames)) TypeError: __init__() takes exactly 3 arguments (2 given)

我不明白为什么会出现这个错误,也不知道该怎么解决。如果有人能帮我,我会非常感激。我在Linux上使用的是Python 2.6。

1 个回答

1

你的问题出在单元测试类上。

在写单元测试的时候,不应该重写初始化方法(init),因为这个方法是用来处理哪些测试需要运行的。对于测试配置,比如设置一些变量,你应该写一个叫做 setUp 的方法,这个方法不需要任何参数。比如:

class Compare(unittest.TestCase):

    def setUp(self):
        self.value1 = globvar.relerror
        self.value2 = globvar.tolerance

    def runTest(self):
        self.assertTrue(self.value1 <  self.value2)

在链接的问题中,unittest.main 在所有测试运行完后会退出 Python。这对那个用户来说并不是想要的结果,因为他们是在 IPython Notebook 中运行测试的,而 IPython Notebook 本质上是一个增强版的解释器。因此,它也被 sys.exit 终止了。也就是说,退出是在测试之外被调用的,而不是在测试中。我原以为是被测试的函数在调用退出。

撰写回答