我有以下结构:
main/
|-- __init__.py
|-- foo.py
|-- bar.py
|-- tests/
|-- __init__.py
|-- test_foo.py
|-- test_bar.py
在test_foo.py
内我正在导入一些软件包(例如os
,sys
),我还从foo.py
导入了一个辅助函数:
from main.foo import testAllLevels
当我尝试从main/
运行测试时:
$ pytest tests/
我看到函数testAllLevels
也被收集并作为测试运行并且(好像)失败了。我的问题是如何从测试发现中跳过此功能?
答案 0 :(得分:1)
如果要阻止testAllLevels
被收集作为测试,则必须创建一个名为pytest.ini
的文件,并将其放在main
或tests
文件夹中。
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
不作为测试运行。