使用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
相关产品推荐
相关产品推荐

