Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果setUpClass引发异常,如何使python单元测试失败_Python_Unit Testing - Fatal编程技术网

如果setUpClass引发异常,如何使python单元测试失败

如果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(

我在使用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"
几个问题

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

  • 当存在setUpClass异常时,我们如何确保tearDownClass运行(unittest不运行它,我们应该手动调用它)


  • 正如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()