python-pytest:多进程、多线程执行用例

准备工作:

Python Package

pytest-parallel-0.0.10: windows版本只能是0.0.10

pytest-xdist

这两个包都是基于pytest基础上,实现多进程、多线程执行测试用例

pytest-xdist和pytest-parallel 区别

pytest-xdist: 多进程执行,不支持线程执行

pytest-parallel:多进程、多线程执行;windows操作系统只支持一个进程,可多个线程;max和linux可多进程

这两个都可以实现并发或并行执行用例,缩短测试时间

进程和线程的区别

进程:点击打开qq,就启动了qq的进程

线程:在qq进程下,会有q群或还有会话,启动了线程

一个线程只有一个主进程,一个进程有多个线程

参数介绍

使用pytest-xdist和pytest-parllel传入命令行执行,看到的效果,都是同时启动给定的参数

如:

pytest-xdist: 配置参数 ‘-n’,’2’ 同时启动两个进程,执行

Pytest-parllel:   '--workers=1', '--tests-per-worker=2',一个进程,启动2个线程执行

                        --workers 2 --tests-per-worker 4:2个进程并行,且每个进程最多4个线程运行,即总共最多8个线程运行

例子

pytest: 使用多线程执行用例,pytest收集用例数:4,设置线程数:4,每个test用例调用task(),默认等待10s,4个线程同时执行,预计时间:约10s

--- 多线程.py文件
import pytest
from concurrent.futures import ThreadPoolExecutor,as_completed
import threading

def task():
    logging.info(f"线程:{threading.currentThread().name}")
    time.sleep(10)

class TestTask():
    def test_task1(self):
        task()
        return "task1"

    def test_task2(self):
        task()
        return "task2"

    def test_task3(self):
        task()
        return "task3"

    def test_task4(self):
        task()
        return "task4"

if __name__ == '__main__':
    pytest.main(['-v', '-s', '-q', '多线程.py', '--tests-per-worker=4']) 

执行结果:

Pytest-parallel遇到的问题:

问题1.

启动报错,

AttributeError:Can'tpickle local object

'pytest_addoption.<locals>.label_type.<locals>.a_label_type'

解决方法:

Windows只支持版本0.0.10,卸载,重新安装

Pip install Pytest-parallel==.0.0.10

pytest-parallel启动报错

python-pytest使用(4)-多线程多进程运行_pytest-xdist、pytest-parallel区别及命令介绍

Pytest-xdist:只支持多进程执行

问题1.

输出到控制台的日志中的中文为乱码,这个暂时无法解决;输出到文件文件中的中文写入正常;

问题2.

执行完成后,结合pytestreport,一个进程完成后,就会触发生成一个报告;其他进程也完成后,也会触发生成报告,导致跑一个用例集,会生成多个分散的报告;

原因:

pytestreport: 重写了钩子函数pytest_session_finish,这个函数,在一个会话结束后,就会触发生成报告;使用多进程,打开两个浏览器,一个浏览器结束,代表进程结束,session完成,就会触发

解决方法:

使用allure生成测试报告,allure会将所有测试结果收集,最后再生成;或者是用pytest-parallel,不过其它使用的方法,可能出现问题

posted on 2022-09-08 14:37  刚刚好1  阅读(2795)  评论(1编辑  收藏  举报

导航