pytest实现多任务并发执行测试用例
需要再conftest.py中重写pytest的相关的钩子函数
def pytest_addoption(parser):
"""执行测试用例时添加命令行参数"""
group = parser.getgroup("pytest-thread")
group.addoption("--current",default=None,help="运行的线程数量")
group.addoption("--runTask", default=None, help="运行的任务函数")
通过协程gevent实现并发执行测试用例函数代码
def run_test(items):
# 执行测试用例的函数
for item in items:# items 是一个包含用例的列表
# 执行单条用例
item.ihook.pytest_runtest_protocol(item=item,nextitem=None)
def pytest_runtestloop(session):
"""pytest用例执行的钩子函数
"""
# 获取命令行传入的参数
count = session.config.getoption("--current")
run_task = session.config.getoption("--runTask")
# 根据参数拆分并发执行任务函数
if run_task=='mod':
# 对用例以模块为单位进行拆分
# [{"模块1":[用例1,用例2,用例3]},{"模块2":[用例1,用例2,用例3]}]
cases={}
for item in session.items:
# 获取用例所属的模块
module = item.module
# 判断模块在列表中是否存在
if cases.get(module):
# 如果存在,直接将用例加进去
cases['module'].append(item)
else:
# 如果没有,以模块作为key,用例作为value保存进去
cases['module']=[item]
# 以模块为单位并发执行测试用例,一个模块一个并发
gs=[]
for case_ in cases.values():
g = gevent.spawn(run_test,case_)
gs.append(g)
gevent.joinall(gs)
return True
执行用例
import pytest
pytest.main(['--current=3','--runTask=mod'])