ant*_*gel 4 python pytest argparse
以下粘贴包含来自三个单独的Python文件的相关片段。第一个是从命令行调用的脚本,该脚本在给定某些参数的情况下实例化CIPuller。发生的情况是脚本被调用,类似于:(
script.py ci其他argpar被argparse吞噬)。
第二个是名为的子类的一部分Puller。三是子类的部分Puller叫CIPuller。
当调用正确的子类时,这将非常有用,并且使用错误其他args的任何用户都可以查看给定子类的正确args,以及超类的通用参数。(尽管使我脱机了,也许我应该为此使用argparse子命令。)
我被困试图为这些类编写测试。当前,我需要ArgumentParser实例化这些类,但是在测试中,我不是从命令行实例化事物,因此我ArgumentParser没有用。
我尝试ArgumentParser在测试工具中创建一个,以传递给CIPuller's测试代码中的构造函数,但是如果add_argument在那儿使用argparse,则可以理解,当它add_argument在CIPuller构造函数中调用时,会抱怨双(重复)参数。
有什么合适的设计来用参数测试这些类?
#!/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
)
Run Code Online (Sandbox Code Playgroud)
进行单元测试argparse很棘手。有一个test/test_argparse.py文件在整个Python单元测试中运行。但是它具有复杂的自定义测试工具,可以处理大多数情况。
存在三个基本问题:1)调用parse_args测试值; 2)测试生成的参数; 3)测试错误。
测试结果args相对容易。而argparse.Namespace类有简单的__eq__方法,以便您可以测试对另外一个命名空间。
有两种测试输入的方法。一种是修改sys.argv。最初sys.argv具有用于测试人员的字符串。
self.args = parser.parse_args()
Run Code Online (Sandbox Code Playgroud)
sys.argv[1:]默认测试。因此,如果您进行更改sys.argv,则可以测试自定义值。
但是您也可以提供parse_args自定义列表。该argparse文档在它的大部分示例使用此。
self.args = parser.parse_args(argv=myargv)
Run Code Online (Sandbox Code Playgroud)
如果myarg是None它使用sys.argv[1:]。否则,它将使用该自定义列表。
测试错误需要自定义parse.error方法(请参阅docs)或将包裹parse_args在try/except可以捕获sys.exit异常的块中。
| 归档时间: |
|
| 查看次数: |
2110 次 |
| 最近记录: |