pytest多线程或多进程执行测试用例

2021-03-14  本文已影响0人  Chaweys

如果想分布式执行用例,用例设计必须遵循以下原则:
(1)、用例之间都是独立的,
(2)、用例a不要去依赖用例b,
(3)、用例执行没先后顺序,
(4)、随机都能执行每个用例都能独立运行成功每个用例都能重复运行,不影响其它用例。
这跟就我们平常多个人工测试一样,用例都是独立的,可以随机分配不同人员执行,互相不依赖,用例之间也不存在先后顺序。

1、pytest-parallel开启多线程执行测试用例
import pytest
def test_03(start,open_web1):
    print('测试用例3操作')
def test_04(start,open_web1):
    print('测试用例4操作')

if __name__ == "__main__":
    pytest.main(["-s", "test_1.py",'--workers=1', '--tests-per-worker=3'])

参数值配置:
--workers=n           多进程运行需要加此参数,n是进程数。默认为1  【注:在windows系统中只能为1】
--tests-per-worker=n  多线程运行需要加此参数,n是线程数。
如果两个参数都配置了,就是进程并行,每个进程最多n个线程,总线程数:进程数*线程数
pytest-parallel的workers参数在windows系统下永远是1,在linux和mac下可以取不同值。



2、pytest-xdist开启多进程执行测试用例
import pytest
def test_03(start,open_web1):
    print('测试用例3操作')
def test_04(start,open_web1):
    print('测试用例4操作')

if __name__ == "__main__":
    pytest.main(["-s", "test_1.py",'-n=2'])
    
参数值配置:
-n=2   表示开启2个CPU进程执行测试用例

#coding=utf-8
import pytest
import time

def testcase01():
    time.sleep(2)
    print('这里是testcase01')

def testcase02():
    time.sleep(3)
    print('这里是testcase02')

def testcase03():
    time.sleep(4)
    print('这里是testcase03')

def testcase04():
    time.sleep(5)
    print('这里是testcase04')


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



if __name__=="__main__":
    pytest.main(['-s',__file__])
============================= test session starts =============================
platform win32 -- Python 3.8.0, pytest-6.2.2, py-1.10.0, pluggy-0.13.1
rootdir: E:\ProjectStudy\HDCZU_Study\pytest框架测试
plugins: forked-1.3.0, parallel-0.1.0, xdist-2.2.1
collected 4 items

test_func2.py 这里是testcase01
.这里是testcase02
.这里是testcase03
.这里是testcase04
.
============================= 4 passed in 14.25s ==============================
结果得知:不开启进程,执行时间为14.25s



if __name__=="__main__":
    pytest.main(['-s',__file__,'-n=2'])
============================= test session starts =============================
platform win32 -- Python 3.8.0, pytest-6.2.2, py-1.10.0, pluggy-0.13.1
rootdir: E:\ProjectStudy\HDCZU_Study\pytest框架测试
plugins: forked-1.3.0, parallel-0.1.0, xdist-2.2.1
gw0 I / gw1 I
gw0 [4] / gw1 [4]

....
============================== 4 passed in 8.63s ==============================
结果得知:开启2个进程,执行时间为8.63s



if __name__=="__main__":
    pytest.main([__file__,'--workers=1','--tests-per-worker=4'])
============================= test session starts =============================
platform win32 -- Python 3.8.0, pytest-6.2.2, py-1.10.0, pluggy-0.13.1
rootdir: E:\ProjectStudy\HDCZU_Study\pytest框架测试
plugins: forked-1.3.0, parallel-0.0.10, xdist-2.2.1
collected 4 items
pytest-parallel: 1 worker (process), 4 tests per worker (threads)
.这里是testcase02
.这里是testcase03
.这里是testcase04
.
============================== 4 passed in 5.05s ==============================
结果得知:开启1个进程4个线程,执行时间为5.05s



问题:
pytest-parallel多线程报错INTERNALERROR
解决办法:
(1)回退版本0.0.10 
pip uninstall pytest-parallel   
pip install "pytest-parallel==0.0.10"
(2)在pycharm中指定项目为pytest项目

如何让scope=session的fixture在test session中仅仅执行一次
pytest-xdist是让每个worker进程执行属于自己的测试用例集下的所有测试用例
这意味着在不同进程中,不同的测试用例可能会调用同一个scope范围级别较高(例如session)的fixture,
该fixture则会被执行多次,这不符合scope=session的预期。

可以通过使用锁定文件进行进程间通信来实现。from filelock import FileLock

举例:
import pytest
from filelock import FileLock

@pytest.fixture(scope="session")
def login():
    print("登录,返回账号")
    with FileLock("session.lock"):
        name = "test01"
        token = "test01"
    yield name, token
    print("====退出登录!!!====")
上一篇 下一篇

猜你喜欢

热点阅读