单元测试模块在脚本中时sys.argv [1]出现问题

chr*_*ley 11 python unit-testing sys argv

我有一个脚本可以执行各种操作并使用sys.argv访问参数,但是当脚本到达代码的unittest部分时,它说没有模块.我的脚本是:

class MyScript():

    def __init__(self):
        self.value = sys.argv[1]

    def hello(self):
        print self.value

    def suite(self):
        modules_to_test = ('external_sanity_onvif', 'starttest')
        alltests = unittest.TestSuite()
        for module in map(__import__, modules_to_test):
            alltests.addTest(unittest.findTestCases(module))
        return alltests


if __name__ == '__main__': 
    Run = MyScript()
    Run.hello()
    log_file = 'log_file.txt'
    test_file = open(log_file, "w") 
    runner = unittest.TextTestRunner(test_file)
    unittest.main(defaultTest='Run.suite', testRunner=runner)
Run Code Online (Sandbox Code Playgroud)

假设我./script.py Hello在命令行中输入.我得到的错误是:

AttributeError: 'module' object has no attribute 'Hello'
Run Code Online (Sandbox Code Playgroud)

如果我删除unittest模块,它的工作原理.此外,如果我删除testrunner日志并将其保留在:

unittest.main(defaultTest='Run.suite')
Run Code Online (Sandbox Code Playgroud)

这仍然不起作用.

谁能帮忙.

谢谢

我试过这个黑客,但它仍然试图阅读sys.argv.

project = sys.argv[4:]
sys.argv = sys.argv[0:4]
Run Code Online (Sandbox Code Playgroud)

我已经尝试了这一点,argv但它仍然厌倦了阅读额外的参数.

Owe*_* S. 17

问题是需要unittest.main()你宝贵的argv供自己使用!它使用你给它作为函数参数的argv,或者sys.argv如果你没有明确地给它argv,并尝试加载名为你给出的参数的测试.在这种情况下,这意味着它正在寻找一个名为子模块Hello,一个TestCase名为的类,一个名为Hellotest的测试用例类中的测试用例方法Hello,或一个被调用的Hello返回一个TestCaseTestSuite实例的可调用对象,所有这些都在你的模块'script'中.

有几种方法可以解决这个问题:

  • 绕过unittest.main()并调用较低级别的单元测试功能来设置和运行您想到的测试用例.
  • 删除代码的依赖关系sys.argv,并使用unittest.main()您的优势行为.如果您的模块不打算独立运行,除非作为单元测试,这可能是有意义的,因为您的模块的调用者可能不期望您从他们的argv读取!
  • 将测试代码和主程序分成单独的测试模块.你仍然需要弄清楚如何从测试模块中获得正确的argv到你的代码中.
  • 指定argv=[sys.argv[0]]为参数unittest.main(); 应该让它不要试图读你的.


小智 6

如果您不需要unittest模块的命令行功能,可以通过在调用之前修改sys.argv来使optparse和unittest模块很好地协同工作 unittest.main()

请在unittest.main()电话前试试:

del sys.argv[1:]
Run Code Online (Sandbox Code Playgroud)

这会在unittest看到之前删除命令行参数.

如果您不使用optparse模块,则可以执行以下操作:

my_args = sys.argv[1:]
del sys.argv[1:]
# do_stuff(my_args)
unittest.main()
Run Code Online (Sandbox Code Playgroud)