[英]Unittest with command-line arguments
根据我从另一篇SO帖子中了解到的,要对通过argparse接受命令行参数的脚本进行单元测试,我应该执行以下代码,将sys.argv [0]设为arg。
import unittest
import match_loc
class test_method_main(unittest.TestCase):
loc = match_loc.main()
self.assertEqual(loc, [4])
if __name__ == '__main__':
sys.argv[1] = 'aaaac'
sys.argv[2] = 'ac'
unittest.main(sys.argv[0])
这将返回错误:
usage: test_match_loc.py [-h] text patterns [patterns ...]
test_match_loc.py: error: the following arguments are required: text, patterns
我想更深入地了解这里发生的事情。 我明白
if __name__ == '__main__': main()
表示如果这是由“ main”(最高级别的默认解释器)执行的,则仅自动运行“ main”方法。 我假设
if __name__ == '__main__': unittest.main()
恰好是您说的运行unittest脚本的方式。
我知道运行任何脚本时,它都会自动有一个argv
对象,一个收集命令行上所有项目的向量。
但是我不知道unittest.main(sys.arg[0])
会做什么。 'unittest.main'与参数有什么关系? 我如何预先设置sys.argv的值-每次运行脚本时它不会自动重置吗? 此外,如果在任何脚本之外,此对象“ sys.argv”在哪里存在? 最后,实现命令行参数测试的正确方法是什么?
如果我的问题含糊不清且被误导,我感到抱歉。 我想了解这里的所有相关组件,以便实际上可以了解自己在做什么。
非常感谢你。
仅仅通过处理一对简单文件,我发现在调用者模块主体中修改sys.argv
会影响导入模块看到的sys.argv
:
import sys
sys.argv[1] = 'aaaac'
sys.argv[2] = 'ac'
class test_method_main(unittest.TestCase):
...
但是,像这样在main
块中修改sys.argv
不会在导入的块中显示。 我们可以深入研究文档(和代码)来确切地了解原因,但是我认为仅仅确定有效的方法就足够了。
这是我从上一个导入模块的问题中重新构建的内容-带有一些诊断信息
import argparse
import sys
def main():
print(sys.argv)
parser = argparse.ArgumentParser(
description='Takes a series of patterns as fasta files'
' or strings and a text as fasta file or string and'
' returns the match locations by constructing a trie.')
parser.add_argument('text')
parser.add_argument('patterns', nargs='+')
args = parser.parse_args()
print(args)
return 1
您还可以使用自己的字符串列表测试解析器,以确认parse_args
使用sys.argv[1:]
如果其参数缺失或无):
def main(argv=None):
print(argv)
...
args = parser.parse_args(argv)
print(args)
return 1
loc = match_loc.main(['abc','ab']) # and in the caller
即使我能够构造一个有效的测试用例,您实际上也应该已经提供了足够的信息,而我不需要猜测或挖掘。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.