Pytest系列(30)- 使用 pytest-xdist 分布式插件,如何保证 scope=session 的 fixture 在多进程运行情况下仍然能只运行一次

如果你还想从头学起Pytest,可以看看这个系列的文章哦!

https://www.cnblogs.com/poloyy/category/1690628.html

 

背景

使用 pytest-xdist 分布式插件可以加快运行,充分利用机器多核 CPU 的优势

将常用功能放到 fixture,可以提高复用性和维护性

做接口自动化测试的时候,通常我们会将登录接口放到 fixture 里面,并且 scope 会设置为 session,让他全局只运行一次

但是当使用 pytest-xdist 的时候,scope=session 的 fixture 无法保证只运行一次,官方也通报了这一问题

 

官方描述

pytest-xdist 的设计使每个工作进程将执行自己的测试集合并执行所有测试子集,这意味着在不同的测试过程中,要求高级范围的 fixture(如:session)将会被多次执行,这超出了预期,在某些情况下可能是不希望的

尽管 pytest-xdist 没有内置支持来确保  scope=session 的fixture 仅执行一次,但是可以通过使用锁定文件进行进程间通信来实现

 

前置知识

pytest-xdist 分布式插件使用详细教程可看

https://www.cnblogs.com/poloyy/p/12694861.html

 

分布式插件原理可看

https://www.cnblogs.com/poloyy/p/12703290.html

 

fixture 的使用详细教程

https://www.cnblogs.com/poloyy/p/12642602.html

官方文档

https://pypi.org/project/pytest-xdist/

 

官方解决办法(直接套用就行)

import json import pytest from filelock import FileLock @pytest.fixture(scope="session") def session_data(tmp_path_factory, worker_id): if worker_id == "master": # not executing in with multiple workers, just produce the data and let # pytest's fixture caching do its job return produce_expensive_data() # get the temp directory shared by all workers root_tmp_dir = tmp_path_factory.getbasetemp().parent fn = root_tmp_dir / "data.json" with FileLock(str(fn) + ".lock"): if fn.is_file(): data = json.loads(fn.read_text()) else: data = produce_expensive_data() fn.write_text(json.dumps(data)) return data

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wssppd.html