为什么pytest在imp上执行函数

2024-09-30 20:32:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下结构:

main/
|-- __init__.py
|-- foo.py
|-- bar.py
|-- tests/
    |-- __init__.py
    |-- test_foo.py
    |-- test_bar.py

test_foo.py中,我导入了一些包(例如ossys),我还从foo.py导入一个助手函数:

^{pr2}$

当我试图从main/运行测试时:

$ pytest tests/

我看到函数testAllLevels也被收集并作为测试运行(显然)失败了。我的问题是如何从测试发现中跳过此函数?在


Tags: 函数pytestfooinitpytestosmain
2条回答

如果要防止testAllLevels被收集为测试,则必须创建一个名为pytest.ini的文件,并将其放入main或{}文件夹中。在

pytest.ini的内容应该如下所示:

[pytest]
python_functions=test_

注意,这也意味着从现在起,所有的测试函数都必须有一个前缀test_pytest的默认行为是收集前缀为test(不是test_)的函数。在

要回答关于why functions are run on import?的问题,请尝试以下实验。在test_foo.py中添加一行以获取对test_foo.py模块本身的内部引用。在

^{pr2}$

然后在同一个模块中,创建一个如下所示的测试用例:

def test_01():
    print(dir(reference_to_current_module))
    reference_to_current_module.testAllLevels()

在import语句执行之后,dir()的输出将显示testAllLevels已成为属于{}的合法函数。这已经通过对test_foo.py的引用调用函数来验证。我认为它被pytest收集是因为它是一个函数“属于”一个测试模块,它的函数名有一个test前缀。在

解决办法是改变

from main.foo import testAllLevels

^{pr2}$

然后用foo.testAllLevels调用它。像这样,testAllLevels不是作为测试运行的。在

有些东西告诉我这不是最佳解决方案。所以这个问题仍然悬而未决。如果有人知道这种行为的原因,那会有很大帮助。在

相关问题 更多 >