前言
随着微服务架构的广泛应用,API作为系统间通信的桥梁变得越来越重要。如何保证API的稳定性和正确性,成为了开发团队面临的重要挑战。本文将为大家介绍一套基于BDD(行为驱动开发)的API自动化测试框架,该框架专为保利威直播API测试而设计,支持中文测试描述,简化了测试编写流程,提高了测试效率。
一、框架核心理念
我们打造的API测试框架基于以下几个核心理念:
- 业务语言驱动测试:使用中文Gherkin语法编写测试场景,让测试脚本更接近业务描述,降低技术门槛
- 关注点分离:将请求准备、发送、响应验证分离,使测试脚本结构清晰
- 数据生命周期管理:自动创建和清理测试数据,避免测试数据污染
- 通用步骤复用:提供丰富的预定义步骤,减少重复代码
- 全面的测试类型支持:支持各种测试场景,从基础功能到边界条件
二、技术栈与架构
该框架采用了以下技术栈:
- Cucumber.js:提供BDD测试驱动能力
- PactumJS:强大的API测试库
- TypeScript:提供类型安全保障
- Chai:断言库
整体架构如下:
polyv-live-openapi-tests/
├── .cursor/ # Cursor IDE配置
│ └── rules/ # 开发规范和指引
│ └── tasks/ # 任务相关规范文件
│ ├── 010-feature-generation.mdc # 特性文件生成规范
│ ├── 020-scene-generation.mdc # 场景添加规范
│ ├── 030-data-lifecycle.mdc # 数据生命周期管理规范
│ └── 040-scenario-patterns.mdc # 场景模式规范
├── docs/ # API文档目录
├── scripts/ # 工具脚本
├── src/
│ ├── api/ # API请求封装
│ │ └── urls.ts # API URL配置
│ ├── features/ # 功能测试文件,按模块组织
│ │ ├── account/ # 账户相关功能
│ │ ├── channel/ # 频道相关功能
│ │ ├── user/ # 用户相关功能
│ │ └── robot/ # 机器人相关功能
│ ├── steps/ # 步骤定义
│ │ └── common/ # 通用步骤定义
│ │ ├── api.steps.ts # API测试步骤
│ │ └── data.steps.ts # 数据准备步骤
│ ├── support/ # 支持文件
│ └── snapshots/ # 快照测试文件
├── test/ # 单元测试
├── test-snapshots/ # 测试快照目录
├── logs/ # 日志文件
├── .env.example # 环境变量示例
├── .env # 环境变量配置
├── cucumber.js # Cucumber配置
├── package.json # 项目配置
└── tsconfig.json # TypeScript配置
三、项目规范与开发流程
1. 特性文件组织规范
特性文件(.feature)是测试的核心,遵循严格的组织规范:
- 按业务模块组织(如账户、频道、用户等)
- 一个特性文件对应一个API功能
- 使用统一的标签命名规范
例如,一个典型的特性文件如下:
# API文档路径: docs/channel/update_channelname.md
@channel @update_channel_name
Feature: 修改频道名称
作为直播管理员
我希望能够修改直播频道的名称
以便于更新频道信息
@update @create
Scenario: 成功修改频道名称
# 先创建一个测试频道
Given 创建一个新频道
And 我保存响应中 "data.channelId" 到上下文的 "channelId"
# 更新频道名称
When 我设置查询参数 "name" 为 "更新后的频道名称"
And 我设置路径参数 "channelId" 为 "{context.channelId}"
And 我基于键名 "CHANNEL.UPDATE_NAME" 发送请求
Then 响应状态码应为 200
And 响应JSON应匹配
"""
{
"code": 200,
"status": "success",
"message": "",
"data": true
}
"""
2. 流程化的测试开发
我们建立了一套完整的测试开发流程:
- 特性文件生成:根据API文档生成基础特性文件
- 场景添加:为特性添加各种测试场景
- 执行测试:通过标签选择性执行测试
- 报告生成:自动生成测试报告
整个流程使用特定命令简化操作:
# 根据API URL生成特性文件
/add_feat -u https://example.api.polyv.net/api/doc/channel/update 修改频道名称
# 为现有特性添加测试场景
/add_scene src/features/channel/update_channel_name.feature
# 运行带特定标签的测试
/test channel update
四、测试步骤库
框架提供了丰富的预定义步骤,覆盖API测试全流程:
1. 请求准备阶段
# 设置查询参数
我设置查询参数 "name" 为 "测试频道"
# 设置请求体
我设置JSON请求体为表格数据
| 字段名 | 值 |
| name | 测试频道 |
2. 请求发送阶段
# 简化版请求发送(推荐)
我基于键名 "CHANNEL.UPDATE_NAME" 发送请求
# 带方法的请求发送
我基于键名 "CHANNEL.UPDATE_NAME" 发送 "POST" 请求
3. 响应验证阶段
# 状态码验证
响应状态码应为 200
# JSON结构验证
响应JSON应匹配
"""
{
"code": 200,
"data": {
"id": "*", # 任意值匹配
"name": "*测试*" # 包含"测试"的字符串
}
}
"""
# 字段验证
响应字段 "data.success" 应为 true
五、数据生命周期管理
测试数据管理是API测试的难点,我们通过工厂模式和自动清理机制解决:
- 通用创建步骤:提供便捷的资源创建步骤
# 创建测试数据 Given 创建一个新频道 And 我保存响应中 "data.channelId" 到上下文的 "channelId"
- 自动数据清理:使用标签触发清理钩子
@channel @create @update Scenario: 成功修改频道名称 # 带@create标签的场景会自动清理创建的资源
- 上下文数据共享:通过上下文传递数据
# 使用上下文中的数据 When 我设置路径参数 "channelId" 为 "{context.channelId}"
六、高级功能特性
1. 深度JSON匹配
支持通配符、模式匹配和部分匹配验证:
响应JSON应匹配
"""
{
"code": 200,
"data": {
"id": "*", # 任意值匹配
"name": "*测试*", # 包含"测试"的字符串
"createTime": "*" # 任意值匹配
}
}
"""
2. 快照测试
自动创建和验证API响应快照:
# 创建或验证快照
我保存或验证快照 "channel/update_channel_name_response"
3. 表格式输入
支持表格式输入,增强可读性:
我设置查询参数表格数据
| 字段名 | 值 |
| pageNumber | 1 |
| pageSize | 10 |
七、开发规范体系
为确保测试质量和团队协作,我们建立了完善的规范体系:
- Feature 文件生成规范:统一文件结构和命名
- 场景添加规范:定义场景类型和编写原则
- 数据生命周期规范:规范化测试数据管理
- 场景模式规范:支持Scenario Outline等高级模式
这些规范通过项目中的 .cursor/rules
目录下的规范文件进行管理,确保团队成员遵循统一标准。
八、测试命令与工作流
开发者通过简单的命令执行测试流程:
# 执行所有测试
/test
# 执行特定标签测试
/test channel update
# 生成特性文件
/add_feat -u API_URL 功能描述
# 添加测试场景
/add_scene 特性文件路径
这些命令极大简化了测试开发流程,提高了团队效率。
九、实际应用效果
该框架已在保利威直播API测试中得到实际应用,实现了以下成效:
- 测试编写效率提升:通过预定义步骤和自动生成,降低了测试编写门槛
- 覆盖率增加:系统化的测试场景设计,确保API功能全面覆盖
- 可维护性提升:统一的规范和组织方式,使测试代码易于维护
- 测试报告自动化:生成详细的测试报告,便于问题定位
十、总结与展望
本文介绍的BDD API测试框架实现了”用中文描述测试,用代码验证API”的目标,将业务语言和技术验证无缝结合。这种测试方式不仅提高了测试效率,还促进了业务人员对测试的理解和参与。
未来,我们计划进一步优化框架,增加更多特性:
- 支持多环境测试配置
- 增强跨API依赖测试
- 扩展自动化数据生成能力
希望本文对大家构建API测试框架有所启发,也欢迎交流与讨论!
开源地址
框架已开源,欢迎访问:
https://github.com/terryso/polyv-live-openapi-tests