pytest多任务并发执行测试用例

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'])

你可能感兴趣的:(测试用例,pytest)