受到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'])
pytest test_multiRequest.py 串行执行的时间:
多进程执行,参考pytest-xdist官网。不支持多线程
常用参数配置:
-n=*:*代表进程数
多cpu并行执行用例,直接加个-n参数即可,后面num参数就是并行数量,比如num设置为3
-n auto 自动侦测系统里的CPU数目
-n num 指定运行测试的处理器进程数
使用pytest-xdist多进程执行
pytest test_multiRequest.py -n auto
常用参数配置:
--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