首页 > 编程问答 >对于 pytest,如何为每个模块生成和加载字典

对于 pytest,如何为每个模块生成和加载字典

时间:2024-09-24 21:41:21浏览次数:9  
标签:python unit-testing pytest

我需要一种方法来生成一个字典,其中包含给定目录中每个 pytest 模块/文件的唯一路径。在运行任何测试来定义文件路径之前,它需要可访问:

TEST_DIRS = {}

path1 = TEST_DIRS['path']
path2 = TEST_DIRS['input']

def test_something():
    target = path1 / 'input_file'
    ....
def test_another_thing():
    ....

还应该有像conftest这样的目录配置文件来执行每个模块所需的生成操作。生成器将根据测试名称创建目录。

我尝试使用 conftest.py 文件和 pytest_collection_modify_items 但它仍然使 TEST_DIRS 仅在测试函数内部而不是在它们之前工作。

def pytest_collection_modifyitems(items):
    timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
    for item in items:
        module_name = item.module.__name__
        test_paths = {
            key: value.format(test_name=module_name, timestamp=timestamp)
            for key, value in BASE_TEST_DIRS.items()
        }
        test_paths = {
            key: home / Path(value)
            for key, value in test_paths.items()
        }
    
        for key, path in test_paths.items():
            if key.startswith('output'):
                if not os.path.exists(path):
                    os.makedirs(path)

        item.module.TEST_DIRS = test_paths
   

可以通过多种方式使用 pytest 为每个模块生成和加载字典。以下是两种方法:

方法 1:使用 pytest Fixtures

这种方法使用 pytest fixtures 来生成字典并将其作为参数传递给测试函数。这种方法的好处是它更明确,并且更容易理解每个测试函数中发生了什么。

import pytest
from pathlib import Path

BASE_TEST_DIRS = {
    "path": "tests/{test_name}/path",
    "input": "tests/{test_name}/input",
}

@pytest.fixture(scope="module")
def test_dirs(request):
    """为每个测试模块生成一个唯一的测试目录字典."""
    module_name = request.module.__name__
    test_paths = {
        key: value.format(test_name=module_name)
        for key, value in BASE_TEST_DIRS.items()
    }
    test_paths = {
        key: Path(value)
        for key, value in test_paths.items()
    }
    for key, path in test_paths.items():
        if key.startswith('output'):
            path.mkdir(parents=True, exist_ok=True)
    return test_paths

def test_something(test_dirs):
    target = test_dirs['path'] / 'input_file'
    # ... your test logic here ...

def test_another_thing(test_dirs):
    # ... your test logic here ...

方法 2:使用 pytest hooks 和 monkeypatch

这种方法使用 pytest hooks 在测试收集阶段修改模块的全局命名空间。 虽然这种方法更隐蔽,但它可能更难调试。

# conftest.py

from pathlib import Path

BASE_TEST_DIRS = {
    "path": "tests/{test_name}/path",
    "input": "tests/{test_name}/input",
}

def pytest_collection_modifyitems(items):
    """为每个测试模块生成一个唯一的测试目录字典."""
    for item in items:
        module_name = item.module.__name__
        test_paths = {
            key: value.format(test_name=module_name)
            for key, value in BASE_TEST_DIRS.items()
        }
        test_paths = {
            key: Path(value)
            for key, value in test_paths.items()
        }
        for key, path in test_paths.items():
            if key.startswith('output'):
                path.mkdir(parents=True, exist_ok=True)
        # 使用 monkeypatch 将字典添加到模块的全局命名空间中
        monkeypatch.setattr(item.module, "TEST_DIRS", test_paths)

# test_module.py

def test_something():
    target = TEST_DIRS['path'] / 'input_file'
    # ... your test logic here ...

def test_another_thing():
    # ... your test logic here ...

这两种方法都将为每个测试模块生成一个唯一的 TEST_DIRS 字典。 选择最适合的项目结构和编码风格的方法。

标签:python,unit-testing,pytest
From: 79018906

