如果setUpClass抛出异常,如何使python unittest失败

时间:2012-08-15 20:39:43

标签: 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(cls):
        print "Test teardown"

几个问题

  1. 上面的代码是处理测试setUpClass异常的正确方法(通过提高它以便python unittest可以处理它),有fail(),skip()方法,但那些只能是由测试实例使用,而不是测试类。

  2. 当存在setUpClass异常时,我们如何确保tearDownClass运行(如果我们手动调用它,则unittest不运行它。)

4 个答案:

答案 0 :(得分:5)

您可以在Jeff指出异常时调用tearDownClass,但您也可以实现__del__(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

注意:你应该知道在程序执行结束时会调用__del__方法,如果你有一个以上的测试,这可能不是你想要的类。

希望有所帮助

答案 1 :(得分:1)

最好的选择是为处理程序添加处理程序,该处理程序会调用tearDownClass和 re-raise 例外。

@classmethod
def setUpClass(cls):
    try:
        super(MyTest, cls).setUpClass()
        # setup routine...
    except Exception:  # pylint: disable = W0703
        super(MyTest, cls).tearDownClass()
        raise

答案 2 :(得分:0)

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()

答案 3 :(得分:0)

使用tearDownModule。应该在setUpClass运行之后调用它。