如何通过标准输入运行pytest测试Python脚本?
如何通过标准输入(stdin)运行pytest测试并收集到用例?
我来帮你解决这个问题——你遇到的核心问题是pytest默认不会从标准输入(stdin)中自动收集测试用例,而unittest的行为刚好相反。下面是两种可行的解决方案,适配你的Python 3.7.2和pytest 4.5.0环境:
方案1:让pytest直接读取stdin作为测试模块
给pytest传递-参数,明确告诉它从标准输入读取测试代码并当作测试模块运行:
$ python -m pytest -xvs - << EOF import pytest def test_x(): assert True EOF
参数说明:
-:指定pytest从stdin读取测试代码-xvs(可选):-x表示遇到测试失败立即停止,-v输出详细测试信息,-s允许打印测试中的输出内容
运行后你会看到类似这样的成功输出:
========== test session starts ========== platform darwin -- Python 3.7.2, pytest-4.5.0, py-1.8.0, pluggy-0.11.0 rootdir: /Users/pablo/ collected 1 item <stdin>::test_x PASSED ========== 1 passed in 0.01 seconds ==========
方案2:在pytest.main()中指定当前模块
如果你更倾向于用直接调用pytest.main()的方式,需要把当前模块(也就是通过stdin运行的__main__模块)作为参数传给它,这样pytest就会收集其中的测试用例:
$ python << EOF import pytest def test_x(): assert True if __name__ == "__main__": pytest.main([__file__]) EOF
这里__file__在stdin运行场景下的值是<stdin>,pytest能够识别这个路径并收集其中的测试函数,执行后同样会得到测试通过的结果。
为什么你的原方法不行?
- 第一种原方法:
python -m pytest << EOF只是把测试代码传给pytest的标准输入,但pytest默认会扫描当前目录的测试文件,不会主动读取stdin内容作为测试模块,所以收集不到用例。 - 第二种原方法:你调用
pytest.main()时没有指定测试模块,pytest默认不会收集__main__模块中的测试用例,因此也无法执行你的测试。
而unittest的main()方法默认会自动发现并运行当前模块中的测试用例,所以你的stdin方式对unittest有效。
内容的提问来源于stack exchange,提问作者Pablo
相关产品推荐
相关产品推荐

