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
请注意,添加srcto 会PYTHONPATH减轻src布局的意义和好处!您最终将测试来自存储库的代码,而不是已安装的包。如果你需要这样做,也许你根本不需要src目录。
从这往哪儿走
当然,conftest模块不仅仅是帮助源代码发现的一些文件;它是框架的所有特定于项目的增强pytest和测试套件的定制发生的地方。pytest有很多关于conftest分散在他们文档中的模块的信息;从conftest.py:本地每个目录插件开始
此外,SO 对conftest模块有一个很好的问题:在 py.test 中,conftest.py 文件有什么用?