You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过标准输入运行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 17:32:36