功能场景解释器
spintest的Python项目详细描述
旋转测试
功能场景解释器。
spintest是一个促进api集成和功能测试的库。它接受参数中的URL列表和将针对指定URL执行的任务列表(也称为方案)。
每个任务代表一个api调用,并提供一些选项以验证响应或对响应作出反应。实际上,默认情况下,如果返回的http代码介于200
和299
之间,则任务成功,但您可以指定错误代码或预期的正文。您还可以提供在任务失败时执行的回滚任务(或任务引用)的列表。
此外,还可以存储api调用的响应,以便在将来的任务中使用。
最后,您可以选择在每个URL上同时运行任务方案。
安装
您可以使用pip安装软件包。
$ pip install spintest
URL和任务定义
url列表只是一个端点列表。此处添加的路由将不会计算,因为已在任务上设置了路由定义。
[
"https://foo.com",
"https://bar.com"
]
任务定义稍微复杂一点。场景是可能相互依赖的任务列表。
一个任务遵循此模式:
{
"method": str,
Optional("route", default="/"): str,
Optional("name"): str,
Optional("body"): dict,
Optional(
"headers",
default={"Accept": "application/json", "Content-Type": "application/json"},
): dict,
Optional("output"): str,
Optional("expected"): {
Optional("code"): int,
Optional("body"): Or(dict, str),
Optional("expected_match", default="strict"): Or("partial", "strict"),
},
Optional("retry", default=0): int,
Optional("delay", default=1): int,
Optional("ignore", default=False): bool,
Optional("rollback"): [Or(str, dict)],
}
- 方法是请求的http方法(get、post、delete…)。只接受有效的http方法。
- 路由(可选)是要在终结点上测试的路由。它将附加到当前URL(默认为"/")
- name(可选)是任务的名称。如果要在回滚中使用该任务,则必须执行该任务。
- 正文(可选)是请求正文。
- 标题(可选)是标题字典。默认为json应用程序头。对于oauth端点,您不需要添加带有令牌的适当头(如果您指定了令牌)。
- 输出(可选)变量定义,spintest将调用结果放在其中。此结果可在稍后使用jinja语法的其他任务中使用。
- 预期的(可选)是预期的http响应代码或响应体。
- 代码(可选)是预期的http代码。
- 正文(可选)是预期的响应正文。如果不想检查键的值,但必须设置所有键,则可以将值设置为null。它还会检查嵌套列表和字典,除非您改为输入"null"。
- expected_match是一个选项,用于部分检查响应正文中的键。默认设置为"严格"。
- Retry(重试)(可选)是失败时的重试次数(默认值为0)。
- 延迟(可选)是两次重试之间等待的时间(秒)(默认值为1)。
- 忽略(可选)是指如果此任务出错,您想继续此方案。
- 回滚(可选)是任务失败时触发的任务名称或任务列表。
用法
第一个单一路线的示例。
fromspintestimportspintesturls=["https://test.com"]tasks=[{"method":"GET","route":"test",}]result=spintest(urls,tasks)assertTrueisresult
此测试将执行对https://test.com/test
的get调用,并期望返回的代码介于200
和299
之间。
下面是另一个在两条路线之间交互的示例:
fromspintestimportspintesturls=["https://test.com"]tasks=[{"method":"POST","route":"test","output":"test_output","body":{"name":"Disk1","size":20},},{"method":"DELETE","route":"volumes/{{ test_output['id'] }}","expected":{"code":204},}]result=spintest(urls,tasks)assertTrueisresult
如您所见,第一个任务有一个键output
。这样,您就可以将第一个任务的输出存储到test_output
变量中,并能够在jinja模板语言中的以下任务中使用它。
另外,第二个任务有一个键预期的
。这里我们要检查特定的返回代码204
最后一个示例演示如何并行运行多个任务中的任务。
fromspintestimportspintesturls=["https://foo.com","https://bar.com"]tasks=[{"method":"GET","route":"test","expected":{"body":{"result":None},"expected_match":"partial",}}]result=spintest(urls,tasks,parallel=True)assertTrueisresult
在这里,我们提供了两个url,并添加了选项<函数中的"代码>并行"。如果没有这个选项,场景将在每个url上迭代执行。
但是有了这个选项,场景中的每个任务都将对每个url并发执行。
关于预期的选择的最后一句话。在这里,我们要验证输出中是否存在某个键(result
)。我们不介意这个键的值,所以我们只将它设置为none
。选项expected_match
设置为partial
表示如果api响应中的键比预期的多,我们不希望任务失败。
令牌管理
您可以自动将OAuth令牌包含到任务头中。
- 您可以直接硬编码令牌
urls=["http://test.com"]tasks=[]spintest(urls,tasks,token='ABC')
- 您可以提供创建令牌的generate函数:
urls=["http://test.com"]tasks=[]spintest(urls,tasks,token=create_token)
回滚操作
您可以指定在任务失败时执行的回滚任务列表。
fromspintestimportspintesturls=["https://test.com"]tasks=[{"method":"POST","route":"test","rollback":[{"method":"DELETE","route":"test,}]}]spintest(urls,tasks)
您还可以指定任务的名称,以避免重写它们。
$ pip install spintest
0
逐个运行任务
您还可以进一步控制任务执行的流程。可以在任务之间执行其他操作(清除、外部设置…)
$ pip install spintest
1
如果没有要执行的任务,则next()
方法抛出一个stopAsyncIteration
。
注意:您可以在并行模式下使用方法next()
。在这种情况下,该方法返回一个列表,其中包含针对每个URL的任务结果。
类型转换
任务模板求值总是返回一个字符串,但有时目标API需要一个非字符串值, 可以将其转换为相应的类型。
spintest提供了一组json值转换器来提供这种功能。
- int->;将值转换为
int
- list->;将值转换为
列表
- float->;将值转换为
float
- bool->;将值转换为
bool
$ pip install spintest
2