功能场景解释器

spintest的Python项目详细描述


旋转测试

功能场景解释器。

spintest是一个促进api集成和功能测试的库。它接受参数中的URL列表和将针对指定URL执行的任务列表(也称为方案)。

每个任务代表一个api调用,并提供一些选项以验证响应或对响应作出反应。实际上,默认情况下,如果返回的http代码介于200299之间,则任务成功,但您可以指定错误代码或预期的正文。您还可以提供在任务失败时执行的回滚任务(或任务引用)的列表。

此外,还可以存储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调用,并期望返回的代码介于200299之间。

下面是另一个在两条路线之间交互的示例:

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

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java传递实现接口的内部类   java为什么managedbean方法在post请求中的过滤器调用之前调用   java Android应用程序在Android M,O上崩溃,登录A/libc时出错:tid 17938中的致命信号11(SIGSEGV),代码2,故障地址0x343a2944   java JPA存储库。findByAll()返回null,但数据库中存在所有内容   用于发送电子邮件的java Ant脚本   Java小程序HTML页面发生了奇怪的事情   在Postman的请求正文中传递多个JSON数据,并使用Jersy(JXRS)进入Java Rest API   无法强制转换java DAO类   10分钟后重新连接java   正则表达式如何在java中选择字符串直到某个字符   java我的输出有一些问题   Objective中的java时间段   java如何在新屏幕上基于按钮单击在webview中打开url   java哪个selenium版本与Firefox ESR 45.2.0兼容   java无法使用Apache Camel 3.1.0将XML转换为JSON