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
名为的类,一个名为Hello
test的测试用例类中的测试用例方法Hello
,或一个被调用的Hello
返回一个TestCase
或TestSuite
实例的可调用对象,所有这些都在你的模块'script'中.
有几种方法可以解决这个问题:
unittest.main()
并调用较低级别的单元测试功能来设置和运行您想到的测试用例.sys.argv
,并使用unittest.main()
您的优势行为.如果您的模块不打算独立运行,除非作为单元测试,这可能是有意义的,因为您的模块的调用者可能不期望您从他们的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)
归档时间: |
|
查看次数: |
10422 次 |
最近记录: |