## Phase 3 实施完成 ### P3-1: 前端轮询优化 (ljwx-phone) - ✅ 实现指数退避轮询器 (ExponentialBackoffPoller) - 初始间隔 2s,最大间隔 30s - 随机抖动 ±20% 避免惊群效应 - 自动重置机制 ### P3-2: SSE 实时推送 (ljwx-phone) - ✅ 实现 SSE 客户端服务 (SseClient) - 自动重连机制 (指数退避) - 心跳检测 (30s 超时) - 事件类型路由 ### P3-3: 批量审批确认机制 - ✅ 后端 confirmToken 机制 - Redis 存储,5分钟过期 - 防重放攻击 - 批量操作原子性保证 - ✅ 前端确认弹窗 (BatchApprovalConfirmModal.vue) - 显示待审批设备列表 - 二次确认交互 ### P3-4: 设备绑定 V2 API (HMAC-SHA256 签名验证) - ✅ DeviceBindEventController - SSE 事件推送 - ✅ DeviceSignatureService - HMAC-SHA256 签名验证 - ✅ DeviceKeyService - 设备密钥管理 - ✅ ChallengeVO, ConfirmTokenVO - V2 API 响应对象 - ✅ BindRequestStatus - 绑定请求状态枚举 ## E2E 测试基础设施 ### 测试脚本 - ✅ test_e2e_flow.py - 完整端到端测试 - 租户/部门/员工创建 - 设备注册与绑定 - 健康数据上传与查询 - 告警与消息生成 - ✅ test_device_binding_v2.py - 设备绑定 V2 API 测试 - Challenge 获取 - HMAC-SHA256 签名验证 - 绑定请求提交 - 审批流程测试 ### 测试配置 - ✅ api-map.yaml - 新增 device_binding_v2 API 映射 - 11 个 V2 API 端点完整定义 - 请求/响应 schema 规范 - ✅ recipes/device_binding_v2_test.yaml - V2 测试场景配置 ### 测试文档 - ✅ E2E_FLOW_TEST_GUIDE.md - E2E 测试指南 - ✅ DEVICE_BINDING_V2_TEST_GUIDE.md - V2 API 测试指南 - ✅ device-binding-phase3-implementation-report.md - Phase 3 实施报告 ## 修复问题 - 🐛 修复 UserContext API 调用错误 - getUserId() → getCurrentUserId() - getUserName() → getCurrentUserName() - 🐛 修复 TDeviceUser 实体方法调用 - setUpdatedAt() → setUpdateTime() - 🐛 修复 BizException 构造函数签名 - 🐛 修复测试脚本 API 端点 - /t_org/ → /sys_org_units/ - /t_user/ → /sys_user/ - 🐛 修复认证头格式 - satoken: <token> → Authorization: Bearer <token> ## 测试状态 - ✅ 编译通过,应用启动成功 (端口 9998) - ✅ E2E 测试步骤 1-4 通过 (租户/部门/员工/设备注册) - ⏳ 步骤 5-8 待完成 (需配置设备密钥) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
LJWX Boot 测试套件
概述
LJWX Boot 测试套件提供全面的自动化测试和可视化报告功能,包括:
- 单元测试 - JUnit 5 测试框架
- 代码覆盖率 - JaCoCo 覆盖率分析
- 可视化报告 - 美观的 HTML 测试报告和摘要
- CI/CD 集成 - Gitea Actions 自动测试流程
快速开始
本地运行测试
# 进入 ljwx-boot 目录
cd ljwx-boot
# 运行测试脚本(推荐)
./scripts/run-tests.sh
# 或者使用 Maven 直接运行
mvn clean test -Ptest -Dspring.profiles.active=test
查看测试报告
运行测试后,会生成以下报告:
-
可视化测试报告 -
target/test-report-visualization.html- 汇总测试结果和覆盖率
- 交互式测试套件展示
- 美观的可视化图表
-
JaCoCo 覆盖率报告 -
ljwx-boot-modules/target/site/jacoco/index.html- 详细的代码覆盖率分析
- 包级别、类级别、方法级别覆盖率
- 未覆盖代码高亮显示
-
JUnit 原始报告 -
ljwx-boot-modules/target/surefire-reports/- XML 和文本格式的测试结果
自动打开报告
# 运行测试并自动在浏览器中打开报告
./scripts/run-tests.sh --open
脚本使用
run-tests.sh
测试执行脚本,提供便捷的测试运行和报告生成功能。
语法:
./scripts/run-tests.sh [选项]
选项:
--skip-clean- 跳过清理旧报告--open- 自动打开测试报告--help- 显示帮助信息
示例:
# 运行测试并自动打开报告
./scripts/run-tests.sh --open
# 运行测试但保留旧报告
./scripts/run-tests.sh --skip-clean
# 运行测试并自动打开报告,跳过清理
./scripts/run-tests.sh --skip-clean --open
generate-test-report.py
测试报告生成器,从 JUnit 和 JaCoCo 报告生成可视化 HTML 页面。
语法:
python3 scripts/generate-test-report.py [项目根目录]
输出:
target/test-report-visualization.html- 可视化 HTML 报告target/test-summary.json- JSON 格式的测试摘要
示例:
# 在 ljwx-boot 目录中运行
cd ljwx-boot
python3 scripts/generate-test-report.py .
# 从其他目录运行
python3 ljwx-boot/scripts/generate-test-report.py ljwx-boot
CI/CD 集成
Gitea Actions 工作流
项目配置了两个测试相关的工作流:
1. 独立测试工作流(.gitea/workflows/test.yml)
专门用于运行测试的工作流,不涉及构建和部署。
触发条件:
- Push 到 main/develop 分支,且 ljwx-boot 代码有变更
- Pull Request 到 main/develop 分支
- 手动触发(workflow_dispatch)
输出:
- GitHub Actions Summary 显示测试摘要
- 上传测试报告工件(Artifacts),保留 30 天
- 测试失败时 CI 失败
2. CI/CD 主流程(.gitea/workflows/ci-cd.yml)
在构建和部署之前运行测试。
流程:
test-boot- 运行测试(前置条件)build-boot- 构建镜像(测试通过后)build-admin- 构建前端镜像build-bigscreen- 构建大屏镜像deploy-to-k8s- 部署到 K8s
特性:
- 测试失败时不会触发构建
- 测试报告作为工件上传,保留 7 天
- 在 Actions 页面可以直接查看测试摘要
查看 CI 测试报告
- 进入 Gitea 仓库页面
- 点击 Actions 标签
- 选择对应的工作流运行
- 在 Summary 中查看测试摘要
- 点击 Artifacts 下载详细报告
测试报告内容
测试结果指标
- 总测试数 - 执行的测试用例总数
- 通过数 - 成功通过的测试用例
- 失败数 - 失败的测试用例
- 跳过数 - 被跳过的测试用例
- 成功率 - 通过测试的百分比
代码覆盖率指标
- 行覆盖率 (Line Coverage) - 执行到的代码行百分比
- 分支覆盖率 (Branch Coverage) - 执行到的分支百分比
- 方法覆盖率 (Method Coverage) - 调用到的方法百分比
- 类覆盖率 (Class Coverage) - 测试到的类百分比
覆盖率门槛
项目配置了以下覆盖率门槛(ljwx-boot-modules/pom.xml):
- 行覆盖率: ≥ 40%
- 分支覆盖率: ≥ 30%
- 类行覆盖率: ≥ 30%
未达到门槛时会有警告,但不会阻止构建(haltOnFailure=false)。
Maven 配置
测试专用 Profile
项目定义了 test profile(pom.xml),用于测试环境:
<profile>
<id>test</id>
<properties>
<env>test</env>
<maven.test.skip>false</maven.test.skip>
</properties>
</profile>
使用方法:
mvn test -Ptest -Dspring.profiles.active=test
关键插件
-
maven-surefire-plugin (3.2.5)
- 运行单元测试
- 生成 JUnit XML 报告
-
jacoco-maven-plugin (0.8.12)
- 生成代码覆盖率报告
- 检查覆盖率门槛
- 输出 HTML、XML、CSV 格式
-
maven-surefire-report-plugin (3.2.5)
- 生成 HTML 测试报告
测试最佳实践
编写测试
@SpringBootTest
class UserServiceTest {
@Autowired
private UserService userService;
@Test
@DisplayName("应该成功创建用户")
void shouldCreateUserSuccessfully() {
// Given
UserDTO userDTO = new UserDTO("test@example.com", "张三");
// When
User createdUser = userService.createUser(userDTO);
// Then
assertThat(createdUser).isNotNull();
assertThat(createdUser.getEmail()).isEqualTo("test@example.com");
assertThat(createdUser.getName()).isEqualTo("张三");
}
}
测试命名规范
- 测试类:
*Test.java或*Tests.java - 测试方法: 使用
@DisplayName提供清晰的中文描述 - 遵循 Given-When-Then 模式
提高覆盖率
- 优先测试业务逻辑 - Service 层和 Controller 层
- 边界条件测试 - 空值、异常情况
- 集成测试 - 多个组件协同工作
- Mock 外部依赖 - 使用 Mockito 模拟外部服务
故障排查
问题: 测试报告未生成
可能原因:
- 测试未执行或全部失败
- JaCoCo 插件配置错误
解决方法:
- 检查
target/surefire-reports/目录是否存在 - 查看 Maven 日志确认测试是否执行
- 确认
jacoco-maven-plugin在 pom.xml 中正确配置
问题: Python 脚本执行失败
可能原因:
- Python 3 未安装
- 依赖的 XML 文件不存在
解决方法:
# 检查 Python 版本
python3 --version
# 手动运行脚本查看错误
cd ljwx-boot
python3 scripts/generate-test-report.py .
问题: CI 测试失败
排查步骤:
- 在 Gitea Actions 页面查看日志
- 下载测试报告工件查看详细失败信息
- 本地复现测试:
mvn clean test -Ptest - 检查测试环境配置(数据库、Redis 等)
相关文件
- 测试脚本:
ljwx-boot/scripts/run-tests.sh - 报告生成器:
ljwx-boot/scripts/generate-test-report.py - Maven 配置:
ljwx-boot/pom.xml - 模块配置:
ljwx-boot-modules/pom.xml - 测试工作流:
.gitea/workflows/test.yml - CI/CD 工作流:
.gitea/workflows/ci-cd.yml
支持
如有问题或建议,请联系团队或在项目仓库创建 Issue。