conftest
解决方案
conftest.py
侵入性最小的解决方案是在目录中添加一个名为的空文件repo/
:
$ touch repo/conftest.py
就是这样。无需编写自定义代码来修改sys.path
或记住拖动PYTHONPATH
,或放入__init__.py
不属于它的目录中(尽管按照Apteryx的答案python -m pytest
中的建议使用是一个很好的解决方案!)。
之后的项目目录:
repo
├── conftest.py
├── app.py
├── settings.py
├── models.py
└── tests
└── test_app.py
解释
pytest
在测试集合上查找conftest
模块以收集自定义钩子和固定装置,并且为了从中导入自定义对象,pytest
将 的父目录添加conftest.py
到sys.path
(在本例中为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
):
repo
├── src
│ ├── conftest.py
│ ├── spam
│ │ ├── __init__.py
│ │ ├── bacon.py
│ │ └── egg.py
│ └── eggs
│ ├── __init__.py
│ └── sausage.py
└── tests
├── test_bacon.py
└── test_egg.py
请注意,添加src
to 会PYTHONPATH
减轻src
布局的意义和好处!您最终将测试来自存储库的代码,而不是已安装的包。如果你需要这样做,也许你根本不需要src
目录。
从这往哪儿走
当然,conftest
模块不仅仅是帮助源代码发现的一些文件;它是框架的所有特定于项目的增强pytest
和测试套件的定制发生的地方。pytest
有很多关于conftest
分散在他们文档中的模块的信息;从conftest.py
:本地每个目录插件开始
此外,SO 对conftest
模块有一个很好的问题:在 py.test 中,conftest.py 文件有什么用?