将 pytest 固定装置放在一个位置并跨子模块使用它们

Cur*_*tLH 3 python unit-testing fixtures pytest

我正在构建一个 python 包,pytest用于所有单元测试。我的包由几个模块组成,每个模块下都有各种子模块。单元测试位于test每个模块的文件夹中(例如,./tumble/tumble/math/test/test_multiply.py./tumble/tumble/science/test/test_divide.py

我有一些装置想要在所有模块和子模块中共享。因此,./tumble/tumble/test在本例中,我希望将它们放置在一个中心位置,并且每个子模块(math/testscience/test)中都没有重复的装置。

如果我放置在每个子模块conftest.pytest文件夹中,一切都会按预期工作。但是,我在两个位置使用相同的灯具,这并不理想。

当我将我的装置放在一个中心位置时,我可以在使用命令时看到它们pytest --fixtures,但是,当我运行时pytest,它告诉我fixture not found并且该装置没有在available fixtures.

我是否需要将所有单元测试移动到test文件夹下,或者我可以做些什么来将单元测试保留在子模块中,但固定装置位于中心位置?

tumble
+-- setup.py
+-- README.md
+-- tumble
|   +-- math
|   |   +-- __init__.py
|   |   +-- multiply.py
|   |   +-- test
|   |   +-- __init__.py
|   |   |   +-- test
|   |   |   |   +-- __init__.py
|   |   |   |   +-- test_multiply.py
|   +-- science
|   |   +-- __init__.py
|   |   +-- divide.py
|   |   +-- test
|   |   +-- __init__.py
|   |   |   +-- test
|   |   |   |   +-- __init__.py
|   |   |   |   +-- test_divide.py
|   +-- test
|   |   +-- __init__.py
|   |   +-- conftest.py
Run Code Online (Sandbox Code Playgroud)

乘法.py

def multipy(x, y):
    return x * y
Run Code Online (Sandbox Code Playgroud)

conftest.py

import pytest

@pytest.fixture()
def numbers():
    return (1, 5, 10)
Run Code Online (Sandbox Code Playgroud)

test_multiply.py

import tumble
import pytest

assert tumble.multiply(numbers[0], numbers[1]) == 5   
Run Code Online (Sandbox Code Playgroud)

Avi*_*hen 6

来自pytest doc关于 pytest 中的插件

本地 conftest.py 插件包含特定于目录的钩子实现。钩子会话和测试运行活动将调用 conftest.py 文件中定义的所有钩子,更靠近文件系统的根目录

因此,为了让您的测试了解夹具,它应该在层次结构中更高。即把你的共享装置放在根文件夹下,/tumble/conftest.py