为什么pytest在导入时执行函数

时间:2017-09-08 17:44:41

标签: python pytest

我有以下结构:

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

test_foo.py内我正在导入一些软件包(例如ossys),我还从foo.py导入了一个辅助函数:

from main.foo import testAllLevels

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

$ pytest tests/

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

2 个答案:

答案 0 :(得分:1)

如果要阻止testAllLevels被收集作为测试,则必须创建一个名为pytest.ini的文件,并将其放在maintests文件夹中。

pytest.ini的内容应该是这样的:

[pytest]
python_functions=test_

请注意,这也意味着从现在开始,所有测试函数的前缀都必须为test_pytest的默认行为是使用test(非test_)前缀收集函数。

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

from main.foo import testAllLevels
reference_to_current_module = sys.modules[__name__]

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

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

dir()的输出将显示执行import语句后testAllLevels已成为属于test_foo.py的合法函数。已通过引用test_foo.py调用该函数来验证这一点。我认为它已被pytest收集,因为它是一个功能" 属于"测试模块及其函数名称具有test前缀。

答案 1 :(得分:0)

解决方案是改变

{
  "electron": {
    "name": "MyApp",
    "version": "0.1.0",
    "description": "A really cool app.",
    "rootUrl": "https://myapp.com",
    "launchPath": "/ app / landing",
    "sign": "Developer ID Application: ...",
    "height": 768,
    "width": 1024,
    "frame": true,
    "title-bar-style": "hidden",
    "resizable": true,
    "protocols": [{
      "name": "MyApp",
      "schemes": ["myapp"]
    }]
  }
}

from main.foo import testAllLevels

然后使用from main import foo 调用它。就像那样foo.testAllLevels不作为测试运行。

某事告诉我,这不是最佳解决方案。所以问题仍然存在。如果有人知道这种行为的原因会有很大帮助。