在子文件夹中使用 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 将目录更改为它为每个测试执行的测试的文件夹?这样测试中的相对路径仍然有效吗?
还有其他通用的方法可以解决吗? (我不想将所有内容都更改为绝对路径或类似的东西,这也是一个例子,在现实生活中我有数百个测试)。
谢谢,
诺姆
好吧,我有点解决了,不确定这是不是最好的方法,但它确实有效:
在每个测试中:
- 我检查测试是从它的目录还是从
\Main\Tests
- 如果是从
\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
命令完全相同。
假设您需要 Main
在 sys.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.cfg
、pytest.ini
、tox.ini
或 pyroject.toml
文件。
我正在使用 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 将目录更改为它为每个测试执行的测试的文件夹?这样测试中的相对路径仍然有效吗?
还有其他通用的方法可以解决吗? (我不想将所有内容都更改为绝对路径或类似的东西,这也是一个例子,在现实生活中我有数百个测试)。
谢谢,
诺姆
好吧,我有点解决了,不确定这是不是最好的方法,但它确实有效:
在每个测试中:
- 我检查测试是从它的目录还是从
\Main\Tests
- 如果是从
\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
命令完全相同。
假设您需要 Main
在 sys.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.cfg
、pytest.ini
、tox.ini
或 pyroject.toml
文件。