如何对命令行参数进行单元测试?

raj*_*raj 6 python unit-testing command-line-arguments

我正在尝试向Python提供命令行参数unittest并面临一些问题.我在互联网上搜索并找到了提供参数的方法

unittest.main(argv=[myArg])
Run Code Online (Sandbox Code Playgroud)

问题是这适用于单个命令行参数但对多个参数失败.

unittest.main(argv=[myArg1, myArg2, myArg3])
Run Code Online (Sandbox Code Playgroud)

以上呼叫失败,出现以下错误:

  File "/opt/python2.6.6/lib/python2.6/unittest.py", line 816, in __init__
    self.parseArgs(argv)
  File "/opt/python2.6.6/lib/python2.6/unittest.py", line 843, in parseArgs
    self.createTests()
  File "/opt/python2.6.6/lib/python2.6/unittest.py", line 849, in createTests
    self.module)
  File "/opt/python2.6.6/lib/python2.6/unittest.py", line 613, in 
    loadTestsFromNames suites = [self.loadTestsFromName(name, module) 
    for name in names]
  File "/opt/python2.6.6/lib/python2.6/unittest.py", line 584, in 
    loadTestsFromName parent, obj = obj, getattr(obj, part)
AttributeError: 'module' object has no attribute 'admin'
Run Code Online (Sandbox Code Playgroud)

深入研究并发现Python unittest将使用的所有内容argv视为要运行的测试用例.

请告诉我如果仍有办法为我的单元测试案例提供多个论据.我想覆盖一些硬编码值,如IP地址,测试用例标记等,并基本上从主测试脚本中运行此测试脚本.

提前致谢.

Eli*_*sky 10

为什么不拿出命令行参数运行前unittest.main,然后给它[sys.argv[0]]它的 argv

就像是:

if __name__ == '__main__':
   # do stuff with sys.argv
   unittest.main(argv=[sys.argv[0]])
Run Code Online (Sandbox Code Playgroud)

请注意,在给定时argv=None,unittest.main实际上将其作为要解析的信号sys.argv.unittest.main至少需要一个argv元素作为程序名称.所以避免None,[sys.argv[0]]是一个很好的价值,因为它认为它没有命令行参数.


PS我刚注意到你的最后一句话.如果是这种情况 - 请勿使用命令行参数.您的"主要"测试脚本应该只使用unittestAPI来为模块加载测试用例,并根据需要自定义它们.