• 14.5 忽略或期望测试失败
    • 问题
    • 解决方案
    • 讨论

    14.5 忽略或期望测试失败

    问题

    你想在单元测试中忽略或标记某些测试会按照预期运行失败。

    解决方案

    unittest 模块有装饰器可用来控制对指定测试方法的处理,例如:

    1. import unittest
    2. import os
    3. import platform
    4.  
    5. class Tests(unittest.TestCase):
    6. def test_0(self):
    7. self.assertTrue(True)
    8.  
    9. @unittest.skip('skipped test')
    10. def test_1(self):
    11. self.fail('should have failed!')
    12.  
    13. @unittest.skipIf(os.name=='posix', 'Not supported on Unix')
    14. def test_2(self):
    15. import winreg
    16.  
    17. @unittest.skipUnless(platform.system() == 'Darwin', 'Mac specific test')
    18. def test_3(self):
    19. self.assertTrue(True)
    20.  
    21. @unittest.expectedFailure
    22. def test_4(self):
    23. self.assertEqual(2+2, 5)
    24.  
    25. if __name__ == '__main__':
    26. unittest.main()

    如果你在Mac上运行这段代码,你会得到如下输出:

    1. bash % python3 testsample.py -v
    2. test_0 (__main__.Tests) ... ok
    3. test_1 (__main__.Tests) ... skipped 'skipped test'
    4. test_2 (__main__.Tests) ... skipped 'Not supported on Unix'
    5. test_3 (__main__.Tests) ... ok
    6. test_4 (__main__.Tests) ... expected failure
    7.  
    8. ----------------------------------------------------------------------
    9. Ran 5 tests in 0.002s
    10.  
    11. OK (skipped=2, expected failures=1)

    讨论

    skip() 装饰器能被用来忽略某个你不想运行的测试。skipIf()skipUnless()对于你只想在某个特定平台或Python版本或其他依赖成立时才运行测试的时候非常有用。使用 @expected 的失败装饰器来标记那些确定会失败的测试,并且对这些测试你不想让测试框架打印更多信息。

    忽略方法的装饰器还可以被用来装饰整个测试类,比如:

    1. @unittest.skipUnless(platform.system() == 'Darwin', 'Mac specific tests')
      class DarwinTests(unittest.TestCase):
      pass

    原文:

    http://python3-cookbook.readthedocs.io/zh_CN/latest/c14/p05_skip_or_anticipate_test_failures.html