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

  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值