【问题标题】:How to unittest command line arguments?如何对命令行参数进行单元测试?
【发布时间】:2011-08-22 09:27:11
【问题描述】:

我正在尝试向 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 地址、测试用例标签等,并从主测试脚本中运行这个测试脚本。

提前致谢。

【问题讨论】:

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


    【解决方案1】:

    为什么不在运行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]] 是一个很好的价值,因为它认为它没有命令行参数。


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

    【讨论】:

      【解决方案2】:

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

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

      然后尝试为tag 植入值,就好像它们来自命令行一样,然后将这些值传递到您的测试类__init__

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-11-07
          • 2016-02-25
          • 1970-01-01
          • 1970-01-01
          • 2015-12-10
          • 2016-09-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多