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

