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 流程的细粒度支持。
回归冒烟检查点: 在 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 规则集。