如果想分布式执行用例,用例设计必须遵循以下原则:
(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("====退出登录!!!====")
网友评论