下面的粘贴包含来自三个不同Python文件的相关片段。第一个是从命令行调用的脚本,它在给定的参数下实例化密码程序。会发生的情况是,脚本会被调用如下内容:
script.py ci
(其他参数将被argparse吞并)。在
第二个是名为Puller
的子类的一部分。第三个是Puller
的子类的一部分,称为CIPuller
。在
这非常有效,因为调用了正确的子类,任何使用错误的其他参数的用户都可以看到给定子类的正确参数,以及来自超类的泛型参数。(尽管我在离线状态下意识到也许我应该使用argparse sub-commands来完成这个任务。)
我无法为这些类编写测试。目前,我需要一个ArgumentParser
来实例化这些类,但是在测试中,我没有从命令行实例化,因此我的ArgumentParser
是没有用的。在
我尝试在测试工具中创建一个ArgumentParser
,以传递给测试代码中的CIPuller's
构造函数,但是如果我在那里使用add_argument
,那么argparse在调用CIPuller
构造函数中的add_argument
时抱怨双(重复)参数是可以理解的。在
用参数测试这些类的合适设计是什么?在
#!/usr/bin/env python
from ci_puller import CIPuller
import argparse
import sys
# Using sys.argv[1] for the argument here, as we don't want to pass that onto
# the subclasses, which should receive a vanilla ArgumentParser
puller_type = sys.argv.pop(1)
parser = argparse.ArgumentParser(
description='Throw data into Elasticsearch.'
)
if puller_type == 'ci':
puller = CIPuller(parser, 'single')
else:
raise ValueError("First parameter must be a supported puller. Exiting.")
puller.run()
class Puller(object):
def __init__(self, parser, insert_type):
self.add_arguments(parser)
self.args = parser.parse_args()
self.insert_type = insert_type
def add_arguments(self,parser):
parser.add_argument(
"-d", "--debug",
help="print debug info to stdout",
action="store_true"
)
parser.add_argument(
"--dontsend",
help="don't actually send anything to Elasticsearch",
action="store_true"
)
parser.add_argument(
"--host",
help="override the default host that the data is sent to",
action='store',
default='kibana.munged.tld'
)
class CIPuller(Puller):
def __init__(self, parser, insert_type):
self.add_arguments(parser)
self.index_prefix = "code"
self.doc_type = "cirun"
self.build_url = ""
self.json_url = ""
self.result = []
super(CIPuller, self).__init__(parser, insert_type)
def add_arguments(self, parser):
parser.add_argument(
'--buildnumber',
help='CI build number',
action='store',
required=True
)
parser.add_argument(
'--testtype',
help='Job type per CI e.g. minitest / feature',
choices=['minitest', 'feature'],
required=True
)
parser.add_argument(
'--app',
help='App e.g. sapi / stats',
choices=['sapi', 'stats'],
required=True
)
argparse
的单元测试很棘手。有一个test/test_argparse.py
文件作为整个Python unittest的一部分运行。但它有一个复杂的定制测试工具来处理大多数情况。在有三个基本问题,1)用测试值调用
parse_args
,2)测试结果参数,3)测试错误。在测试结果{}相对容易。并且
argparse.Namespace
类具有简单的__eq__
方法,因此您可以针对另一个名称空间测试一个名称空间。在测试输入有两种方法。一种是修改
sys.argv
。最初,sys.argv
包含了测试人员需要的字符串。在测试
sys.argv[1:]
作为默认值。因此,如果您更改sys.argv
,您可以测试自定义值。在但是您也可以给
^{pr2}$parse_args
一个自定义列表。argparse
文档在其大多数示例中都使用此方法。在如果
myarg
是None
,则使用sys.argv[1:]
。否则它将使用该自定义列表。在测试错误需要一个自定义的
parse.error
方法(请参阅文档),或者将parse_args
包装在可以捕获sys.exit
异常的parse.error
块中。在How do you write tests for the argparse portion of a python module?
python unittest for argparse
Argparse unit tests: Suppress the help message
Unittest with command-line arguments
Using unittest to test argparse - exit errors
相关问题 更多 >
编程相关推荐