pytest使用(4)-多线程多进程

受到Python GIL解释器的问题影响,Python不能像java一样实现多线程的运行,但是利用一些IO技术依然可以实现类“多线程”并发请求。pytest中,可以利用包pytest-xdist多进程和pytest-parallel 的多进程+多线程事项并发请求。

安装

pip install pytest-xdist  
pip install pytest-parallel

应用场景介绍:
比如测试云计算中的虚拟机,常常需要caseA创建一台ECS,等待其达到running状态,执行一些操作actionA,caseB创建一台ECS,等待其达到running状态,执行一些操作actionB,如果是串行执行,每次只能在caseA中等待的时间什么也不做,白白的浪费时间。因此这段时间完全可以执行caseB.

串行执行

import pytest
from time import sleep

def test_01():
    sleep(1)
    print('测试用例1操作')

def test_02():
    sleep(2)
    print('测试用例2操作')

def test_03():
    sleep(3)
    print('测试用例3操作')

def test_04():
    sleep(4)
    print('测试用例4操作')

if __name__ == "__main__":
    pytest.main(['-n',__file__,'auto'])

当前windows操作系统为4核
pytest使用(4)-多线程多进程_第1张图片

pytest test_multiRequest.py 串行执行的时间:
pytest使用(4)-多线程多进程_第2张图片

pytest-xdist多进程

多进程执行,参考pytest-xdist官网。不支持多线程

常用参数配置:
  -n=**代表进程数
多cpu并行执行用例,直接加个-n参数即可,后面num参数就是并行数量,比如num设置为3
-n auto 自动侦测系统里的CPU数目
-n num 指定运行测试的处理器进程数

使用pytest-xdist多进程执行

pytest test_multiRequest.py -n auto

pytest使用(4)-多线程多进程_第3张图片

pytest-parallel多进程+多线程

常用参数配置:
  --workers=n:多进程运行需要加此参数, n是进程数。默认为1
  --tests-per-worker=n:多线程需要添加此参数,n是线程数
  如果两个参数都配置了,就是进程并行,每个进程最多n个线程,总线程数:进程数*线程数
注意:pytest-parallel支持python3.6及以上版本,如果是想做多进程并发的需要在linux平台或mac上做,windows上不起作用即(workers永远=1),如果是做多线程的Linux/Mac/Windows平台都支持,进程数为workers设置的值。

参考pytest-parallel官网

if __name__ == '__main__':
    pytest.main(['-s', __file__,'--workers=1','--tests-per-worker=4'])  

特别注意

1、pytest-parallel的workers参数在windows系统下永远是1,在linux和mac下可以取不同值。
2、pytest-parallel加了多线程处理后,最后执行时间是运行时间最长的线程的时间。
3、在windows下想用多进程的选pytst-xdist; 想用多线程的选pytest-parallel

你可能感兴趣的:(pytest,python)