2013-04-22 160 views
2

我只是刚刚开始学习测试,所以我刚刚开始尝试使用py.test进行一些非常简单的单元测试。pytest.main(' - s')应该运行两次测试吗?

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

,这里是一个有趣的一个:)

是发生了什么:蟒蛇执行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,因为它会执行蟒蛇通过在正常的import test_script进口设置__name____main__test_script执行指定的脚本的命令行。

相关问题