python unittest全面解析

作者: 望月成三人 | 来源:发表于2020-07-26 10:06 被阅读0次
    import unittest
    import os
    
    
    class MyUnittest(unittest.TestCase):
    
        def setUp(self) -> None:
            print("setUp_每运行一次用例都会执行一次")
            self.name = "hi"
            print("setUp_name_%s" % self.name)
    
        def tearDown(self) -> None:
            print("tearDown_每结束一次用例都会执行一次")
            print("tearDown_name_%s" % self.name)
    
        @classmethod
        def setUpClass(cls) -> None:
            print("setUpClass_整个测试开始后执行,只执行一次")
            cls.func = "setUpClass"
            print("setUpClass_func_%s" % cls.func)
    
        @classmethod
        def tearDownClass(cls) -> None:
            print("tearDownClass_整个测试完成后执行,只执行一次")
            print("tearDownClass_func_%s" % cls.func)
    
        def test_add(self):
            print("测试函数:test_add")
            self.name = "test_add"
            print("setUpClass_cls.func_%s" % self.func)
    
        def test_subtract(self):
            print("测试函数:test_subtract")
            self.name = "test_subtract"
            self.func = "test_subtract"
    
    
    if __name__ == "__main__":
        # 运行方式一
        unittest.main()
    

    执行结果

    setUpClass_整个测试开始后执行,只执行一次
    setUpClass_func_setUpClass
    test_add (ut_module.ut1_test.MyUnittest) ... setUp_每运行一次用例都会执行一次
    setUp_name_hi
    测试函数:test_add
    setUpClass_cls.func_setUpClass
    tearDown_每结束一次用例都会执行一次
    tearDown_name_test_add
    ok
    test_subtract (ut_module.ut1_test.MyUnittest) ... setUp_每运行一次用例都会执行一次
    setUp_name_hi
    测试函数:test_subtract
    tearDown_每结束一次用例都会执行一次
    tearDown_name_test_subtract
    ok
    tearDownClass_整个测试完成后执行,只执行一次
    tearDownClass_func_setUpClass
    
    ----------------------------------------------------------------------
    Ran 2 tests in 0.003s
    
    OK
    
    

    测试分析

    结果分析

    setUp初始化的值可以改变

    setUp_name_hi
    测试函数:test_add
    setUpClass_cls.func_setUpClass
    tearDown_每结束一次用例都会执行一次
    tearDown_name_test_add
    
    • setUp中的self.name的值,在测试函数中是可以被改变的,一开始name为hi,后面为test_add

    setUpClass的的值无法改变

    在def setUpClass赋值
    self.func = "setUpClass"
    在 def test_subtract中赋值
    self.func = "test_subtract"
    # 执行结果
    setUpClass_整个测试开始后执行,只执行一次
    setUpClass_func_setUpClass
    .....
    tearDownClass_整个测试完成后执行,只执行一次
    tearDownClass_func_setUpClass
    
    • setUpClass初始化的值在函数中无法改变,应该是clsself的指向不一样

    setUp和setUpClass

    • 每个用例都要独立,也就是每个用执行时,都会重开设备,就使用setup,比如appium中的driver
    • 若想复用某个初始化条件,单不期望每个用例都重启再打开,可以使用setUpClass
      • 在使用appium时,用setUp频繁初始化driver造成执行用例时间太长,可以使用setUpClass初始化driver,结合launch-app达到每个用例不重启,同时解决依赖关系的问题

    不同的运行unittest的方式

    方式一

    unittest.main()
    

    方式二

     # 构造测试集
     suite = unittest.TestSuite()
     suite.addTest(MyUnittest("test_add"))
     suite.addTest(MyUnittest("test_subtract"))
     # 执行测试
     runner = unittest.TextTestRunner()
     runner.run(suite)
    

    方式三

    # TestLoader 用来加载TestCase到TestSuite中的,其中有几个  loadTestsFrom__()方法,就是从各个地方寻找TestCase,创建它们的实例,然后add到TestSuite中,再返回一个TestSuite实例
    # TestSuite 测试套件集合,最终将传递给testRunner进行测试执行
    # TextTestRunner 用来执行测试用例,将测试结果保存在TextTestResult中
    # 此用法可以同时测试多个类
    suite1 = unittest.TestLoader().loadTestsFromTestCase(MyUnittest)
    suite2 = unittest.TestLoader().loadTestsFromTestCase(MyUnittest1)
    suite = unittest.TestSuite([suite1, suite2 ])
    unittest.TextTestRunner(verbosity=2).run(suite)
    

    方式四

    # 进入到测试目录
    os.chdir(".//ut_module")
    os.system("python -m unittest -v ut1_test")
    

    方式五,直接到终端中输入命令

    # 测试某个类下的所有函数
    D:\project\ut>python -m unittest -v  ut_module.ut1_test
    # 测试类中某一个函数
    D:\project\ut>python -m unittest -v ut_module.ut1_test.MyUnittest.test_add
    # 执行模块下所有test结尾的文件
    D:\project\ut>python -m unittest discover D:\project\ut\ut_module "*_test.py"
    # 同时执行多个测试类下的测试函数
    D:\project\ut>python -m unittest  ut_module.ut1_test.MyUnittest.test_add  ut_module.ut2_test.MyUnittest.test_subtract1
    
    

    相关文章

      网友评论

        本文标题:python unittest全面解析

        本文链接:https://www.haomeiwen.com/subject/kctwlktx.html