是否仅基于OpenAPI 3.0文件进行端点单元测试?

时间:2018-04-19 10:03:06

标签: rest api testing build openapi

经过一些谷歌搜索,我决定直接问这个:

是否可以仅基于OpenAPI 3.0规范文件运行REST API端点“构建测试”?

我想将示例请求 - 响应对添加到OpenAPI规范文件中,并使现有的或自编写的库运行所有这些已定义的测试并报告任何失败。

据我了解标准,可以很容易地包含请求示例并以原理图方式测试响应(思考http://json-schema.org/)。但我还没有看到一种方法来结合更具体的测试,例如测试特定响应字段中的数字是一个确切的值。此外,有一种顺序测试请求的方法会很好,但我不希望仅从spec文件中实现这一点。

最佳解决方案将包含在我的存储库中并在localhost上运行测试。非常感谢你们。

1 个答案:

答案 0 :(得分:1)

是否可以仅基于OpenAPI 3.0规范文件运行REST API端点“构建测试”?

是的。该规范至少包含两个允许自动生成测试的组件:

  • 示例。您可以specify examples定义端点,这些端点描述您发送/接收的具体数据样本。
  • 模式。它们描述了数据模型,可用于生成对API的请求。

但是我还没有找到一种方法来合并更具体的测试,例如将特定响应字段中的数字测试为精确值。

可以使用“枚举”关键字在期望字段的模式列表中使用单个值来完成此操作。与JSON Schema相比,Open API不支持“ const”关键字。

此外,最好有一种顺序测试请求的方法,但我不希望仅从spec文件中实现。

要实现此目的,可以使用Open API links,它允许您指定如何根据对端点A的请求或响应来构造对端点B的请求。例如:

paths:
  /users:
    post:
      summary: Creates a user and returns the user ID
      operationId: createUser
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: integer
                    format: int64
                    description: ID of the created user.
          links:
            GetUserByUserId:
              operationId: getUser
              parameters:
                userId: '$response.body#/id'
  /users/{userId}:
    get:
      summary: Gets a user by ID
      operationId: getUser
      parameters:
        - in: path
          name: userId
          required: true
          schema:
            type: integer
            format: int64

在此示例中,在201对id的响应中返回的POST /users值可以用作userId中的GET /users/{userId}参数。这样,您可以定义到不同端点的请求序列。

我要注意两个仅可以基于输入的Open API规范生成和执行测试用例的工具:

  1. Schemathesis同时使用两个来源,默认情况下不需要配置。它利用基于属性的测试并验证在测试模式中定义的属性-响应代码,模式和标头。它通过Open API链接支持Open API 2和3和stateful testing,并且可以根据规范文件中的定义自动生成API请求序列。
  2. Dredd着重于示例,并提供了几个automatic expectations。它仅支持Open API 2,第三个版本为experimental

两者均提供CLI,并且可以通过各种挂钩进行扩展以适合所需的工作流程。