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