pytest>=7的推荐方法:使用pythonpath设置
最近,pytest增加了一个新的核心插件,该插件支持sys。通过pythonpath配置值修改路径。因此,现在的解决方案要简单得多,不再需要任何变通:
pyproject。toml例子:
[tool.pytest.ini_options]
pythonpath = [
"."
]
pytest.ini例子:
[pytest]
pythonpath = .
路径条目是相对于根目录计算的,因此。将repo目录添加到sys。路径。
多个路径条目也被允许:对于一个布局
repo/
├── src/
| └── lib.py
├── app.py
└── tests
├── test_app.py
└── test_lib.py
配置
[tool.pytest.ini_options]
pythonpath = [
".", "src",
]
or
[pytest]
pythonpath = . src
将app和lib模块都添加到sys。路径,所以
import app
import lib
都可以。
原始答案(不建议用于最新的pytest版本;仅用于pytest<7): conftest解决方案
侵入性最小的解决方案是在repo/目录中添加一个名为conftest.py的空文件:
$ touch repo/conftest.py
就是这样。不需要编写自定义代码来破坏系统。path,或者记得拖拽PYTHONPATH,或者把__init__.py放到不属于它的dirs中(在Apteryx的回答中建议使用python -m pytest是一个很好的解决方案!)
之后的项目目录:
repo
├── conftest.py
├── app.py
├── settings.py
├── models.py
└── tests
└── test_app.py
解释
Pytest在测试集合中寻找conftest模块来收集自定义钩子和fixture,为了从它们导入自定义对象,Pytest将conftest.py的父目录添加到sys. py目录中。路径(在本例中为repo目录)。
其他项目结构
如果你有其他的项目结构,将conftest.py放在包的根目录下(包含包但本身不是包,所以不包含__init__.py),例如:
repo
├── conftest.py
├── spam
│ ├── __init__.py
│ ├── bacon.py
│ └── egg.py
├── eggs
│ ├── __init__.py
│ └── sausage.py
└── tests
├── test_bacon.py
└── test_egg.py
src布局
虽然这种方法可以用于src布局(将conftest.py放在src dir中):
repo
├── src
│ ├── conftest.py
│ ├── spam
│ │ ├── __init__.py
│ │ ├── bacon.py
│ │ └── egg.py
│ └── eggs
│ ├── __init__.py
│ └── sausage.py
└── tests
├── test_bacon.py
└── test_egg.py
注意,将src添加到PYTHONPATH会降低src布局的意义和好处!您最终将测试来自存储库的代码,而不是安装的包。如果你需要这样做,也许你根本不需要src目录。
从这里往哪里走
当然,conftest模块不仅仅是一些帮助发现源代码的文件;pytest框架的所有特定于项目的增强和测试套件的定制都发生在这里。Pytest有很多关于conftest模块的信息,分散在它们的文档中;从conftest.py开始:本地每个目录的插件
另外,SO有一个关于conftest模块的很好的问题:在py中。测试,conftest。py文件有什么用?