【发布时间】:2015-12-10 17:12:37
【问题描述】:
根据我从另一篇 SO 帖子中了解到的情况,要对通过 argparse 获取命令行参数的脚本进行单元测试,我应该执行类似于以下代码的操作,将 sys.argv[0] 作为 arg。
import unittest
import match_loc
class test_method_main(unittest.TestCase):
loc = match_loc.main()
self.assertEqual(loc, [4])
if __name__ == '__main__':
sys.argv[1] = 'aaaac'
sys.argv[2] = 'ac'
unittest.main(sys.argv[0])
这会返回错误:
usage: test_match_loc.py [-h] text patterns [patterns ...]
test_match_loc.py: error: the following arguments are required: text, patterns
我想更深入地了解这里发生了什么。我明白了
if __name__ == '__main__':
main()
说如果这是由'main'执行,最高级别,默认解释器,只是自动运行'main'方法。我假设
if __name__ == '__main__':
unittest.main()
恰好是您在运行单元测试脚本时所说的方式。
我知道当任何脚本运行时,它都会自动有一个argv 对象,一个收集命令行上所有项目的向量。
但我不明白unittest.main(sys.arg[0]) 会做什么。 'unittest.main' 对参数有什么作用?如何预先设置 sys.argv 的值 - 每次运行脚本时它不会自动重置吗?此外,如果在任何脚本之外,这个对象 'sys.argv' 存在于哪里?最后,实现命令行参数测试的正确方法是什么?
如果我的问题含糊不清和误导,我很抱歉。我想了解这里所有相关的组件,这样我才能真正了解我在做什么。
非常感谢。
【问题讨论】:
-
如果不知道您在
test_match_loc.py中如何使用argparse,很难为您提供帮助。您可能需要在该模块中设置sys.argv,或者使用自定义字符串列表调用parse_args,如许多argparse文档示例中所示。另请查看argparse自己的单元测试文件。
标签: python unit-testing argparse