3. OpenAPI 规范版本差异:Swagger 2.0 vs OpenAPI 3.0 vs OpenAPI 3.1

在迁移 OpenAPI 规范时,版本差异是回归冒烟测试的核心关注点。Swagger 2.0、OpenAPI 3.0 和 OpenAPI 3.1 在顶层结构、数据类型系统、安全定义和组件复用机制上存在显著变化。理解这些差异,是编写回归冒烟清单的前提。

核心原则: 回归冒烟清单应覆盖每个版本独有的结构字段,确保 CI 流水线在版本升级后不会遗漏关键元数据或安全配置。

3.1 顶层结构差异:info 对象与版本声明

三个版本的 info 对象在必填字段和扩展能力上有所不同,直接影响 API 文档的元数据完整性。

字段 / 特性 Swagger 2.0 OpenAPI 3.0 OpenAPI 3.1
版本声明字段 swagger: "2.0" openapi: "3.0.x" openapi: "3.1.x"
info 必填字段 title, version title, version title, version
info 可选字段 description, termsOfService, contact, license description, termsOfService, contact, license description, termsOfService, contact, license
license 对象 仅 name 必填 name 必填,url 可选 name 必填,url 可选,支持 identifier
JSON Schema 兼容 自定义子集 扩展子集 完全兼容 JSON Schema 2020-12
回归冒烟检查点: 在 CI 回归脚本中,应验证 info.version 字段是否与发布版本号一致;对于 3.1 迁移,需额外检查 license.identifier 是否被正确解析。

3.2 paths 与操作对象的演进

paths 是 API 路由定义的核心。3.0 引入了 requestBody 替代 2.0 的 body 参数,3.1 则进一步统一了参数描述方式。

  • Swagger 2.0: 参数定义在 parameters 列表中,body 参数通过 in: body 和 schema 字段描述。
  • OpenAPI 3.0: 引入独立的 requestBody 对象,支持 content 媒体类型映射;parameters 仅用于 query、path、header、cookie。
  • OpenAPI 3.1: 保持 3.0 结构,但 schema 字段完全遵循 JSON Schema 2020-12,支持 $defs 和 examples 数组。
# Swagger 2.0 示例
paths:
  /pets:
    post:
      parameters:
        - in: body
          name: pet
          required: true
          schema:
            $ref: '#/definitions/Pet'

# OpenAPI 3.0 / 3.1 示例
paths:
  /pets:
    post:
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Pet'
迁移陷阱: 2.0 的 definitions 在 3.0+ 中变为 components/schemas;responses 中的 schema 引用路径也必须同步更新。回归冒烟清单必须包含引用路径的完整性校验。

3.3 components 与复用机制

components 是 3.0 引入的集中式复用容器,替代了 2.0 分散的 definitions、parameters、responses 顶层字段。

复用类型 Swagger 2.0 OpenAPI 3.0 / 3.1
数据模型 definitions components/schemas
参数 parameters components/parameters
响应 responses components/responses
请求体 无独立复用区 components/requestBodies
安全方案 securityDefinitions components/securitySchemes
回调 不支持 components/callbacks
链接 不支持 components/links
回归冒烟策略: 在 CI 回归脚本中,对每个 $ref 引用执行存在性检查,确保 2.0 的 #/definitions/ 引用已全部迁移为 #/components/schemas/。

3.4 安全定义:从 securityDefinitions 到 securitySchemes

安全定义是 API 迁移中最容易出错的区域。3.0 将 2.0 的 securityDefinitions 重构为 components/securitySchemes,并增加了 OAuth2 流程的细粒度支持。

安全定义版本迁移对比 Swagger 2.0 securityDefinitions - basic / apiKey / oauth2 - OAuth2 仅支持 implicit / accessCode - 全局 security 作用于所有路径 OpenAPI 3.0 / 3.1 components/securitySchemes - basic / apiKey / oauth2 / openIdConnect - OAuth2 支持 6 种流程 - 支持操作级 security 覆盖 关键差异说明 1. 字段路径变化:securityDefinitions → components/securitySchemes 2. OAuth2 流程扩展:新增 clientCredentials / authorizationCode 3. 新增 openIdConnect 类型,支持 OIDC 发现 4. 安全作用域:2.0 全局 vs 3.0+ 支持操作级覆盖
回归冒烟检查点: 在 CI 回归脚本中,应验证所有 securityDefinitions 引用已迁移为 components/securitySchemes;对于 OAuth2 流程,检查 flows 对象是否包含正确的 authorizationUrl 和 tokenUrl。

3.5 数据类型系统:从 Swagger 子集到 JSON Schema 2020-12

数据类型定义是版本迁移中最深层的变更。3.1 完全采用 JSON Schema 2020-12,带来了更丰富的约束表达能力和 $defs 递归引用。

特性 Swagger 2.0 OpenAPI 3.0 OpenAPI 3.1
基础类型 type + format type + format JSON Schema 类型系统
nullable 通过 x-nullable 扩展 内置 nullable: true 使用 type: ["string", "null"]
示例 example 字段 example 字段 examples 数组 + example
递归引用 有限支持 通过 $ref 支持 通过 $defs 原生支持
条件约束 不支持 不支持 if/then/else 等
# OpenAPI 3.1 数据类型示例
components:
  schemas:
    Pet:
      type: object
      properties:
        id:
          type: integer
        name:
          type: string
        tag:
          type: [string, null]   # 3.1 方式
      required:
        - id
        - name
迁移陷阱: 3.0 的 nullable: true 在 3.1 中必须改为 type: ["original", "null"];example 字段在 3.1 中建议迁移为 examples 数组。回归冒烟清单应包含对 nullable 和 example 的兼容性检查。

3.6 版本差异回归冒烟清单

基于上述差异,以下回归冒烟清单可直接集成到 CI 流水线中,用于验证迁移后的 OpenAPI 规范文件。

检查项 涉及版本 CI 验证方式
版本声明字段正确性 2.0 → 3.0 → 3.1 正则匹配 swagger: 或 openapi:
info 对象必填字段 全部 JSON Schema 校验
license 对象 identifier 字段 3.1 字段存在性检查
definitions → schemas 迁移 2.0 → 3.0+ 引用路径替换校验
securityDefinitions → securitySchemes 2.0 → 3.0+ 字段路径映射检查
nullable 语法兼容性 3.0 → 3.1 检测 nullable 字段并告警
requestBody 结构完整性 2.0 → 3.0+ 检查 content 媒体类型
OAuth2 flows 对象 3.0+ 验证 authorizationUrl / tokenUrl
CI 集成建议: 使用 spectral 或 vacuum 等 lint 工具,在 CI 回归阶段自动执行上述检查项,并输出结构化报告。对于 3.0 → 3.1 迁移,建议额外启用 oas3-1-schema 规则集。