接口自动化测试并发执行
一、安装插件:
pip install pytest-xdist
pytest-xdist插件是进程级别的并发
二、使用插件:
该插件主要使用的是pytest执行时的命令行参数,所以要在pytest.ini中的addops中增加参数,指定并发进程个数
-n 2 :指定2个进程并发
-n auto:根据当前电脑cpu自动指定最大并发数


'''
addopts = -sv --alluredir report/data --clean-alluredir -n 2
'''
gw0和gw1是两个进程的名字或者说是ID
[gw0] PASSED test_003_member_address.py::TestAddAddressApi::test_add_address_exception[联系方式参数缺失-new_params4-500-{"code":"007","message":"系统发生异常,请联系管理员"}]
[gw1] PASSED test_003_member_address.py::TestAddAddressApi::test_add_address_exception[联系方式参数为None-new_params5-500-{"code":"007","message":"系统发生异常,请联系管理员"}]
三、 pytest-xdist用例分配的机制:
1.默认的分配机制:
是以测试用例为最小单位的,多个进程都会收集到所有用例,都会判断这个用例是否已经被分配或者被标识,如果没有,就执行,如果已分配,则继续判断下一条;但是这种默认分配的机制在遇到依赖的场景时,例如购买时必须依赖于登录,而登录的用例被分配到进程gw0,但购买在gw1,就会依赖不到,所以不能使用默认分配
2.指定分配机制:
对于pytest-xdist来说,有一个参数--dist,可以指定多进程并发时测试用例的分配维度,如果用例之间存在关联,但是他们没有被分配到同一个进程中,则会执行失败;因此需要在设计用例时,将有关联的用例放在同一个文件里,并且将分配机制改成按照测试文件去分配,此时将参数 --dist指定程loadfile:--dist=loadfile
--dist还可以指定为each,表示每个进程都执行所有用例,可以用在同时执行多个环境中的自动化
四、多进程并发的问题处理
1.多进程并发可能会造成业务或者数据上的冲突,比如你的项目,同一个用户不能同时登录,那么多进程并发就可能造成登录失败(会顶掉),a进程取消订单,b进程又去用订单创建支付单,就会造成支付失败,a进程取消订单,b进程又给订单发货等,就会造成业务冲突
解决方案:让不同的进程使用不同的用户
如何使用不同的用户进行用户隔离?
首先需要区分不同的进程:可以通过pytest-xdist提供的进程名字或者id来区分进程,实际上pytest-xdist提供了一个fixture叫做work_id,会返回当前的进程id或者名称,因此可以用它来得到当前进程ID,例如区分登录用户,在conftest文件中修改对应的函数:

@pytest.fixture(scope='session',autouse=True) def buyer_login(worker_id): #这个worker_id是插件带来的,需要安装pytest-xdist #如果没有使用多进程并发,那么worker_id是master if worker_id == 'gw0' or worker_id == 'master': resp = BuyerLoginApi(username='mrzhou',password='e10adc3949ba59abbe56e057f20f883e').send() elif worker_id == 'gw1': resp = BuyerLoginApi(username='mrzhou123',password='e10adc3949ba59abbe56e057f20f883e').send() BaseBuyerApi.buyer_token = resp.json()['access_token'] BaseBuyerApi.uid = resp.json()['uid']

浙公网安备 33010602011771号