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('主')
class test1(unittest.TestCase):
def setUp(self) -> None:
print('start...')
def tearDown(self) -> None:
print('finish...')
def test_01(self):
print('fist')
def test_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)
class test02(unittest.TestCase):
def setUp(self) -> None:
print('开始')
def tearDown(self) -> None:
print('结束')
def test_01(self):
print('第一')
def test_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
class main():
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')
def get_testcase(self):
suite = unittest.TestSuite()
testcase = unittest.defaultTestLoader.discover(start_dir=self.py_path, pattern='test*.py')
print(testcase)
suite.addTests(testcase)
return suite
def run_test(self):
suite = self.get_testcase()
with open(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
主
外面
111
222
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