一、Unittest用例的执行流程
TestRunner的工作流程:
遍历测试类中的测试用例,调用用例对象的run方法
将测试用例的结果保存到TestResult中
1、单线程执行测试用例
特别注意:
如果测试粒度按照文件为单位,那么文件中的测试类执行顺序就能得到保证
如果测试粒度按照测试类为单位,那么测试类中的测试用例执行顺序就能得到保证
如果测试粒度按照测试用例为单位,并且用例与用例之间有关联,那么测试用例执行顺序得不到保证
import unittest
from unittest import TestCase,TestSuite,TestLoader,TestResult
'''
粒度——》测试文件
粒度——》测试类
粒度——》用例级别
'''
from concurrent.futures.thread import ThreadPoolExecutor
#todo 加载用例到测试套件中
suite=unittest.defaultTestLoader.discover(r'D:\project_development\测试开发\day11\testcases')
print('-------------------------单线程执行--------------------------------------')
#todo 创建一个测试结果记录器
result=unittest.TestResult()
#todo 执行测试套件
suite.run(result)
print(suite)
print('用例执行的结果,',result)
二、测试套件的结构
1、目录如下:
2、测试文件
test_demo1.py
import time
import unittest
from ddt import ddt,data
@ddt
class DemoA1(unittest.TestCase):
@data(1,2,3,6)
def test_demoa1(self,item):
time.sleep(1)
print('---------test_demoa1--------',item)
@ddt
class DemoA2(unittest.TestCase):
@data(1,2,3,6)
def test_demoa2(self,item):
time.sleep(1)
print('---------test_demoa2--------',item)
test_demo2.py
import time
import unittest
from ddt import ddt,data
@ddt
class DemoB1(unittest.TestCase):
@data(1,2,3,6)
def test_demob1(self,item):
time.sleep(1)
print('---------test_demob1--------',item)
@ddt
class DemoB2(unittest.TestCase):
@data(1,2,3,6)
def test_demob2(self,item):
time.sleep(1)
print('---------test_demob1--------',item)
test_demo3.py
test_demo4.py
3、代码调试截图
三、测试套件的结构
1、将测试套件拆分为模块级别
特别注意
套件可以直接执行,套件中有run方法
model_suite=[m for m in suite]
result=unittest.TestResult()
创建一个线程池对象,一共创建了4个模块,所以max_workers最大为4
with ThreadPoolExecutor(max_workers=4) as tp: #创建一个线程池对象
for i in model_suite:
#i.run(result)
tp.submit(i.run,result)
2、将测试套件拆分为类级别
class_suite=[]
for m in suite:
for c in m:
class_suite.append(c)
result=unittest.TestResult()
with ThreadPoolExecutor(max_workers=8) as tp:
for i in class_suite:
tp.submit(i.run,result)
3、将测试套件拆分为用例级别
case_list=[]
for m in suite:
for c in m:
for i in c:
case_list.append(i)
result=unittest.TestResult()
with ThreadPoolExecutor(max_workers=32) as tp:
for i in case_list:
tp.submit(i.run,result)
四、封装一个可以并发运行unittest测试用例的函数,参数接收两个参数,一个suite(测试套件)和mode(任务粒度:),根据传入的参数model,来对测试套件进行任务拆分,进行并发执行
import unittest
from unittest import TestCase,TestSuite,TestLoader,TestResult
'''
粒度——》用例级别
粒度——》测试类
'''
from concurrent.futures.thread import ThreadPoolExecutor
#todo 加载用例到测试套件中
suite=unittest.defaultTestLoader.discover(r'D:\project_development\测试开发\day11\testcases')
print('-------------------------多线程执行--------------------------------------')
def run_cases(suite,model):
#判断任务执行粒度
task_list = []
if model=='case':
for m in suite:
for c in m:
for i in c:
task_list.append(i)
elif model=='cls':
for m in suite:
for c in m:
task_list.append(c)
else:
task_list=[i for i in suite]
result=unittest.TestResult()
with ThreadPoolExecutor(max_workers=8) as tp:
for i in task_list:
tp.submit(i.run,result)
run_cases(suite,'asd')