小能豆

使用 pytest 运行另一个模块的测试

python

我写了两个模块,packageA和packageB。两者都有自己的一组测试,但 packageB 依赖于 packageA,所以我想在运行 packageB 时运行 packageA 的测试。

我可以pytest.main(['--pyargs' ,'package_A.tests.tests_A'])在 packageB 中使用,它似乎可以工作。然而,如果 中存在相互冲突的选项conftest.py,那么一切都会崩溃。

有解决办法吗?

这是一个(非)工作示例:

我的文件夹结构:

- python path
   - packageA
      - tests
         - tests_A.py
         - conftest.py
   - packageB
      - tests
         - tests_B.py
         - conftest.py

两个文件夹中的conftest.py是相同的:

def pytest_addoption(parser):
    parser.addoption(
        "--any_option", action="store_true", default=False
    )

test_A.py包含一个失败的测试(只是为了确保它运行):

def test_package_A():

    assert False

tests_B.py调用 package_A 中的测试:

import pytest
pytest.main(['--pyargs' ,'package_A.tests.tests_A'])

但 pytest 不喜欢覆盖选项:

=========================== short test summary info ===========================

ERROR - ValueError: option names {‘–any_option’} already added

!!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!!

============================== 1 error in 0.09s ===============================


阅读 144

收藏
2023-07-23

共1个答案

小能豆

问题出现在conftest.py中重复定义了相同的选项。在conftest.py中定义的选项在整个测试集中是全局的,当pytest.main()在 packageB 的测试中调用 packageA 的测试时,它们都试图向 pytest 添加相同的选项,从而导致冲突。

为了解决这个问题,你可以将conftest.py中的选项定义改为局部定义。在 packageA 和 packageB 的各自conftest.py中只定义各自需要的选项,而不是在两个文件中都定义相同的选项。

具体做法是,将选项定义移动到各自的测试目录中的conftest.py,并删除--any_option选项的重复定义。

以下是如何修改文件:

packageA/tests/conftest.py

# packageA/tests/conftest.py
def pytest_addoption(parser):
    parser.addoption(
        "--packageA_option", action="store_true", default=False
    )

packageA/tests/tests_A.py

# packageA/tests/tests_A.py
def test_package_A():
    assert False

packageB/tests/conftest.py

# packageB/tests/conftest.py
def pytest_addoption(parser):
    parser.addoption(
        "--packageB_option", action="store_true", default=False
    )

packageB/tests/tests_B.py

# packageB/tests/tests_B.py
import pytest

# Run packageA tests
pytest.main(['--pyargs', 'packageA.tests.tests_A'])

def test_package_B():
    assert True

这样,每个包的测试都可以使用自己的选项定义,而不会相互干扰,从而解决了选项冲突的问题。

2023-07-23