我写了两个模块,packageA和packageB。两者都有自己的一组测试,但 packageB 依赖于 packageA,所以我想在运行 packageB 时运行 packageA 的测试。
我可以pytest.main(['--pyargs' ,'package_A.tests.tests_A'])在 packageB 中使用,它似乎可以工作。然而,如果 中存在相互冲突的选项conftest.py,那么一切都会崩溃。
pytest.main(['--pyargs' ,'package_A.tests.tests_A'])
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 ===============================
=========================== short test summary info ===========================
ERROR - ValueError: option names {‘–any_option’} already added
!!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!!
============================== 1 error in 0.09s ===============================
问题出现在conftest.py中重复定义了相同的选项。在conftest.py中定义的选项在整个测试集中是全局的,当pytest.main()在 packageB 的测试中调用 packageA 的测试时,它们都试图向 pytest 添加相同的选项,从而导致冲突。
pytest.main()
为了解决这个问题,你可以将conftest.py中的选项定义改为局部定义。在 packageA 和 packageB 的各自conftest.py中只定义各自需要的选项,而不是在两个文件中都定义相同的选项。
具体做法是,将选项定义移动到各自的测试目录中的conftest.py,并删除--any_option选项的重复定义。
--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
这样,每个包的测试都可以使用自己的选项定义,而不会相互干扰,从而解决了选项冲突的问题。