Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 带有命令行参数的Unittest_Python_Unit Testing_Argparse - Fatal编程技术网

Python 带有命令行参数的Unittest

Python 带有命令行参数的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

根据我在另一篇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
我想更深入地了解这里发生的事情。我明白

如果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”)