2026-05-01 21:27:39 +08:00
|
|
|
|
# iOS SDK 测试报告
|
|
|
|
|
|
|
|
|
|
|
|
> **生成时间**: 2026-05-01
|
|
|
|
|
|
> **版本**: 0.1.0
|
|
|
|
|
|
> **测试状态**: 部分功能待测试
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 测试环境
|
|
|
|
|
|
|
|
|
|
|
|
| 项目 | 版本/配置 |
|
|
|
|
|
|
|------|-----------|
|
|
|
|
|
|
| Xcode | 16.0 |
|
|
|
|
|
|
| iOS 模拟器 | iPhone 16 Pro(iOS 18.0) |
|
|
|
|
|
|
| Swift | 5.9+ |
|
|
|
|
|
|
| Swift Tools Version | 5.9 |
|
|
|
|
|
|
| 最低 iOS 版本 | iOS 14 |
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 测试用例清单
|
|
|
|
|
|
|
|
|
|
|
|
### TC-01 SDK 初始化测试
|
|
|
|
|
|
|
|
|
|
|
|
| 字段 | 内容 |
|
|
|
|
|
|
|------|------|
|
|
|
|
|
|
| **测试目的** | 验证 SDK 初始化及模块配置 |
|
|
|
|
|
|
| **测试步骤** | 1. 在 `AppDelegate` 中调用 `XuqmSDK.shared.initialize(config: SDKConfig(appId:appSecret:))` <br> 2. 确认 `XuqmSDK.shared.requireConfig()` 返回有效配置 <br> 3. 确认 `ApiClient.shared` 已配置 baseURL 与拦截器 |
|
|
|
|
|
|
| **预期结果** | 1. 初始化成功,无 fatalError <br> 2. `config.appId` 与传入值一致 <br> 3. `TokenStore` 已实例化 |
|
|
|
|
|
|
| **实际结果** | 待测试 |
|
|
|
|
|
|
| **通过状态** | ⬜ |
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
### TC-02 IM 登录/登出测试(UserSig 模式)
|
|
|
|
|
|
|
|
|
|
|
|
| 字段 | 内容 |
|
|
|
|
|
|
|------|------|
|
|
|
|
|
|
| **测试目的** | 验证 UserSig 鉴权登录与登出流程 |
|
2026-05-02 11:29:50 +08:00
|
|
|
|
| **测试步骤** | 1. 调用 `XuqmSDK.shared.login(userId: "user_001", userSig: "xxx")` <br> 2. 观察 `ImSDK.shared.login` 内部触发 WebSocket 连接 <br> 3. 监听 `ImEventDelegate.imClientDidConnect()` <br> 4. 调用 `XuqmSDK.shared.logout()` <br> 5. 确认 `ImSDK.shared.disconnect()` 执行,Push Token 解注册 |
|
2026-05-01 21:27:39 +08:00
|
|
|
|
| **预期结果** | 1. `currentUserId` 被赋值 <br> 2. WebSocket 连接成功,状态变为 `.connecting` → `.connected` <br> 3. delegate `imClientDidConnect()` 触发 <br> 4. 登出后 `currentUserId` 置 nil <br> 5. `PushSDK.shared.unregisterToken` 被调用 |
|
|
|
|
|
|
| **实际结果** | 待测试 |
|
|
|
|
|
|
| **通过状态** | ⬜ |
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
### TC-03 单聊消息收发测试
|
|
|
|
|
|
|
|
|
|
|
|
| 字段 | 内容 |
|
|
|
|
|
|
|------|------|
|
|
|
|
|
|
| **测试目的** | 验证单聊消息发送、接收、历史与已读 |
|
|
|
|
|
|
| **测试步骤** | 1. 调用 `ImSDK.shared.sendTextMessage(toId:chatType:content:)` <br> 2. 接收方通过 `ImEventDelegate.imClientDidReceiveMessage(_:)` 接收 <br> 3. 调用 `fetchHistory(toId:page:size:)` <br> 4. 调用 `markRead(targetId:chatType:)` <br> 5. 发送方重新拉取历史,确认 `status == .read` |
|
|
|
|
|
|
| **预期结果** | 1. 返回 `ImMessage`,`status` 为 `.sending` 或 `.sent` <br> 2. 接收方实时收到消息,未读角标 +1 <br> 3. 历史消息返回 `[ImMessage]` <br> 4. `markRead` HTTP 200,未读清零 <br> 5. 发送方消息状态更新为 `.read` |
|
|
|
|
|
|
| **实际结果** | 待测试 |
|
|
|
|
|
|
| **通过状态** | ⬜ |
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
### TC-04 群聊消息收发测试
|
|
|
|
|
|
|
|
|
|
|
|
| 字段 | 内容 |
|
|
|
|
|
|
|------|------|
|
|
|
|
|
|
| **测试目的** | 验证群创建、订阅、群消息收发与历史 |
|
|
|
|
|
|
| **测试步骤** | 1. 调用 `createGroup(name:memberIds:groupType:)` <br> 2. 双端调用 `subscribeGroup(_:)` <br> 3. 发送方调用 `sendTextMessage(toId:chatType:content:)`(chatType=.group) <br> 4. 接收方通过 `imClientDidReceiveGroupMessage(_:)` 接收 <br> 5. 双端调用 `fetchGroupHistory(groupId:page:size:)` |
|
|
|
|
|
|
| **预期结果** | 1. 返回 `ImGroup`,`memberIds` 包含指定用户 <br> 2. WebSocket 订阅 `/topic/group/{groupId}` 成功 <br> 3. 群消息发送成功 <br> 4. 群成员实时收到消息 <br> 5. 群历史正确分页 |
|
|
|
|
|
|
| **实际结果** | 待测试 |
|
|
|
|
|
|
| **通过状态** | ⬜ |
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
### TC-05 连接状态监听测试(新增)
|
|
|
|
|
|
|
|
|
|
|
|
| 字段 | 内容 |
|
|
|
|
|
|
|------|------|
|
|
|
|
|
|
| **测试目的** | 验证 `connectionState` 属性与 `addConnectionStateListener` 回调 |
|
|
|
|
|
|
| **测试步骤** | 1. 添加 `addConnectionStateListener { state in print(state) }` <br> 2. 触发登录,观察状态流转 <br> 3. 手动断开网络,观察重连状态 <br> 4. 恢复网络,观察恢复为 `.connected` <br> 5. 调用 `disconnect()`,观察 `.disconnected` |
|
|
|
|
|
|
| **预期结果** | 1. 监听器被加入数组 <br> 2. 登录时状态变化:`.disconnected` → `.connecting` → `.connected` <br> 3. 断网后状态变为 `.disconnected` 并触发重连 <br> 4. 恢复网络后回到 `.connected` <br> 5. `disconnect()` 后状态为 `.disconnected`,监听器仍保留(不移除) |
|
|
|
|
|
|
| **实际结果** | 待测试 |
|
|
|
|
|
|
| **通过状态** | ⬜ |
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
### TC-06 Push 设备注册测试(APNs + FCM)
|
|
|
|
|
|
|
|
|
|
|
|
| 字段 | 内容 |
|
|
|
|
|
|
|------|------|
|
|
|
|
|
|
| **测试目的** | 验证 APNs 设备 Token 获取、注册与 FCM 备选方案 |
|
|
|
|
|
|
| **测试步骤** | 1. 在 `AppDelegate` 中调用 `PushSDK.shared.requestAuthorization()` <br> 2. 系统授权后 `UIApplication.shared.registerForRemoteNotifications()` <br> 3. 在 `didRegisterForRemoteNotificationsWithDeviceToken` 中调用 `XuqmSDK.shared.registerDeviceToken(_:)` <br> 4. 确认 `PushSDK.shared.registerToken(token:userId:vendor:)` 调用(vendor=.apns) <br> 5. 若集成 Firebase,验证 `registerFcmToken` 路径 |
|
|
|
|
|
|
| **预期结果** | 1. `requestAuthorization` 返回 `true` <br> 2. 系统弹窗申请通知权限 <br> 3. `cachedDeviceToken` 被保存 <br> 4. `/api/push/register` 返回 200 <br> 5. FCM 路径返回 vendor=FCM,注册成功 |
|
|
|
|
|
|
| **实际结果** | 待测试 |
|
|
|
|
|
|
| **通过状态** | ⬜ |
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
### TC-07 版本更新检查测试
|
|
|
|
|
|
|
|
|
|
|
|
| 字段 | 内容 |
|
|
|
|
|
|
|------|------|
|
|
|
|
|
|
| **测试目的** | 验证 UpdateSDK 检查 App Store 更新 |
|
|
|
|
|
|
| **测试步骤** | 1. 调用 `UpdateSDK.shared.checkAppUpdate(currentVersionCode: 1)` <br> 2. 若 `needsUpdate=true` 且 `forceUpdate=true`,调用 `openAppStore(url:)` <br> 3. 观察是否能正确跳转到 App Store 或下载页 |
|
|
|
|
|
|
| **预期结果** | 1. 返回 `AppUpdateInfo`,`platform=IOS` <br> 2. `forceUpdate` 为布尔值,下载链接有效 <br> 3. `UIApplication.shared.open` 成功跳转 |
|
|
|
|
|
|
| **实际结果** | 待测试 |
|
|
|
|
|
|
| **通过状态** | ⬜ |
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
### TC-08 UserSig 过期检测测试(新增)
|
|
|
|
|
|
|
|
|
|
|
|
| 字段 | 内容 |
|
|
|
|
|
|
|------|------|
|
|
|
|
|
|
| **测试目的** | 验证 `XuqmSDK` 解析 UserSig JWT exp 并在过期前触发回调 |
|
|
|
|
|
|
| **测试步骤** | 1. 生成一个 exp 为当前时间 + 6 分钟的 UserSig JWT <br> 2. 调用 `XuqmSDK.shared.login(userId:userSig:)` <br> 3. 设置 `XuqmSDK.shared.onUserSigExpired = { ... }` <br> 4. 等待 1 分钟,观察 Timer 是否在正确时间点触发 <br> 5. 触发后调用 `logout()`,确认 Timer 被 `invalidate` |
|
|
|
|
|
|
| **预期结果** | 1. `extractExpirationDate` 正确解析 JWT payload <br> 2. `startUserSigExpirationTimer` 创建 `Timer` <br> 3. 到期前 5 分钟触发 `onUserSigExpired?()` <br> 4. 回调在主线程执行 <br> 5. `logout()` 后 `userSigTimer` 为 nil,无内存泄漏 |
|
|
|
|
|
|
| **实际结果** | 待测试 |
|
|
|
|
|
|
| **通过状态** | ⬜ |
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 测试汇总
|
|
|
|
|
|
|
|
|
|
|
|
| 用例编号 | 用例名称 | 状态 |
|
|
|
|
|
|
|---------|---------|------|
|
|
|
|
|
|
| TC-01 | SDK 初始化测试 | ⬜ 待测试 |
|
|
|
|
|
|
| TC-02 | IM 登录/登出测试(UserSig 模式) | ⬜ 待测试 |
|
|
|
|
|
|
| TC-03 | 单聊消息收发测试 | ⬜ 待测试 |
|
|
|
|
|
|
| TC-04 | 群聊消息收发测试 | ⬜ 待测试 |
|
|
|
|
|
|
| TC-05 | 连接状态监听测试 | ⬜ 待测试 |
|
|
|
|
|
|
| TC-06 | Push 设备注册测试(APNs + FCM) | ⬜ 待测试 |
|
|
|
|
|
|
| TC-07 | 版本更新检查测试 | ⬜ 待测试 |
|
|
|
|
|
|
| TC-08 | UserSig 过期检测测试 | ⬜ 待测试 |
|