pytest.main(' - s')应该运行两次测试吗?

Ste*_*ude 3 python pytest python-3.x

我刚开始学习测试,所以我刚开始尝试使用py.test组合并运行一些非常简单的单元测试.

示例test_script.py:

import pytest

def test_func():
    assert True

pytest.main('-v')
Run Code Online (Sandbox Code Playgroud)

运行这个给出:

============================= test session starts ==============================
platform win32 -- Python 3.3.1 -- pytest-2.3.4 -- C:\Program Files (x86)\Python33\python.exe
collecting ... collected 1 items

test_script.py:3: test_func PASSED
=========================== 1 passed in 0.12 seconds ===========================
Run Code Online (Sandbox Code Playgroud)

如果我更换-v-s查看标准输出(和禁用标准输出的pytest捕获),测试运行两次:

============================= test session starts ==============================
platform win32 -- Python 3.3.1 -- pytest-2.3.4
============================= test session starts ==============================
platform win32 -- Python 3.3.1 -- pytest-2.3.4
collected 1 items

test_script.py .

=========================== 1 passed in 0.04 seconds ===========================
collected 1 items

test_script.py .

=========================== 1 passed in 0.12 seconds ===========================
Run Code Online (Sandbox Code Playgroud)

测试应该在这里运行两次吗?我做了搜索,但在文档中找不到任何明显的东西(虽然可能一直在寻找错误的地方).

hpk*_*k42 6

那是一个有趣的:)

这是发生的事情:python执行test_script.py,然后执行pytest.main("-s")返回到文件系统并收集test_script.py作为测试模块.当pytest导入时test_script,pytest.main(...)在收集期间再次调用.第二次调用不再导入test_script,因为它sys.modules现在是,但它执行测试功能.当集合完成(并且内部pytest.main运行已执行测试一次)时,测试函数也由外部pytest.main调用执行.一切都清楚了吗?:)

如果你想避免这种情况,你需要像这样包装pytest.main调用:

if __name__ == "__main__":
    pytest.main("-s")
Run Code Online (Sandbox Code Playgroud)

此调用不会在正常导入时执行,但会在您发出时执行,python test_script.py因为python通过设置__name__为执行命令行指定脚本,__main__但是test_script在正常import test_script导入时执行.