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

如何使用Pytest测试根据sys.argv分支调用print_help的main函数

实现方法

首先先修正待测试代码的两处语法错误,否则代码无法正常运行:

  • def print_help后缺少函数定义括号,修正为def print_help():
  • 代码头部缺少import sys导入,运行会触发名称错误

测试核心逻辑:通过pytest内置的monkeypatch夹具动态修改sys.argv模拟不同命令行入参场景,搭配pytest-mock提供的mock能力监控print_help函数的调用状态,即可验证逻辑是否符合预期。

前置准备

安装测试依赖:

pip install pytest pytest-mock
修正后的业务代码(保存为project.py)
import sys

def main():
    if len(sys.argv) == 1:
        print(print_help())
    elif len(sys.argv) == 2 or len(sys.argv) == 3:
        if sys.argv[1] == 'help' or sys.argv[1] == 'h' or sys.argv[1] == 'H':
            print(print_help())
    else:
        print('no such command arguments try python project.py help')

def print_help():
    the_help = 'the help section'
    return the_help

if __name__ =='__main__':
    main()
测试用例代码(保存为test_project.py)
import sys
from project import main

def test_argv_length_1_triggers_help(monkeypatch, mocker):
    # 模拟无额外参数场景:len(sys.argv) == 1
    monkeypatch.setattr(sys, 'argv', ['project.py'])
    mock_help = mocker.patch('project.print_help')
    main()
    # 验证print_help被正确调用
    mock_help.assert_called_once()

def test_argv_length_2_help_keyword_triggers_help(monkeypatch, mocker):
    # 覆盖参数长度为2时的三个触发关键词
    for cmd in ['help', 'h', 'H']:
        monkeypatch.setattr(sys, 'argv', ['project.py', cmd])
        mock_help = mocker.patch('project.print_help')
        main()
        assert mock_help.called_once, f"传入参数{cmd}时未触发help逻辑"
        mock_help.reset_mock()

def test_argv_length_3_help_keyword_triggers_help(monkeypatch, mocker):
    # 覆盖参数长度为3时的三个触发关键词
    for cmd in ['help', 'h', 'H']:
        monkeypatch.setattr(sys, 'argv', ['project.py', cmd, 'extra_arg'])
        mock_help = mocker.patch('project.print_help')
        main()
        assert mock_help.called_once, f"传入参数{cmd}带额外参数时未触发help逻辑"
        mock_help.reset_mock()

def test_invalid_args_not_trigger_help(monkeypatch, mocker, capsys):
    # 反向校验:不满足条件时不触发help
    # 场景1:参数长度为2但关键词不匹配
    monkeypatch.setattr(sys, 'argv', ['project.py', 'invalid_cmd'])
    mock_help = mocker.patch('project.print_help')
    main()
    mock_help.assert_not_called()
    captured = capsys.readouterr()
    assert 'no such command arguments try python project.py help' in captured.out
    mock_help.reset_mock()

    # 场景2:参数长度超过3
    monkeypatch.setattr(sys, 'argv', ['project.py', 'a', 'b', 'c'])
    main()
    mock_help.assert_not_called()
执行测试

在代码所在目录执行命令pytest test_project.py -v,即可查看所有场景的验证结果,上述用例覆盖了所有要求的触发场景,同时补充了反向校验逻辑,避免非预期触发help函数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 18:45:41