将pytest工作目录更改为测试用例目录

2024-04-23 06:52:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下pytest目录结构:

system_tests/
  ├── conftest
  ├── pytest.ini
  │
  ├── suite_1/
  │    └── test_A.py
  │   
  └── suite_2/
       └── sub_suite_2a/
            └── test_B.py

当每个测试方法运行时,许多第三方库/进程在当前工作目录中生成工件

  • 当从sub_suite文件夹(使用CLI或IDE“播放”按钮)执行pytest时,文件将在sub_suite文件夹中生成,我希望它们位于该文件夹中
  • 但是,当从system_tests文件夹运行pytest以运行所有测试时,所有工件都在system_tests文件夹中创建,这不是我想要的

有没有一种简单的方法可以强制pytest始终使用test class文件夹作为工作目录,这样无论运行测试的位置如何,我都可以得到相同的结果


Tags: pytest目录文件夹cli进程pytesttests
3条回答

要实现这一点,您有很多选择。这里有一些

一,。 编写pytest fixture以检查当前工作目录是否等于所需的工作目录,如果不等于,则将所有工件文件移动到所需的目录如果您生成的工件都是相同类型的文件(例如.*.jpg、*.png、*.gif),并且您只希望它们位于不同的目录中,那么这就足够了。类似的方法可以工作

from pathlib import Path
import shutil

@pytest.fixture
def cleanup_artifacts():
    yield None
    cwd = Path.cwd()
    desired_dir = Path.home() / 'system-tests' / 'suite-2' / 'sub_suite_2a'
    if cwd != desired_dir:
        for f in cwd.glob('*.jpg'):
            shutil.move(f, desired_dir)

然后,您可以根据需要将该装置添加到测试中

二,。 您可以将pytest rootdir配置为所需的目录,因为pytest使用rootdir来存储特定于项目/测试运行的信息

当您运行pytest时,将其作为

pytest  rootdir=desired_path

有关更多信息,请参见此处:https://docs.pytest.org/en/latest/customize.html#initialization-determining-rootdir-and-inifile

如果两者都不适用于您,请详细说明您的需求。当然,这可以通过pytest实现

一种不同的、更健壮的方法:始终按完整路径引用文件

__file__是一个自动声明的Python变量,它是当前模块的名称。因此,在test_B.py文件中,它的值为:system_tests/suite_2/sub_suite_2a/test_B.py。只需找到父对象并选择文件的写入位置

from pathlib import Path
test_data_dir = Path(__file__).parent / "test_data"

现在,您将它们都放在同一个位置,并且可以告诉您的版本控制系统忽略它们

如果代码在库中,请确保可以使用此选项更改当前目录:

import os
from pathlib import Path
test_data_dir = Path(__file__).parent / "test_data"
os.chdir(test_data_dir)

以下函数级fixture将更改为测试用例目录,运行测试(yield),然后更改回调用目录以避免副作用,如@hi2meuk所建议的:

@pytest.fixture(scope="function")
def change_test_dir(request):
    os.chdir(request.fspath.dirname)
    yield
    os.chdir(request.config.invocation_dir)
  • request是一个内置的pytest夹具
  • fspath是正在执行的测试模块的LocalPath
  • dirname是测试模块的目录
  • request.config.invocationdir-执行pytest的文件夹
  • request.config.rootdir-pytest root,不会根据运行pytest的位置而改变。此处未使用,但可能有用

任何由测试启动的进程都将使用测试用例文件夹作为它们的工作目录,并将它们的日志、输出等复制到那里,而不管测试套件是在哪里执行的

相关问题 更多 >