unittest的运行方式
unittest的运行方式
unittest的运行方式一直是个谜:主要是run的选择,有三个模块unittest.main()、unittest.testsuite()、unittest.defaultTestLoader() 三种
1. unittest.main()
1.unittest.main() 测试用例执行,执行器是unittest
直接执行,按照test开头asii码排序的测试用例执行,执行器是unittest
也可以不写,直接放在unittest.testcase上,执行该class下所有用例
if __name__ =='__main__':
unittest.main()#直接执行
2. unittest.TestSuite()
2.1 unittest.testsuite() 测试套件执行,执行器是python,按照addTest()的加载顺序执行单次执行
首先创建测试用例套件,手动添加测试用例到测试套件中,再实例化runner类,最后运行测试。
if __name__ =='__main__':
suite1 = unittest.TestSuite()
suite1.addTest(TestUi('test_01_uicheck'))
suite1.addTest(TestUi('test_02_uicheck'))
suite1.addTest(TestUi('test_03_uicheck'))#unittest.main(defaultTest='suite1')两个调用方法结果相同没有区别
unittest.TextTestRunner().run(suite1)
2.2 unittest.testsuite() 测试套件执行,执行器是python,按照addTests()的加载顺序执行单次执行
首先创建测试用例套件,手动添加测试用例到测试套件中,再实例化runner类,最后运行测试
if __name__ =='__main__':
suite = unittest.TestSuite()
testcase =[TestUi('test_01_uicheck'),TestUi('test_02_uicheck'),TestUi('test_03_uicheck')]
suite.addTests(testcase)
unittest.main(defaultTest='suite')#unittest.main(defaultTest='suite1')两个调用方法结果相同没有区别
unittest.TextTestRunner().run(suite)
3. unittest.defaultTestLoader()
3.unittest.defaultTestLoader() 测试文件执行,执行器是python,按照discover匹配模式的ASCII单次执行
参数说明:start_dir 开始执行用例的目录 pattern 测试脚本匹配规则。
if __name__ =='__main__':
discovero = unittest.defaultTestLoader.discover(start_dir='./',pattern='test*.py')
test_runner = unittest.TextTestRunner()
test_runner.run(discovero)
4. 探索unittest执行顺序
test01.py
print('主')classtest1(unittest.TestCase):defsetUp(self)->None:print('start...')deftearDown(self)->None:print('finish...')deftest_01(self):print('fist')deftest_02(self):print('second...')# suite1 = unittest.TestSuite()# suite1.addTest(test1('test_01'))# suite1.addTest(test1('test_02'))# with open(file=report_file,mode='w',encoding='utf-8') as f:# runner = unittest.TextTestRunner(stream=f,verbosity=2)# runner.run(suite1)# print(f'{py_name}测试完成!')print('下面')
test02.py
print(111)classtest02(unittest.TestCase):defsetUp(self)->None:print('开始')deftearDown(self)->None:print('结束')deftest_01(self):print('第一')deftest_02(self):print('第二')# suite1 = unittest.TestSuite()# suite1.addTest(test02('test_01'))# suite1.addTest(test02('test_02'))# with open(file=report_file,mode='w',encoding='utf-8') as f:# runner = unittest.TextTestRunner(stream=f,verbosity=2)# runner.run(suite1)# print(f'{py_name}测试完成!')print(222)
main.py
classmain():def__init__(self):
self.sn = devices_info.sn
self.py_path = os.getcwd()
self.py_name = os.path.basename(__file__).split('.')[0]
self.report_path =r'D:\pythonProject\apk测试\report\base\heng'
self.report_file = os.path.join(self.py_path,f'{self.py_name}_result.txt')defget_testcase(self):
suite = unittest.TestSuite()
testcase = unittest.defaultTestLoader.discover(start_dir=self.py_path, pattern='test*.py')print(testcase)
suite.addTests(testcase)return suite
defrun_test(self):
suite = self.get_testcase()withopen(file=self.report_file,mode='w')as f:
runner = unittest.TextTestRunner(stream=f,verbosity=2)
runner.run(suite)#事实证明只执行一次if __name__ =='__main__':
run = main().run_test()
运行main.py
D:\Python310\python.exe D:/pythonProject/apk_test/debug/main_debug.py
主
外面
111222
start...
fist
finish...
start...
second...
finish...
开始
第一
结束
开始
第二
结束
说明,python unittest执行会优先执行test文件的class外主程序,即打印“主、下面、111、222”,class外主程序执行完,才加载unittest里的测试内容。
如果test01.py 和 test02.py ,unittest.main()都写入的话,就会执行class外主程序一遍、unittest class内容执行一遍。
参考文章:https://blog.csdn.net/weixin_42976139/article/details/102726138
版权归原作者 古墙白 所有, 如有侵权,请联系我们删除。