gpt4 book ai didi

python - 在另一个 Python 包中运行 pytest 测试

转载 作者:行者123 更新时间:2023-11-28 17:43:40 25 4
gpt4 key购买 nike

现在,我有一个 Python 包(我们称它为 mypackage),其中包含我使用 pytest 运行的一系列测试。一个特定的功能可以有多种可能的实现,因此我使用 funcarg 机制通过引用实现来运行这些测试。

# In mypackage/tests/conftest.py
def pytest_funcarg__Feature(request):
return mypackage.ReferenceImplementation

# In mypackage/tests/test_stuff.py
def test_something(Feature):
assert Feature(1).works

现在,我正在创建一个单独的 Python 包,其中包含更高级的实现 (fancypackage)。 是否可以运行 mypackage 中包含 Feature funcarg 的所有测试,只是采用不同的实现方式?

如果我在 mypackage 中添加新测试,我想避免必须更改 fancypackage,因此显式导入并不理想。我知道我可以使用 pytest.main() 运行所有测试,但由于我有多个功能实现,所以我不想调用 pytest.main() 多次。理想情况下,它看起来像这样:

# In fancypackage/tests/test_impl1.py
def pytest_funcarg__Feature(request):
return fancypackage.Implementation1
## XXX: Do pytest collection on mypackage.tests, but don't run them

# In fancypackage/tests/test_impl2.py
def pytest_funcarg__Feature(request):
return fancypackage.Implementation2
## XXX: Do pytest collection on mypackage.tests, but don't run them

然后,当我在 fancypackage 中运行 pytest 时,它会收集每个 mypackage.tests 测试两次,一次用于每个功能实现。我已经尝试通过显式导入来执行此操作,它似乎工作正常,但我不想显式导入所有内容。

奖金

一个额外的好处是只收集那些包含 Feature funcarg 的测试。这可能吗?

单元测试示例

在切换到 py.test 之前,我使用标准库的 unittest 进行了此操作。其功能如下:

def mypackage_test_suite(Feature):
loader = unittest.TestLoader()
suite = unittest.TestSuite()
mypackage_tests = loader.discover('mypackage.tests')
for test in all_testcases(mypackage_tests):
if hasattr(test, 'Feature'):
test.Feature = Feature
suite.addTest(test)
return suite

def all_testcases(test_suite_or_case):
try:
suite = iter(test_suite_or_case)
except TypeError:
yield test_suite_or_case
else:
for test in suite:
for subtest in all_testcases(test):
yield subtest

显然现在情况有所不同,因为我们正在处理测试函数和类,而不仅仅是类,但似乎 py.test 中应该有一些等价物来构建测试套件并允许您迭代它。

最佳答案

您可以参数化您的Feature fixture :

@pytest.fixture(params=['ref', 'fancy'])
def Feature(request):
if request.param == 'ref':
return mypackage.ReferenceImplementation
else:
return fancypackage.Implementation1

现在,如果您运行 py.test,它将测试两者。

在他们使用的 fixture 上选择测试是不可能的 AFAIK,您可能可以使用 request.applymarker()-m 拼凑一些东西。然而。

关于python - 在另一个 Python 包中运行 pytest 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21030987/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com