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

时间:2011-05-10 11:18:41

标签: python unit-testing command-line-arguments

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

unittest.main(argv=[myArg])

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

unittest.main(argv=[myArg1, myArg2, myArg3])

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

  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'

进一步深入研究,发现Python unittest将使用argv发送的所有内容视为要运行的测试用例。

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

提前致谢。

3 个答案:

答案 0 :(得分:10)

为什么不在运行unittest.main之前取出命令行参数,然后为 [sys.argv[0]]提供argv

类似的东西:

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

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


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

答案 1 :(得分:3)

不是实际从命令行发送命令,而是假设OptionParser将完成其工作,并使用输入播种变量。如果您有类似的话:

from optparse import OptionParser
parser = OptionParser()
parser.add_option("-t", "--tag", dest="tag", help="tag id")

然后尝试为tag播种值,就像它们来自命令行一样,然后将它们传递到测试类__init__

答案 2 :(得分:1)

我有类似的愿望,因为我需要一种为测试设置假命令行参数的方法。

我发现在每个测试中覆盖sys.argv,我需要它为我工作。您描述的unittest.main()的函数参数用于单元测试本身,而不是您希望测试的模块。