我刚刚开始学习测试,所以我刚开始尝试使用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
来查看标准输出(并禁用stdout的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 ===========================
测试应该在这里运行两次吗?我做了搜索,但在文档中找不到任何明显的东西(虽然可能在错误的地方找工作)。
答案 0 :(得分: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")
此调用不会在正常导入时执行,但会在您发出python test_script.py
时执行,因为python通过将__name__
设置为__main__
来执行命令行指定的脚本,但是{{1}正常的test_script
导入。