XuqmGroup-AndroidSDK/TEST_REPORT.md
XuqmGroup 20fc57ac97 docs: 添加 SDK API 重设计、安全设计规范和测试进度跟踪文档
- 新增 SDK API 重设计规范文档,统一各端 SDK 初始化、登录、消息接口
- 新增安全设计规范文档,涵盖密码安全、AppSecret 验证、令牌存储等安全要点
- 新增 Bug 跟踪记录文档,记录已修复问题和开放问题
- 新增测试进度跟踪文档,记录各模块测试覆盖情况和验证结果
2026-05-02 11:45:43 +08:00

148 行
7.6 KiB
Markdown

此文件含有模棱两可的 Unicode 字符

此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

# Android SDK 测试报告
> **生成时间**: 2026-05-01
> **版本**: 0.4.xUserSig 鉴权)
> **测试状态**: 部分功能待测试
---
## 测试环境
| 项目 | 版本/配置 |
|------|-----------|
| Android Studio | Android Studio Ladybug \| 2024.2.1 |
| Android Gradle Plugin | 8.7.0 |
| Gradle | 8.9 |
| JDK | OpenJDK 21 |
| 模拟器 1 | emulator-5556Pixel 8 API 35 |
| 模拟器 2 | emulator-5558Pixel 8 API 35 |
| compileSdk | 35 |
| minSdk | 24Android 7.0 |
| Kotlin | 2.0.21 |
---
## 测试用例清单
### TC-01 SDK 初始化测试
| 字段 | 内容 |
|------|------|
| **测试目的** | 验证 SDK 初始化流程及模块依赖注入 |
| **测试步骤** | 1. 在 `Application.onCreate()` 中调用 `XuqmSDK.initialize(context, appKey, logLevel)` <br> 2. 确认 `XuqmSDK.config`、`tokenStore` 已赋值 <br> 3. 确认 `ApiClient` 已初始化 |
| **预期结果** | 1. 初始化成功,无异常抛出 <br> 2. `XuqmSDK.requireInit()` 不抛异常 <br> 3. `ServiceEndpointRegistry` 默认使用内置生产环境地址 |
| **实际结果** | 通过 |
| **通过状态** | ✅ |
---
### TC-02 IM 登录/登出测试
| 字段 | 内容 |
|------|------|
| **测试目的** | 验证 UserSig 鉴权模式下的登录与登出 |
| **测试步骤** | 1. 调用 `XuqmSDK.login(userId, userSig)` <br> 2. 观察 `ImSDK.onSdkLogin` 是否自动触发 WebSocket 连接 <br> 3. 监听 `ImEventListener.onConnected()` <br> 4. 调用 `XuqmSDK.logout()` <br> 5. 确认 `ImSDK.onSdkLogout` 断开 WebSocket 并清空 Token |
| **预期结果** | 1. 登录返回 `XuqmLoginSession` <br> 2. WebSocket 建立 101 连接并 STOMP CONNECTED <br> 3. `onConnected()` 回调触发 <br> 4. 登出后 `connectionState` 变为 `Disconnected` <br> 5. `TokenStore` 被清空 |
| **实际结果** | 通过 |
| **通过状态** | ✅ |
---
### TC-03 单聊消息收发测试
| 字段 | 内容 |
|------|------|
| **测试目的** | 验证单聊文本消息的发送、接收、历史与已读 |
| **测试步骤** | 1. user_aemulator-5556发送文本消息给 user_b <br> 2. user_bemulator-5558通过 `ImEventListener.onMessage()` 接收实时推送 <br> 3. user_b 调用 `fetchHistory("user_a")` 查询历史 <br> 4. user_b 进入会话调用 `markRead("user_a")` <br> 5. user_a 查询历史,确认消息状态变为 `READ` |
| **预期结果** | 1. `sendTextMessage` 返回 `ImMessage`status=SENDING 或 SENT <br> 2. user_b 实时收到消息,会话列表未读角标 +1 <br> 3. 历史消息正确分页返回 <br> 4. `markRead` 返回 200,未读归零 <br> 5. user_a 历史消息中对应消息 status=READ |
| **实际结果** | 通过 |
| **通过状态** | ✅ |
---
### TC-04 群聊消息收发测试
| 字段 | 内容 |
|------|------|
| **测试目的** | 验证群创建、群消息收发、群历史加载 |
| **测试步骤** | 1. user_a 调用 `createGroup("TestGroup", listOf("user_b"))` <br> 2. user_a 调用 `subscribeGroup(groupId)` 并发送群消息 <br> 3. user_b 调用 `subscribeGroup(groupId)` 并接收 `onGroupMessage()` <br> 4. 双端调用 `fetchGroupHistory(groupId)` <br> 5. 双端调用 `listConversations()` 确认群会话出现 |
| **预期结果** | 1. 群创建成功,返回 `ImGroup` <br> 2. user_a 发送群消息成功 <br> 3. user_b 实时收到群消息 <br> 4. 群历史消息分页正确 <br> 5. 群会话出现在会话列表中 |
| **实际结果** | 通过(群会话聚合 Bug 已修复并复验) |
| **通过状态** | ✅ |
---
### TC-05 会话列表/置顶/静音测试
| 字段 | 内容 |
|------|------|
| **测试目的** | 验证会话列表查询、置顶、静音、草稿、删除 |
| **测试步骤** | 1. 发送消息后调用 `listConversations()` <br> 2. 对目标会话调用 `setConversationPinned(targetId, "SINGLE", true)` <br> 3. 调用 `setConversationMuted(targetId, "SINGLE", true)` <br> 4. 调用 `setDraft(targetId, "SINGLE", "草稿内容")` <br> 5. 调用 `deleteConversation(targetId, "SINGLE")` 后再次查询列表 |
| **预期结果** | 1. 返回包含目标会话的列表,`unreadCount` 正确 <br> 2. `isPinned=true` <br> 3. `isMuted=true` <br> 4. 草稿保存成功 <br> 5. 目标会话从列表中移除 |
| **实际结果** | 待测试 |
| **通过状态** | ⬜ |
---
### TC-06 Push 设备注册测试
| 字段 | 内容 |
|------|------|
| **测试目的** | 验证 Push SDK 设备 Token 注册与绑定 IM 用户 |
| **测试步骤** | 1. 登录后 `PushSDK.onSdkLogin` 自动触发 <br> 2. 观察 `PushSDK.initializeVendors()` 检测厂商 <br> 3. 确认 `registerDevice()` 调用 Push API <br> 4. 调用 `PushSDK.setReceivePush(context, enabled=false)` <br> 5. 登出后确认 `unregisterDevice()` 调用 |
| **预期结果** | 1. 登录后自动初始化 Push <br> 2. 正确检测厂商(如 XIAOMI / HUAWEI / FCM <br> 3. `/api/push/register` 返回 200 <br> 4. `/api/push/receive` 设置为 false <br> 5. `/api/push/unregister` 返回 200 |
| **实际结果** | 待测试(模拟器无 Firebase,FCM 会等待回调) |
| **通过状态** | ⬜ |
---
### TC-07 版本更新检查测试
| 字段 | 内容 |
|------|------|
| **测试目的** | 验证 UpdateSDK 检查更新与下载安装流程 |
| **测试步骤** | 1. 调用 `UpdateSDK.checkAppUpdate(context)` <br> 2. 若 `needsUpdate=true`,获取 `downloadUrl` <br> 3. 调用 `UpdateSDK.downloadAndInstall(context, downloadUrl)` <br> 4. 观察 APK 下载进度与安装意图跳转 |
| **预期结果** | 1. 返回 `UpdateInfo`,字段完整 <br> 2. `downloadUrl` 不为空 <br> 3. APK 下载成功并触发系统安装弹窗 <br> 4. `FileProvider` URI 权限正确,无 `FileUriExposedException` |
| **实际结果** | 待测试 |
| **通过状态** | ⬜ |
---
### TC-08 UserSig 匹配重登测试(新增)
| 字段 | 内容 |
|------|------|
| **测试目的** | 验证 `userId + userSig` 匹配时,SDK 能覆盖当前会话并重连 |
| **测试步骤** | 1. 登录后保持 WebSocket 连接 <br> 2. 使用同一 `userId` 与匹配的 UserSig 重新调用 `XuqmSDK.login()` <br> 3. 观察 `ImSDK.onSdkLogin``ImEventListener.onConnected()` <br> 4. 确认当前会话被替换 |
| **预期结果** | 1. 匹配的 UserSig 生效 <br> 2. WebSocket 使用当前登录态重连 <br> 3. SDK 侧无生命周期检测或维护机制 <br> 4. 当前会话被覆盖 <br> 5. 无内存泄漏 |
| **实际结果** | 待测试 |
| **通过状态** | ⬜ |
---
### TC-09 多厂商 Push 检测测试(新增)
| 字段 | 内容 |
|------|------|
| **测试目的** | 验证 `PushSDK.detectVendor()` 在多台设备上的厂商识别准确性 |
| **测试步骤** | 1. 在华为/小米/OPPO/vivo/荣耀/其他模拟器或真机上运行 <br> 2. 调用 `PushSDK.detectVendor()` <br> 3. 检查 `Build.MANUFACTURER` 与返回的 `PushVendor` 映射 <br> 4. 未知厂商回退到 `FCM` <br> 5. 验证 `initializeVendors()` 仅初始化匹配厂商服务 |
| **预期结果** | 1. 华为 → `HUAWEI` <br> 2. 小米 → `XIAOMI` <br> 3. OPPO → `OPPO` <br> 4. 未知品牌 → `FCM` <br> 5. 非匹配厂商服务不被注册,无 ClassNotFoundException |
| **实际结果** | 待测试 |
| **通过状态** | ⬜ |
---
## 测试汇总
| 用例编号 | 用例名称 | 状态 |
|---------|---------|------|
| TC-01 | SDK 初始化测试 | ✅ 通过 |
| TC-02 | IM 登录/登出测试 | ✅ 通过 |
| TC-03 | 单聊消息收发测试 | ✅ 通过 |
| TC-04 | 群聊消息收发测试 | ✅ 通过 |
| TC-05 | 会话列表/置顶/静音测试 | ⬜ 待测试 |
| TC-06 | Push 设备注册测试 | ⬜ 待测试 |
| TC-07 | 版本更新检查测试 | ⬜ 待测试 |
| TC-08 | UserSig 匹配重登测试 | ⬜ 待测试 |
| TC-09 | 多厂商 Push 检测测试 | ⬜ 待测试 |