3

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

示例test_script.py

import pytest

def test_func():
    assert True

pytest.main('-v')

运行这个给出:

============================= 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 ===========================

如果我替换-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 ===========================

测试应该在这里运行两次吗?我进行了搜索,但在文档中找不到任何明显的内容(尽管可能一直在寻找错误的地方)。

4

1 回答 1

6

这是一个有趣的:)

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

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

if __name__ == "__main__":
    pytest.main("-s")

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

于 2013-04-30T17:18:46.910 回答