当conftest.py不在主测试目录中时,conftest.py中的pytest_sessionstart不会运行

Cra*_*mer 7 python pytest

我的项目结构:

cool_project/
   tests/
      cool_dir/
         test_cool.py
         conftest.py

      test_main.py
Run Code Online (Sandbox Code Playgroud)

我正在使用 pytest 版本 6.2.1 和 python 3.8.7。我有一个conftest.py,包含pytest_sessionstart。如果conftest.py 不在我的测试目录(即tests 目录)的根目录中,则 pytest_sessionstart 将不会运行(例如,如果它位于tests/cool_dir 中)。但是,如果我将 conftest.py 移动到主目录(即测试),那么它就可以工作。那么,当 conftest.py 不在测试目录中时,如何使 pytest_sessionstart 运行?我目前有代码:tests/cool_dir/conftest.py

print("CONFTEST ENTERED")

def pytest_sessionstart(session):
    print("pytest_sessionstart has been called")
Run Code Online (Sandbox Code Playgroud)

测试/cool_dir/test_cool.py

def test_bar():
    assert True
Run Code Online (Sandbox Code Playgroud)

测试/test_main.py

def test_foo():
    assert True
Run Code Online (Sandbox Code Playgroud)

“CONFTEST ENTERED”是我运行时唯一显示的内容pytest -s

您可以在我的repl.it repl上测试代码 。

Cra*_*Neb 1

我在遇到同样的问题后发现了你的问题:我的conftest.py文件同时包含一个pytest_sessionstart钩子和一个pytest_sessionfinish钩子——当我运行它时,似乎只有完成钩子被调用。

然后,我在虚拟环境下的实际 Pytest 源文件中放置了几对语句import pdb; pdb.set_trace()——一对在调用“start”挂钩之前,一对在调用“finish”挂钩之前。

我发现,当调用“start”挂钩时:我的conftest定义的挂钩尚未处理/加载。但后来,当调用“finish”钩子时,我的conftest定义的钩子加载、找到并调用。

仔细查看文档,应该在收集之前调用“start”挂钩。

我不知道 Pytest 的内部结构 - 但看到之后,我的猜测是......

  • 如果您的 conftest 文件恰好位于启动它的当前目录中,则 Pytest 在收集之前会加载它。

  • 但是,如果您的conftest位于子文件夹的更深处,那么直到发生收集时才找到它,因此永远不会在“开始”挂钩时间调用。