我正在使用python pytest来运行我的单元测试。 我的项目文件夹是:
Main
- 包含数据文件:A.txt
Main\Tests
- 我运行pytest的文件夹
Main\Tests\A_test
- 包含测试文件的文件夹
A_test文件夹中的测试使用文件A.txt
(位于主文件夹中)。
我的问题是,当我运行py.test时,测试失败,因为找不到A.txt
。
我发现这是因为pytest在运行测试时使用路径Main\Test
而不是将路径更改为Main\Tests\A_test
(我在打开A.txt
时使用相对路径测试文件)
我的问题:有没有办法让pytest更改目录到它为每个测试执行的测试文件夹?那么测试中的相对路径仍然可以工作?
还有其他一些通用的解决方法吗? (我不想把所有东西都改成绝对路径或类似的东西,这也是一个例子,在现实生活中我有几百个测试)。
谢谢,
诺姆
答案 0 :(得分:5)
在项目的根目录下,创建一个名为 tests.py 的文件
jquery(*, someJqueryElementName).not([(@dataType='optgroup')]);
然后您可以使用命令jquery(*, someJqueryElementName).not([(dataType='optgroup')]);
来运行测试。
对于那些喜欢使用批处理/ bash运行脚本的人,我们可以更改批处理/ bash中的目录,然后调用运行pytest框架的Python脚本。为此,请在项目文件夹中创建以下脚本。
test.bat (对于Windows)
import os, pathlib
import pytest
os.chdir( pathlib.Path.cwd() / 'Tests' )
pytest.main()
test.sh (对于Linux)
python tests.py
然后在Tests文件夹中,使用以下内容创建一个名为 runner.py 的文件
@echo off
cd /d %~dp0Tests
python %~dp0Tests/runner.py %*
cd /d %~dp0
如果您的目录结构在Tests文件夹中包含某种类型的lib文件夹,我们可以通过创建带有以下内容的 pytest.ini 配置文件来指示pytest忽略它。
cd $PWD/Tests
python runner.py $@
cd $PWD
在这种情况下,您的目录/文件结构最终将是:
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()
这不是运行pytest的典型方法,但是我更喜欢使用[pytest]
norecursedirs = lib
,因为这个小技巧使我们能够:
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
命令的行为完全相同。答案 1 :(得分:2)
将__init__.py
添加到测试包中对我有用。所有测试都在之后执行。
答案 2 :(得分:1)
嗯,我有点解决了它,不确定它是最好的方法,但它正在发挥作用:
在每个测试中:
\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)执行测试都会使测试通过
答案 3 :(得分:0)
假设您需要在Main
中使用根sys.path
。
提供当前目录为Main/
:
$python -m pytest Tests/A_test
这会将Main
附加到sys.path
并在A_test
子目录中运行测试。
有关pythonpath和pytest关系的更多信息,请点击此处:http://doc.pytest.org/en/latest/pythonpath.html#pythonpath
答案 4 :(得分:0)
我认为“最真实”的答案(可能取决于意见)来自 pytest docs 自己:testpaths
配置选项可以在 setup.cfg
、pytest.ini
、tox.ini
或 pyroject.toml
文件。