首页 > 其他分享 >兼容xdist的setup、teardown方法

兼容xdist的setup、teardown方法

时间:2022-12-12 11:22:23浏览次数:59  
标签:log teardown setup worker xdist pytest data fn 函数

一、官方方式

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

相关文章