Python 带有命令行参数的Unittest
根据我在另一篇SO文章中的理解,要对通过argparse获取命令行参数的脚本进行单元测试,我应该执行类似于下面的代码的操作,将sys.argv[0]作为argPython 带有命令行参数的Unittest,python,unit-testing,argparse,Python,Unit Testing,Argparse,根据我在另一篇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__': s
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
我想更深入地了解这里发生的事情。我明白
如果uuuu name_uuuu=='\uuuuuuu main\uuuuuu':
main()
表示如果这是由“main”(最高级别的默认解释器)执行的,则仅自动运行“main”方法。我想
如果uuuu name_uuuu=='\uuuuuuu main\uuuuuu':
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://code>,如果其参数缺失或没有:
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
尽管我能够构建一个工作测试用例,但您确实应该提供足够的信息,我不需要猜测或挖掘。只需使用一对简单的文件,我发现修改调用者模块主体中的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://code>,如果其参数缺失或没有:
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
即使我能够构建一个工作的测试用例,您也应该提供足够的信息,我不需要猜测或挖掘。如果不知道如何在test\u match\u loc.py中使用argparse
,很难帮助您。您可能需要在该模块中设置sys.argv
,或者使用自定义字符串列表调用parse_args
,如许多argparse
文档示例所示。还可以查看argparse
自己的unittest文件。如果不知道如何在test\u match\u loc.py
中使用argparse
,您很难获得帮助。您可能需要在该模块中设置sys.argv
,或者使用自定义字符串列表调用parse_args
,如许多argparse
文档示例所示。另请看一下argparse
自己的unittest文件。您好,我想使用相同的功能。但是在sys args中添加参数时,获取indexer:list赋值索引超出范围错误。@Vish,在尝试添加项之前,请检查sys.argv
的大小。是的。如果有人想添加额外的参数,还有一件事,它可以像sys.argv.append(“ert”)一样添加。嗨,我想使用相同的功能。但是在sys args中添加参数时,获取索引器:列表分配索引超出范围错误。@Vish,在尝试添加项之前,请检查sys.argv
。是的。还有一件事,如果有人想添加额外的参数,可以像sys.argv.append一样添加它(“ert”)