7 个版本

0.1.6 2021 年 11 月 2 日
0.1.5 2021 年 10 月 27 日

#229模板引擎

MIT 许可证

89KB
2K SLoC

🧁 Upcake

API 的蛋糕

概述

Upcake 允许对 HTTP 请求执行断言。请求及其断言定义在 YAML 文件中,并且可以在请求名称的情况下相互依赖。断言可以针对请求时间数据和任何响应数据,包括头部、内容和响应代码。

请求 URL、头部和内容支持使用 Handlebars 通过 handlebars crate 进行模板渲染。

请求并行运行,除非它们依赖于其他请求,在这种情况下它们将等待依赖项完成后再开始。

请求的响应头部和内容作为模板上下文的一部分提供给依赖请求。

安装

使用 cargo

cargo install upcake

从源码安装

git clone https://github.com/johnnynotsolucky/upcake.git
cd upcake
cargo install --path .

用法

命令行选项

  • --env-var-prefix - 用于过滤注入模板上下文的环境变量的可选前缀
  • -k, --insecure - 在使用 SSL 时允许不安全的服务器连接
  • -E, --cert - 客户端证书文件
  • --key - 客户端私钥文件
  • --cacert - 用于验证的 CA 证书
  • -L, --location - 跟随重定向
  • -v, --verbose - 详细输出
  • --fail-request - 在 HTTP 错误响应代码上失败请求
  • -s, --max-response-size - 最大响应大小(以字节为单位)
  • --extra-vars - 设置额外的变量为 key=value 或 YAML。要使用文件,请以 "@" 预先附加值。在 user 属性的模板上下文中可用。
  • --connect-timeout - 允许连接的最大时间(以毫秒为单位)
  • -c--config-file - 请求配置文件路径。默认为 "Upcakefile.yaml"。

注意: 命令行中设置的配置将覆盖 Upcakefile 中设置的该属性的配置。

配置

  • env_var_prefix - 用于过滤环境变量的可选前缀。由 --env-var-prefix 覆盖。
  • location - 跟踪重定向。由 --insecure 覆盖。
  • insecure - 在使用 SSL 时允许不安全的服务器连接。由 --insecure 覆盖。
  • client_cert - 客户端证书文件。由 --cert 覆盖。除非是绝对路径,否则路径相对于配置文件目录。
  • client_key - 客户端私钥文件。由 --key 覆盖。除非是绝对路径,否则路径相对于配置文件目录。
  • ca_cert - 用于验证的 CA 证书。由 --cacert 覆盖。除非是绝对路径,否则路径相对于配置文件目录。
  • connect_timeout - 允许的最大连接时间。由 --connect-timeout 覆盖。
  • extra_vars - 从 YAML 映射中设置额外的变量。与使用 --extra-vars 设置的变量合并。在 user 属性的模板上下文中可用。
  • verbose - 详细输出。由 --verbose 覆盖。
  • fail_request - 在 HTTP 错误响应代码上请求失败
  • max_response_size - 最大响应大小(字节)。由 --max-response-size 覆盖。
  • requests - 请求配置列表。

示例

location: false
insecure: false
ca_cert: ca.pem
client_cert: client.pem
client_key: key.pem
connect_timeout: 100
extra_vars:
  my_var: Some Value
verbose: true
max_response_size: 32000
requests:
  - url: "https://127.0.0.1:8888/post"

请求配置

  • name 可选 - 请求名称。
  • requires 可选 - 依赖此请求的命名请求列表。
  • request_method 可选 - 要使用的 HTTP 方法。默认为 "GET"。
  • data 可选 - 与请求一起发送的数据。通过在值前加 "@" 发送文件内容,例如 "@path/to/body/template.hbs"。相对路径相对于加载的配置文件目录。
  • headers 可选 - 头部列表或用于渲染原始头部的模板。
  • url - 要向其发送请求的 URL。
  • assertions 可选 - 对响应执行断言的列表。默认为 HTTP 200 断言。

示例

- name: "Request B"
  requires: ["Request A"]
  request_method: "POST"
  data: "@data.hbs"
  headers:
    - name: Accept
      value: application/json
    - name: Content-Type
      value: application/json
  url: "https://127.0.0.1:8888/post"
  assertions:
    - type: equal
      path: ."response_code"
      value: 200
