2011-05-10 65 views
6

我正在尝试向Python unittest提供命令行参数并面临一些问题。 找遍了互联网上,发现了一种支持参数如何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地址,测试用例标记等,并且主要在主测试脚本中运行此测试脚本。

在此先感谢。

回答

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.argvunittest.main需要至少一个argv元素用作程序名称。因此,避免None,[sys.argv[0]]是一个很好的价值,因为它认为它没有命令行参数。


P.S.我刚刚注意到你最后一句话。如果是这样 - 不要使用命令行参数。您的“主要”测试脚本应该使用unittest的API,以便加载模块的测试用例,并根据需要定制它们。

3

不是从命令行实际发送命令,而是假定OptionParser将完成其工作,并用输入为变量生成种子。如果你已经是这样的:

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

然后尝试播种tag与价值,就好像它们来自于命令行,然后通过这些进入你的测试类__init__

1

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

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