Python 如何在单元测试期间测试所需的argparse参数?

Python 如何在单元测试期间测试所需的argparse参数?,python,unit-testing,tdd,argparse,python-unittest,Python,Unit Testing,Tdd,Argparse,Python Unittest,我正在为argparser做TDD测试。如何使用选项required测试参数?我需要测试所有选项,如: 争论太多, 没有给出任何论据 给出了错误的论点 我可以提出SystemExit,但这并不是我真正需要的: def test_no_参数(self): 使用patch.object(sys,“exit”)作为mock_方法: self.parser.parse_参数() assertTrue(mock_方法.调用) 但是,在未引发系统退出的情况下,我总是会出现如下错误: zbx-chec

我正在为argparser做TDD测试。如何使用选项required测试参数?我需要测试所有选项,如:

  • 争论太多,
  • 没有给出任何论据
  • 给出了错误的论点
我可以提出SystemExit,但这并不是我真正需要的:

def test_no_参数(self):
使用patch.object(sys,“exit”)作为mock_方法:
self.parser.parse_参数()
assertTrue(mock_方法.调用)
但是,在未引发系统退出的情况下,我总是会出现如下错误:

zbx-check-mount.py
class命令行:
定义初始化(自):
self.args\u parser=argparse.ArgumentParser(description=“Monitoring mounted filesystem”,
格式化程序(class=argparse.RawTextHelpFormatter)
self.parsed_args=None
self.add_参数()
def添加参数(自):
"""
向解析器添加参数。
"""
尝试:
self.args\u parser.\u action\u groups.pop()#pylint:disable=受保护的访问
required=self.args\u parser.add\u argument\u group('required arguments')
required.add_参数('--fs_name',required=True,help='give filesystem')
除argparse.ArgumentError作为错误外:
log.error('argparse.ArgumentError:%s',err)
系统出口(1)
def parse_参数(self,args=None):
"""
分析添加的参数。然后运行private方法返回值
"""
self.parsed_args=self.args_parser.parse_args()
返回self.parsed_args.fs_name,
测验
来自pyfakefs.fake\u filesystem\u unittest导入测试用例
导入操作系统
导入系统
尝试:
从StringIO导入StringIO
除恐怖外:
从io导入StringIO
如果系统版本信息[0]==3:
从unittest.mock导入MagicMock,补丁
其他:
从模拟导入MagicMock,补丁
sys.path.extend([os.path.join(os.path.dirname(os.path.abspath(_文件__)),“…”,“…”,“bin”))
模块名称=uuu导入('zbx-check-mount')
类TestCommandLine(TestCase):
def设置(自):
"""
方法来准备测试夹具。在调用测试方法之前立即调用此方法
"""
self.parser=module_name.CommandLine()
def test_无参数(自):
opts=self.parser.parse_参数([])
assert opts.fs_name
def拆卸(自):
"""
调用测试方法并记录结果后立即调用方法。
"""
通过

如何避免这种情况并测试其他选项?

如果我正确地解释了您的症状,您在测试线束中遇到了问题,因为您的
sys.exit
猴子补丁实现实际上返回了argparse库不期望的结果


引入引发异常的,然后您可以在单元测试中捕获并验证的,可能足以解决问题。

如果我正确解释了您的症状,您在测试线束中遇到了问题,因为您的
sys.exit
的猴子补丁实现实际上返回了,argparse库不希望看到的


引入引发异常的,然后您可以在单元测试中捕获并验证的,可能足以解决问题。

def parse_参数(self,args=None):
中,您应该将
args
传递给解析器,如下所示:

self.args_parser.parse_args(args)
parse_args()
parse
sys.argv[1://code>,或者如果给定的参数是
None
。否则,它将解析提供的列表

python
的完整发行版中,有一个用于
argparse
的unittest文件(
test\u argparse.py
)。定义
ArgumentParser
的子类捕获错误并重定向错误消息有点复杂


测试
argparse
很棘手,因为它查看的是
sys.argv
,还使用
unittest
脚本。它通常会尝试在出现错误时退出。这已经在许多SO问题中讨论过了。

def parse_参数(self,args=None):
中,您应该将
args
传递给解析器,如下所示:

self.args_parser.parse_args(args)
parse_args()
parse
sys.argv[1://code>,或者如果给定的参数是
None
。否则,它将解析提供的列表

python
的完整发行版中,有一个用于
argparse
的unittest文件(
test\u argparse.py
)。定义
ArgumentParser
的子类捕获错误并重定向错误消息有点复杂


测试
argparse
很棘手,因为它查看的是
sys.argv
,还使用
unittest
脚本。它通常会尝试在出现错误时退出。这已经在许多SO问题中讨论过了。

这是一个非常有用且清晰的解释!在每次测试中,我都错过了self.args\u parser.parse\u args(args)
。这是一个非常有用和清晰的解释!在每次测试中,我都错过了self.args\u parser.parse\u args(args)