头部模板
- name: "Request B"
  requires: ["Request A"]
  request_method: "GET"
  url: "https://127.0.0.1:8888/get"
  headers: |
    Accept: application/json
    {{#each requests.[Request A].headers}}
      {{#if (eqi name "Set-Cookie")}}
    Cookie: {{value}}
      {{/if}}
    {{/each}}

断言配置

  • type - 要使用的断言类型。请参阅 可用断言
  • path - 断言应运行的字段的 jql 路径。默认为 .。在内部断言上忽略 path,例如 长度 断言。
  • skip 可选 - 是否跳过断言。如果设置,则需要一个字符串值作为原因。
  • assertion - 要应用的断言

示例

- type: length
  path: ."content"."slideshow"."slides".[]
  skip: Some reason for skipping the assertion
  assertion:
    type: equal
    value: 2

可用断言

除了顶层断言配置之外,每个断言都有其自己的属性,这些属性必须设置。

在之间

类型:between

断言值在某个范围内。

  • min - 范围开始。
  • max - 范围结束。
  • inclusive 可选 - 是否在断言中包含minmax
示例
- type: between
  path: ."response_code"
  min: 200
  max: 399
  inclusive: true

等于

类型: equal

断言一个值等于给定的值。

  • value - 要断言的值。
示例
- type: equal
  path: ."response_code"
  value: 200

不等于

类型: not-equal

断言一个值不等于给定的值。

  • value - 要断言的值。
示例
- type: not-equal
  path: ."response_code"
  value: 204

长度

类型: length

断言一个值的长度通过给定的断言。

  • assertion - 任何在断言配置中定义的相同配置的断言。
示例
- type: length
  path: ."headers".[]
  assertion:
    - type: equal
      value: 5

包含

类型: contains

断言响应值包含给定的值。

  • 对于字符串,它断言子字符串存在于值中;

  • 对于数组,它断言值存在于数组中;

  • 对于映射(字典/对象类型),断言输入映射存在于响应映射中。

  • value - 要断言的值包含在给定的值中。

示例

断言映射包含所有键/值对

- type: contains
  path: ."content".{}
  value:
    key: Value
    another_property: Some other value

断言数组包含一个值

- type: contains
  path: ."content"."my_integer_array".[]
  value: 10

或者

- type: contains
  path: ."content"."my_object_array".[]
  value:
    id: item_10
    value: Item Value

断言子字符串出现在响应值中

- type: contains
  path: ."content"."my_string"
  value: "value"

存在

类型: exists

断言给定的值作为键存在于响应值中。

  • value - 要断言的值存在于给定的映射中。
示例
- type: exists
  path: ."content"."my_object".{}
  value: id

大于

类型: greater-than

断言一个值大于给定的值。

  • value - 要断言的值。
示例
- type: greater-than
  path: ."response_code"
  value: 200

大于等于

类型: greater-than-equal

断言一个值大于或等于给定的值。

  • value - 要断言的值。
示例
- type: greater-than-equal
  path: ."response_code"
  value: 200

小于

类型: less-than

断言一个值小于给定的值。

  • value - 要断言的值。
示例
- type: less-than
  path: ."response_code"
  value: 400

小于等于

类型: less-than-equal

断言一个值小于或等于给定的值。

  • value - 要断言的值。
示例
- type: less-than-equal
  path: ."timing"."starttransfer"
  value: 100

响应数据

请求结果

  • http_version - 请求中使用的HTTP版本。
  • response_code - 返回的HTTP响应代码。
  • response_message - 如果有的话,从主机返回的HTTP响应消息。
  • headers - 响应头列表。
  • timing - 响应时间数据。参见时间结果
  • content - 响应内容,格式化为JSON或原始内容(如果无法解析为JSON)。

时间结果

  • namelookup - 从请求开始到域名查找解决所花费的毫秒数。
  • connect - 从请求开始到与远程主机建立连接所花费的毫秒数。
  • pretransfer - 从请求开始到文件传输即将开始所花费的毫秒数。
  • starttransfer - 从请求开始到接收第一个字节数据所花费的毫秒数。也称为TTFB。
  • total - 从请求开始到请求结束所花费的毫秒数。
  • dns_resolution - namelookup的别名。
  • tcp_connection - connectnamelookup的差值。
  • tls_connection - pretransferconnect 的区别。
  • server_processing - starttransferpretransfer 的区别。
  • content_transfer - totalstarttransfer 的区别。

模板化

请求 URL、头部和内容支持使用 Handlebars 通过 handlebars crate 进行模板渲染。

请求的响应头部和内容作为模板上下文的一部分提供给依赖请求。

可用元素

user

可选的用户提供的上下文。这是通过 --extra-vars 标志和/或在配置文件中的 extra_vars 配置属性来设置的。

env

程序运行时可用环境变量的映射。使用 --env-var-prefixenv_var_prefix 配置选项设置前缀将删除任何不以该值开头的环境变量。

requests

按请求名称键控的请求映射。只有设置在请求配置的 requires 属性中的请求会被包括。尚未执行或完成的请求将不会可用,直到它们完成。

助手

  • 内置助手
  • 布尔助手
    • eqi - 不区分大小写的等于
    • nei - 不区分大小写的不等

示例

示例在 examples 中。

它们被配置为针对本地的 httpbin 服务器运行。

httpbin 服务器

使用 docker 启动

docker run -p 8888:80 kennethreitz/httpbin

使用 docker-compose 启动

docker-compose --file examples/docker-compose.yaml up

运行示例

upcake --config-file examples/basic.yaml
AUTH_TOKEN=my_token upcake --config-file ./examples/pipeline.yaml
upcake --config-file examples/mtls.yaml

依赖关系

~20–34MB
~589K SLoC