Python unittest中sys.argv参数不足时IndexError捕获问题
问题根因
my_func内部已经通过try-except块捕获了IndexError且没有重新抛出的逻辑,异常不会流出到函数外部,所以assertRaises无法捕获到该异常。另外两份代码都存在缺失依赖导入的问题:my_file.py没有导入sys模块,测试文件没有导入os模块。
修复方案
根据你的业务预期二选一即可:
方案1:预期IndexError需要抛出到函数外
修改my_file.py,要么直接删除try-except块,要么在捕获处理完成后重新抛出异常:
# my_file.py 修正后示例 import sys # 写法1:删掉异常捕获逻辑 def my_func(): sys.argv[2] # 写法2:保留捕获逻辑,处理完成后重抛 def my_func(): try: sys.argv[2] except IndexError: # 这里可以加你的自定义处理逻辑 raise
补全测试文件的导入后,原来的测试逻辑即可正常运行:
# test_sys_argv.py 修正导入后 import sys import os import unittest import my_file from unittest.mock import patch class TestServer(unittest.TestCase): def test_my_func(self): work_dir = os.path.dirname(os.getcwd()) my_file_full_path = os.path.join(work_dir, 'my_file.py') test_args = [my_file_full_path, 'arg1'] with patch.object(sys, 'argv', test_args): self.assertRaises(IndexError, my_file.my_func) if __name__ == '__main__': unittest.main()
方案2:预期IndexError在函数内部被消化
这种场景不需要使用assertRaises,改为验证函数执行后的预期行为即可。举个例子,如果函数捕获异常后需要返回False,修改和测试逻辑如下:
# my_file.py 示例 import sys def my_func(): try: sys.argv[2] return True except IndexError: # 自定义处理逻辑 return False
# 对应测试逻辑 def test_my_func(self): work_dir = os.path.dirname(os.getcwd()) my_file_full_path = os.path.join(work_dir, 'my_file.py') test_args = [my_file_full_path, 'arg1'] with patch.object(sys, 'argv', test_args): self.assertEqual(my_file.my_func(), False)
内容的提问来源于stack exchange,提问作者ibarbylev
相关产品推荐
相关产品推荐

