在子文件夹中使用 pytest where test

Using pytest where test in subfolder

我正在使用 python pytest 来 运行 我的单元测试。 我的项目文件夹是:

Main - 包含数据文件:A.txt

Main\Tests - 我从中 运行 pytest

的文件夹

Main\Tests\A_test - 包含测试文件的文件夹

A_test 文件夹中的测试使用文件 A.txt(位于 Main 文件夹中)。

我的问题是当我 运行 py.test 时测试失败,因为它找不到 A.txt.

我发现是因为pytest在运行测试时使用了路径Main\Test,而不是将路径改为Main\Tests\A_test(我在打开时使用的是相对路径A.txt 在测试文件中)

我的问题:有没有办法让 pytest 将目录更改为它为每个测试执行的测试的文件夹?这样测试中的相对路径仍然有效吗?

还有其他通用的方法可以解决吗? (我不想将所有内容都更改为绝对路径或类似的东西,这也是一个例子,在现实生活中我有数百个测试)。

谢谢,

诺姆

好吧,我有点解决了,不确定这是不是最好的方法,但它确实有效:

在每个测试中:

  1. 我检查测试是从它的目录还是从 \Main\Tests
  2. 如果是从\Main\Tests执行,那么我chdir\Main\Tests\A_test

我是按照def setUpClass方法做的。

例如:

@classmethod
def setUpClass(cls):
    if (os.path.exists(os.path.join(os.curdir, "A_test"))):
        os.chdir("A_test")

无论是从 Tests 文件夹(使用 pytest)还是从 A_test 文件夹(通过 pycharm)执行,这都会使测试通过

选项 A — 最小解

在项目的根目录下,创建一个名为 tests.py 的文件,其中包含以下内容

import os, pathlib
import pytest

os.chdir( pathlib.Path.cwd() / 'Tests' )

pytest.main()

然后您可以使用命令 python tests.py 来 运行 测试。




选项 B — batch/bash 测试 运行ners

对于那些更喜欢使用 batch/bash 而不是 运行 脚本的人,我们可以在 batch/bash 中更改目录,然后调用 Python 脚本 运行是 pytest 框架。为此,请在项目文件夹中创建以下脚本。

test.bat(对于Windows)

@echo off

cd /d %~dp0Tests
python %~dp0Tests/runner.py %*
cd /d %~dp0

test.sh(对于Linux)

cd $PWD/Tests
python runner.py $@
cd $PWD

然后在 Tests 文件夹中,创建一个名为 runner.py 的文件,其中包含以下内容

import pathlib, sys
import pytest

cwd = pathlib.Path.cwd()

# Add the project's root directory to the system path
sys.path.append(str( cwd.parent ))

# This is optional, but you can add a lib directory 
# To the system path for tests to be able to use
sys.path.append(str( cwd / 'lib' ))

pytest.main()

如果您的目录结构在您的测试文件夹中包含某种类型的 lib 文件夹,我们可以通过使用以下内容创建 pytest.ini 配置文件来指示 pytest 忽略它.

[pytest]
norecursedirs = lib

在这种情况下,您的 directory/file 结构最终会是:

root
├── test.bat
├── test.sh
├── Main
└── Tests
    ├── runner.py
    ├── pytest.ini # Optional pytest config file
    ├── lib # Optional, contains helper modules for the tests
    ├── tests # Tests go here
    └── # Or, in the OPs case, you could also place all of your tests here




其他评论

上述方法不是 运行ning pytest 的典型方法,但我更喜欢使用 pytest.main(),因为它允许我们:

  • 有任何目录结构。
  • 在测试 运行ner 开始之前执行代码。
  • 并且您仍然可以传递命令行选项,它的行为与直接 运行 宁 pytest 命令完全相同。

假设您需要 Mainsys.path.

您当前的目录是 Main/:

$python -m pytest Tests/A_test

这会将 Main 附加到 A_test 子目录中的 sys.path 和 运行 测试。 更多关于 pythonpath 和 pytest 关系的信息:http://doc.pytest.org/en/latest/pythonpath.html#pythonpath

__init__.py 添加到测试包中对我有用。之后执行所有测试。

我认为“最真实”的答案(可能取决于意见)来自 pytest docs 他们自己:testpaths 配置选项可以在 setup.cfgpytest.initox.inipyroject.toml 文件。