一、官方方式
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
但是,如果想针对当前项目进行setup和teardown的处理,官方提供的方法仍会出现一些问题。
如:在所有进行都运行完成后,向数据库插入一条“本次测试已结束”的信息。
这里可以通过钩子函数解决上面的问题
二、钩子函数
1、setup
使用pytest_configure钩子函数
def pytest_configure(config): if not hasattr(config, 'workerinput'): log.info("--------------------自动化测试开始--------------------") log.info("----------开始创建mysql表----------") try: # 生成数据库表 mysql_create_table("test_table") except Exception as e: log.error("创建数据库失败,测试停止,以下是具体原因:") log.error(traceback.format_exc()) pytest.exit()
2、teardown
监测所有worker停止后,才会执行当前函数
def pytest_unconfigure(config): if not hasattr(config, 'workerinput'): log.info("--------------------自动化测试结束--------------------")
在钩子函数中,必须要判断进入当前函数的进程,防止worker进入到函数中,因为master是不执行用例的,不用干苦力,所以只要master进入到函数中,就代表是最开始或者所有worker完成任务之后了,就能达到我们想要的目的。
参考文档:https://blog.csdn.net/weixin_42918674/article/details/123877525
标签:log,teardown,setup,worker,xdist,pytest,data,fn,函数 From: https://www.cnblogs.com/gzwTestblog/p/16975563.html