如果setUpClass引发异常,如何使python单元测试失败
我在使用python setUpClass时遇到了一些问题如果setUpClass引发异常,如何使python单元测试失败,python,unit-testing,Python,Unit Testing,我在使用python setUpClass时遇到了一些问题 例如考虑以下情况 class MyTest(unittest.case.TestCase): @classmethod def setUpClass(cls): print "Test setup" try: 1/0 except: raise @classmethod def tearDownClass(
例如考虑以下情况
class MyTest(unittest.case.TestCase):
@classmethod
def setUpClass(cls):
print "Test setup"
try:
1/0
except:
raise
@classmethod
def tearDownClass(cls):
print "Test teardown"
几个问题
正如Jeff指出的,您可以对异常调用
tearDownClass
,但也可以实现\uu del\uu(cls)
方法:
import unittest
class MyTest(unittest.case.TestCase):
@classmethod
def setUpClass(cls):
print "Test setup"
try:
1/0
except:
raise
@classmethod
def __del__(cls):
print "Test teardown"
def test_hello(cls):
print "Hello"
if __name__ == '__main__':
unittest.main()
将具有以下输出:
Test setup
E
======================================================================
ERROR: setUpClass (__main__.MyTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "my_test.py", line 8, in setUpClass
1/0
ZeroDivisionError: integer division or modulo by zero
----------------------------------------------------------------------
Ran 0 tests in 0.000s
FAILED (errors=1)
Test teardown
注意:您应该知道,在程序执行结束时将调用\uuu del\uu
方法,如果您有多个测试类,这可能不是您想要的
希望它有帮助最好的选择是为调用tearDownClass和重新引发异常的except添加处理程序
@classmethod
def setUpClass(cls):
try:
super(MyTest, cls).setUpClass()
# setup routine...
except Exception: # pylint: disable = W0703
super(MyTest, cls).tearDownClass()
raise
使用拆卸模块。它应该在setUpClass运行后调用。
除外:raise
不执行任何操作。(除非可能会弄乱堆栈跟踪,不确定。)您不妨将整个try..Except
块保留在外。对于第二个问题:如果您认为可能引发异常,那么您应该使用try..Except
(就像您所拥有的那样)对异常调用tearDownClass
。在此之后,您可以重新验证异常。感谢您的响应,正如Jeff所提到的,调用tearDownClass并引发异常的第二种方法就是解决方案。@millimoose,它不会扰乱堆栈跟踪。这就是裸体升高的要点。
import contextlib
class MyTestCase(unitest.TestCase):
@classmethod
def setUpClass(cls):
with contextlib.ExitStack() as stack:
# ensure teardown is called if error occurs
stack.callback(cls.tearDownClass)
# Do the things here!
# remove callback at the end if no error found
stack.pop_all()