相关文章

  • 头歌实践教学平台 Python程序设计 实训答案(三)
    第七阶段文件实验一文本文件的读取第1关:学习-Python文件之文本文件的读取任务描述本关任务:使用open函数以只写的方式打开文件,打印文件的打开方式。相关知识为了完成本关任务,你需要掌握:文本文件;open函数及其参数;文件打开模式;文件对象常用属性;关闭文件close......
  • python如何实现日期加减
    首先通过importdatetime,导入日期处理库。然后把日期转化成datetime标准格式,使用datetime.datetime.strptime()方法将字符串格式的时间转化为标准格式。其中"%Y/%m/%d%H:%M:%S"为time字符串的时间格式:Y为年,m为月,d为天,H为小时,M为分钟,S为秒。如果我们要加的时间是天......
  • Python实现图形学光照和着色的Gouraud着色算法
    目录使用Python实现图形学光照和着色的Gouraud着色算法引言1.Gouraud着色算法概述1.1算法原理2.Python实现Gouraud着色算法2.1向量类2.2光源类2.3材质类2.4Gouraud着色器类2.5使用示例3.实例分析4.Gouraud着色算法的优缺点4.1优点4.2缺点5.改进方向6.应......
  • Python实现Phong着色模型算法
    目录使用Python实现Phong着色模型算法引言Phong着色模型的基本原理1.模型组成2.公式Phong着色模型的Python实现1.向量类的实现2.光源类的实现3.材质类的实现4.Phong着色器类的实现整体实现总结使用Python实现Phong着色模型算法引言在计算机图形学中,光照和......
  • 头歌实践教学平台 Python程序设计实训答案(二)
    第四阶段组合数据类型实验一列表的基本操作第1关:列表增删改:客人名单的变化任务描述列表是由按一定顺序排列的元素组成,其中的元素根据需要可能会发生变化。其中,列表元素的添加、删除或修改等是最常见的操作。下面以一则请客的故事来说明列表元素操作的应用场景。有个人邀......
  • 使用pytest和allure框架的登录测试类
    使用pytest和allure-pytest进行登录测试是一种有效的测试方式,能够结合自动化测试框架与轻量级轻量级的灵活轻量级轻量级测试报告工具。下面我将给出一个基本的示例,展示如何为登录功能编写一个测试类,并使用pytest和allure-pytest来运行和生成报告。步骤1:安装必要的库首先,确......
  • 1、A+B(python语法格式,模块,主模块等)
    总结:python有许多模块,通过import引入模块,或者使用from从模块导入函数#导入math模块importmath#使用模块中的定义的变量或者函数的语法格式为:模块.变量/函数print(math.sqrt(25))#使用math模块中的sqrt函数,表示开平方根#从math模块中导入sqrtfrommathimpor......
  • 【Python学习笔记】字符串
    目录1.定义字符串2.基本操作2.1索引:2.2访问单个字符:2.3访问范围内字符:2.4单个字符编码3.转义符4.运算符5.格式化6.常用字符串函数6.1查找类函数6.2分割类函数6.3字符串连接方法6.4大小写字符转换方法6.5替换方法6.6删除字符串两端、右端或左端连续空白字符......
  • vscode 远程 切换python 虚拟环境
    在VSCode中远程切换Python虚拟环境是一个涉及多个步骤的过程,包括安装必要的扩展、连接到远程服务器、创建或激活虚拟环境,并在VSCode中选择相应的Python解释器。以下是一个详细的步骤指南,包括代码示例,旨在帮助我们完成这一过程。1.Vscode远程切换Python虚拟环境的步骤1.1步骤1:......
  • 常见算法——自相关的含义及Python、C实现
    常见算法——自相关的含义及C实现一、概念1.自相关概念2.滞后期示例说明:二、自相关的计算步骤:1.确定滞后期(Lag):2.计算平均值:3.计算自相关:三、示例Python自相关计算1.代码2.运行结果四、C语言实现自相关算法1.代码2.运行结果:3.优化4.检测规律波动一、概念1.自相关......