gpt4 book ai didi

python - unittest 模块在脚本中时 sys.argv[1] 的问题

转载 作者:太空狗 更新时间:2023-10-29 17:57:02 34 4
gpt4 key购买 nike

我有一个脚本可以做各种事情并使用 sys.argv 访问参数,但是当脚本到达代码的单元测试部分时,它说没有用于此的模块。我的脚本是:

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)

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

AttributeError: 'module' object has no attribute 'Hello'

如果我删除 unittest 模块,它就会工作。另外,如果我删除 testrunner 日志并将其保留在:

unittest.main(defaultTest='Run.suite')

这仍然不起作用。

谁能帮忙。

谢谢

我试过这个 hack,但它仍然尝试读取 sys.argv

project = sys.argv[4:]
sys.argv = sys.argv[0:4]

我已经用 argv 试过了,但是阅读额外的参数还是很累。

最佳答案

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

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

  • 绕过 unittest.main() 并自行调用较低级别的单元测试函数来设置和运行您想要的测试用例。
  • 移除您的代码对sys.argv 的依赖,并使用unittest.main() 行为以发挥您的优势。如果您的模块不打算独立运行除了作为单元测试,这可能是有道理的,因为您模块的调用者可能不希望您从他们的 argv 中读取!
  • 将测试代码和主例程分离到一个单独的测试模块中。您仍然需要弄清楚如何通过测试模块将正确的 argv 放入您的代码中。
  • 指定 argv=[sys.argv[0]] 作为 unittest.main() 的参数;这应该可以防止它试图阅读你的内容。

关于python - unittest 模块在脚本中时 sys.argv[1] 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2812218/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com