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

使用pytest测试读取stdin的argparse脚本失败问题排查

解决pytest测试读取stdin的Go脚本时JSON传递失败的问题

问题出在哪

直接用monkeypatch.setattr(sys.stdin, 'read', lambda: json_str)替换read方法不靠谱,因为脚本可能依赖sys.stdin的文件对象特性,或者你没用到pytest-console-scripts本身更合适的传参方式。

靠谱方案1:用pytest-console-scripts自带的stdin参数

pytest-console-scripts的script_runner.run方法支持直接传stdin数据,这是官方推荐的方式,不会踩坑:

def test_go_script(script_runner):
    test_json = '{"key": "value"}'
    # 传入bytes类型的stdin数据
    result = script_runner.run('go.py', stdin=test_json.encode('utf-8'))
    assert result.success
    # 这里加你需要的输出断言,比如检查result.stdout

方案2:正确模拟sys.stdin文件对象

非要用monkeypatch的话,别直接替换read方法,用io.StringIO模拟完整的stdin流:

import sys
import io
from go import main  # 假设脚本的入口函数是main

def test_go_main(monkeypatch):
    test_json = '{"key": "value"}'
    # 用StringIO模拟标准输入流
    monkeypatch.setattr(sys, 'stdin', io.StringIO(test_json))
    # 调用脚本的主函数
    main()
    # 这里加你的业务断言,比如检查处理后的结果

额外注意点

  • 确认你的go.py里是用sys.stdin.read()一次性读取全部内容,如果是逐行读取(比如for line in sys.stdin),要保证测试JSON的格式匹配(比如多行JSON要对应)。
  • 测试时别给脚本传冲突的命令行参数,script_runner.run里第一个参数是脚本名,后面跟着你的argparse参数。
  • 先检查测试用的JSON字符串有没有语法错误,比如引号没配对、逗号多了这种低级问题。

内容的提问来源于stack exchange,提问作者user3313834

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 08:11:28