zoukankan      html  css  js  c++  java
  • unittest_TestSuite测试套件(2)

    前面一章中演示了unittest如何执行一个简单的测试,但有两个问题:

    1. 我们知道测试用例的执行顺序是根据测试用例名称顺序执行的,在不改变用例名称的情况下,我们怎么来控制用例执行的顺序呢?
    2. 一个测试文件,我们直接执行该文件即可,但如果有多个测试文件,怎么进行组织,总不能一个个文件执行吧?

    要解决上面两个问题,我们就要用到测试套件TestSuite。

    import unittest
    
    
    class Demo(unittest.TestCase):
    
        @classmethod
        def setUpClass(cls) -> None:
            print("setUpClass被执行
    ")
    
        @classmethod
        def tearDownClass(cls) -> None:
            print("tearDownClass被执行")
    
        def setUp(self) -> None:
            print("setup被执行")
    
        def tearDown(self) -> None:
            print("teardown被执行
    ")
    
        def test_a(self):
            print("test_a被执行")
    
        def test_c(self):
            print("test_c被执行")
    
        def test_b(self):
            print("test_b被执行")
            a, b = 1, 2
            assert a+b == 3
    
        def d(self):
            print("d被执行")
    
    
    if __name__ == '__main__':
        # 生成测试套容器
        suite = unittest.TestSuite()
        # addTest 一次只能加一个用例
        suite.addTest(Demo("test_c"))
        # addTests 一次能添加多个用例,多个用例以列表传入
        suite.addTests([Demo("test_b"), Demo("test_a"), Demo("d")])
    
        # 生成执行器
        runner = unittest.TextTestRunner(verbosity=2)
        # 执行用例
        runner.run(suite)

    注:verbosity 参数可以控制输出的错误报告的详细程度,默认是 1;如果设为 0,则不输出每一用例的执行结果;如果设为 2,则输出详细的执行结果

    执行结果

    从用例的执行结果中我们可以看出:

    • 用例的执行顺序是按照用例添加时的顺序来执行的
    • 可以执行不以test开头的用例

    用例较少时,以上面的方式生成测试套件就比较繁琐了,unittest还提供了其它生成测试套件的方式,只是这些方式的执行用例的顺序和查找用例的规则与unittest.main()一样。

    自动加载用例

    探索用例使用的是discover()方法,能识别指定目录下所有以test开头的文件以及文件中的用例,并将用例添加到测试套件中。注:指定目录下如果存在子目录,子目录用例无法被加载。

    import unittest
    
    if __name__ == '__main__':
        # 识别指定目录下所有以test开头的文件以及文件中的用例,并将用例自动添加到测试套中
        test_cases_dir = "./test_cases/"
        suite = unittest.defaultTestLoader.discover(test_cases_dir)
    
        # 生成执行器
        runner = unittest.TextTestRunner(verbosity=2)
        # 执行用例
        runner.run(suite)

    指定加载用例

    加载用例有4种方法

    loadTestsFromName():类似于addTest,一个一个加载;参数为用例的路径id,至少需要精确到文件;不需要import用例类

    loadTestsFromNames():类似于addTests,批量加载,,参数为用例的路径id,至少需要精确到文件;不需要import用例类

    loadTestsFromTestCase():将指定测试类下所有以test开头的用例添加到测试套中;参数为用例类;需要import用例类

    loadTestsFromModule():将指定模块中所有以test开头的用例添加到测试套中;参数为module对象

    目录结下:

    用法如下:

    import unittest
    
    if __name__ == '__main__':
        # 创建测试套件:以用例的路径id为参数(路径id最短精确到文件)导入用例;不需要import用例类对象
        # loadTestsFromName:单个导入用例,路径id精确到类对象
        suite = unittest.TestLoader().loadTestsFromName("test_cases.test_demo.Demo")
        # loadTestsFromNames:批量导入用例,路径id精确到文件
        suite = unittest.TestLoader().loadTestsFromNames(["test_cases.test_demo"])
    
        # 创建测试套件:将指定测试类下所有以test开头的用例添加到测试套中
        from test_cases.test_demo import Demo
        suite = unittest.TestLoader().loadTestsFromTestCase(Demo)
    
        # 创建测试套件:将指定模块中所有以test开头的用例添加到测试套中
        md = __import__("test_cases.test_demo", fromlist=("a",))    # 获取module对象
        suite = unittest.TestLoader().loadTestsFromModule(md)
    
        # 生成执行器
        runner = unittest.TextTestRunner(verbosity=2)
        # 执行用例
        runner.run(suite)
  • 相关阅读:
    bzoj1009
    bzoj1576 3694
    bzoj3143
    bzoj1391
    bzoj2729
    bzoj2653
    bzoj3261
    bzoj2326
    人件
    优秀的产品
  • 原文地址:https://www.cnblogs.com/testlearn/p/14423698.html
Copyright © 2011-2022 走看看