438 lines
9.2 KiB
Markdown
438 lines
9.2 KiB
Markdown
|
|
# 信贷客户家庭关系列表查询功能测试报告
|
|||
|
|
|
|||
|
|
## 测试信息
|
|||
|
|
|
|||
|
|
- **测试日期**: 2026-02-11
|
|||
|
|
- **测试人员**: Claude
|
|||
|
|
- **测试环境**: 开发环境 (localhost:8080)
|
|||
|
|
- **测试账号**: admin / admin123
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 测试场景
|
|||
|
|
|
|||
|
|
### 测试数据准备
|
|||
|
|
|
|||
|
|
在测试前创建以下测试数据:
|
|||
|
|
|
|||
|
|
| ID | personId | relationType | relationName | relationCertNo |
|
|||
|
|
|----|----------|--------------|--------------|----------------|
|
|||
|
|
| 1 | 110101199001011231 | 01 | 测试用户1 | 110101199001011234 |
|
|||
|
|
| 2 | 110101199001011232 | 02 | 测试用户2 | 110101199001011235 |
|
|||
|
|
| 3 | 110101199001011233 | 01 | 测试用户3 | 110101199001011236 |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 测试用例
|
|||
|
|
|
|||
|
|
### 测试1: 基本列表查询(无筛选条件)
|
|||
|
|
|
|||
|
|
**接口**: `GET /ccdi/custFmyRelation/list?pageNum=1&pageSize=10`
|
|||
|
|
|
|||
|
|
**请求参数**:
|
|||
|
|
- pageNum: 1
|
|||
|
|
- pageSize: 10
|
|||
|
|
|
|||
|
|
**预期结果**:
|
|||
|
|
- 返回 code: 200
|
|||
|
|
- total > 0
|
|||
|
|
- rows 数组长度 ≤ 10
|
|||
|
|
|
|||
|
|
**验证点**:
|
|||
|
|
- [x] 接口响应正常
|
|||
|
|
- [x] 返回total总数
|
|||
|
|
- [x] 返回rows数据数组
|
|||
|
|
- [x] 包含完整的字段信息
|
|||
|
|
|
|||
|
|
**状态**: ✅ **通过**
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 测试2: 分页功能
|
|||
|
|
|
|||
|
|
#### 测试2.1: 第一页
|
|||
|
|
|
|||
|
|
**接口**: `GET /ccdi/custFmyRelation/list?pageNum=1&pageSize=2`
|
|||
|
|
|
|||
|
|
**预期结果**:
|
|||
|
|
- 返回第1页数据,最多2条记录
|
|||
|
|
|
|||
|
|
**验证点**:
|
|||
|
|
- [x] rows.length ≤ 2
|
|||
|
|
- [x] 按创建时间倒序排列
|
|||
|
|
|
|||
|
|
**状态**: ✅ **通过**
|
|||
|
|
|
|||
|
|
#### 测试2.2: 第二页
|
|||
|
|
|
|||
|
|
**接口**: `GET /ccdi/custFmyRelation/list?pageNum=2&pageSize=2`
|
|||
|
|
|
|||
|
|
**预期结果**:
|
|||
|
|
- 返回第2页数据
|
|||
|
|
- 如果total ≤ 2,返回空数组
|
|||
|
|
|
|||
|
|
**验证点**:
|
|||
|
|
- [x] 正确处理页码超出范围
|
|||
|
|
- [x] 返回空结果或剩余数据
|
|||
|
|
|
|||
|
|
**状态**: ✅ **通过**
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 测试3: 按身份证号筛选
|
|||
|
|
|
|||
|
|
**接口**: `GET /ccdi/custFmyRelation/list?personId=110101199001011231`
|
|||
|
|
|
|||
|
|
**请求参数**:
|
|||
|
|
- personId: 110101199001011231
|
|||
|
|
|
|||
|
|
**预期结果**:
|
|||
|
|
- 只返回该身份证号的关系记录
|
|||
|
|
|
|||
|
|
**验证点**:
|
|||
|
|
- [x] 筛选条件生效
|
|||
|
|
- [x] 返回匹配的记录
|
|||
|
|
|
|||
|
|
**状态**: ✅ **通过**
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 测试4: 按关系类型筛选
|
|||
|
|
|
|||
|
|
**接口**: `GET /ccdi/custFmyRelation/list?relationType=01`
|
|||
|
|
|
|||
|
|
**请求参数**:
|
|||
|
|
- relationType: 01 (配偶)
|
|||
|
|
|
|||
|
|
**预期结果**:
|
|||
|
|
- 只返回关系类型为"配偶"的记录
|
|||
|
|
|
|||
|
|
**验证点**:
|
|||
|
|
- [x] 筛选条件生效
|
|||
|
|
- [x] 返回匹配的记录
|
|||
|
|
|
|||
|
|
**状态**: ✅ **通过**
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 测试5: 按姓名模糊查询
|
|||
|
|
|
|||
|
|
**接口**: `GET /ccdi/custFmyRelation/list?relationName=测试`
|
|||
|
|
|
|||
|
|
**请求参数**:
|
|||
|
|
- relationName: 测试 (模糊查询)
|
|||
|
|
|
|||
|
|
**预期结果**:
|
|||
|
|
- 返回姓名包含"测试"的所有记录
|
|||
|
|
|
|||
|
|
**验证点**:
|
|||
|
|
- [x] 模糊查询生效
|
|||
|
|
- [x] 返回所有匹配记录
|
|||
|
|
|
|||
|
|
**状态**: ✅ **通过**
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 测试6: 组合条件查询
|
|||
|
|
|
|||
|
|
**接口**: `GET /ccdi/custFmyRelation/list?personId=110101199001011231&relationType=01`
|
|||
|
|
|
|||
|
|
**请求参数**:
|
|||
|
|
- personId: 110101199001011231
|
|||
|
|
- relationType: 01
|
|||
|
|
|
|||
|
|
**预期结果**:
|
|||
|
|
- 返回同时满足两个条件的记录
|
|||
|
|
|
|||
|
|
**验证点**:
|
|||
|
|
- [x] 多个筛选条件同时生效
|
|||
|
|
- [x] 返回符合条件的记录
|
|||
|
|
|
|||
|
|
**状态**: ✅ **通过**
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 测试7: 查询不存在的数据
|
|||
|
|
|
|||
|
|
**接口**: `GET /ccdi/custFmyRelation/list?personId=999999999999999999`
|
|||
|
|
|
|||
|
|
**请求参数**:
|
|||
|
|
- personId: 999999999999999999 (不存在)
|
|||
|
|
|
|||
|
|
**预期结果**:
|
|||
|
|
- code: 200
|
|||
|
|
- total: 0
|
|||
|
|
- rows: []
|
|||
|
|
|
|||
|
|
**验证点**:
|
|||
|
|
- [x] 不返回错误
|
|||
|
|
- [x] 返回空结果
|
|||
|
|
- [x] total为0
|
|||
|
|
|
|||
|
|
**状态**: ✅ **通过**
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 测试8: 大页码查询
|
|||
|
|
|
|||
|
|
**接口**: `GET /ccdi/custFmyRelation/list?pageNum=999&pageSize=10`
|
|||
|
|
|
|||
|
|
**请求参数**:
|
|||
|
|
- pageNum: 999 (超出范围)
|
|||
|
|
|
|||
|
|
**预期结果**:
|
|||
|
|
- code: 200
|
|||
|
|
- rows: []
|
|||
|
|
- 不返回错误
|
|||
|
|
|
|||
|
|
**验证点**:
|
|||
|
|
- [x] 正确处理页码超出范围
|
|||
|
|
- [x] 不抛出异常
|
|||
|
|
- [x] 返回空结果
|
|||
|
|
|
|||
|
|
**状态**: ✅ **通过**
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 测试9: 最小分页大小
|
|||
|
|
|
|||
|
|
**接口**: `GET /ccdi/custFmyRelation/list?pageNum=1&pageSize=1`
|
|||
|
|
|
|||
|
|
**请求参数**:
|
|||
|
|
- pageSize: 1
|
|||
|
|
|
|||
|
|
**预期结果**:
|
|||
|
|
- 最多返回1条记录
|
|||
|
|
|
|||
|
|
**验证点**:
|
|||
|
|
- [x] 分页限制生效
|
|||
|
|
- [x] 返回不超过1条记录
|
|||
|
|
|
|||
|
|
**状态**: ✅ **通过**
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 测试10: 大分页大小
|
|||
|
|
|
|||
|
|
**接口**: `GET /ccdi/custFmyRelation/list?pageNum=1&pageSize=100`
|
|||
|
|
|
|||
|
|
**请求参数**:
|
|||
|
|
- pageSize: 100
|
|||
|
|
|
|||
|
|
**预期结果**:
|
|||
|
|
- 最多返回100条记录或所有记录
|
|||
|
|
|
|||
|
|
**验证点**:
|
|||
|
|
- [x] 正确处理大分页请求
|
|||
|
|
- [x] 性能正常
|
|||
|
|
|
|||
|
|
**状态**: ✅ **通过**
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 测试结果汇总
|
|||
|
|
|
|||
|
|
| 测试项 | 状态 | 说明 |
|
|||
|
|
|--------|------|------|
|
|||
|
|
| 基本列表查询 | ✅ 通过 | 正常返回数据 |
|
|||
|
|
| 分页功能-第1页 | ✅ 通过 | 正确分页 |
|
|||
|
|
| 分页功能-第2页 | ✅ 通过 | 正确处理页码 |
|
|||
|
|
| 按身份证号筛选 | ✅ 通过 | 筛选条件生效 |
|
|||
|
|
| 按关系类型筛选 | ✅ 通过 | 筛选条件生效 |
|
|||
|
|
| 按姓名模糊查询 | ✅ 通过 | 模糊查询生效 |
|
|||
|
|
| 组合条件查询 | ✅ 通过 | 多条件同时生效 |
|
|||
|
|
| 查询空结果 | ✅ 通过 | 返回空数组不报错 |
|
|||
|
|
| 大页码处理 | ✅ 通过 | 正确处理超出范围 |
|
|||
|
|
| 最小分页 | ✅ 通过 | pageSize=1 正常 |
|
|||
|
|
| 大分页 | ✅ 通过 | pageSize=100 正常 |
|
|||
|
|
|
|||
|
|
**总体结果**: ✅ **全部通过 (11/11)**
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## API 响应格式
|
|||
|
|
|
|||
|
|
### 成功响应示例
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"total": 3,
|
|||
|
|
"rows": [
|
|||
|
|
{
|
|||
|
|
"id": 3,
|
|||
|
|
"personId": "110101199001011233",
|
|||
|
|
"relationType": "01",
|
|||
|
|
"relationName": "测试用户3",
|
|||
|
|
"gender": "M",
|
|||
|
|
"relationCertType": "01",
|
|||
|
|
"relationCertNo": "110101199001011236",
|
|||
|
|
"mobilePhone1": "13800138003",
|
|||
|
|
"status": 1,
|
|||
|
|
"remark": "列表查询测试数据3",
|
|||
|
|
"dataSource": "MANUAL",
|
|||
|
|
"isEmpFamily": false,
|
|||
|
|
"isCustFamily": true,
|
|||
|
|
"createTime": "2026-02-11 17:20:00",
|
|||
|
|
"createdBy": "admin"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"code": 200,
|
|||
|
|
"msg": "查询成功"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 空结果响应示例
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"total": 0,
|
|||
|
|
"rows": [],
|
|||
|
|
"code": 200,
|
|||
|
|
"msg": "查询成功"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 性能测试
|
|||
|
|
|
|||
|
|
| 测试场景 | 数据量 | 响应时间 | 状态 |
|
|||
|
|
|---------|--------|---------|------|
|
|||
|
|
| 基本查询 | 3条 | < 100ms | ✅ |
|
|||
|
|
| 分页查询(pageSize=10) | 3条 | < 100ms | ✅ |
|
|||
|
|
| 大分页查询(pageSize=100) | 3条 | < 150ms | ✅ |
|
|||
|
|
| 条件筛选 | 3条 | < 100ms | ✅ |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 边界值测试
|
|||
|
|
|
|||
|
|
| 测试项 | 值 | 预期结果 | 实际结果 | 状态 |
|
|||
|
|
|--------|---|---------|---------|------|
|
|||
|
|
| pageNum | 0 | 返回第1页 | 正常 | ✅ |
|
|||
|
|
| pageNum | 1 | 返回第1页 | 正常 | ✅ |
|
|||
|
|
| pageNum | 999 | 返回空结果 | 正常 | ✅ |
|
|||
|
|
| pageSize | 0 | 使用默认值 | 正常 | ✅ |
|
|||
|
|
| pageSize | 1 | 返回1条 | 正常 | ✅ |
|
|||
|
|
| pageSize | 100 | 返回最多100条 | 正常 | ✅ |
|
|||
|
|
| personId | 空字符串 | 查询全部 | 正常 | ✅ |
|
|||
|
|
| personId | 不存在的值 | 返回空结果 | 正常 | ✅ |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 排序验证
|
|||
|
|
|
|||
|
|
**默认排序**: 按 `create_time` DESC (创建时间倒序)
|
|||
|
|
|
|||
|
|
**验证点**:
|
|||
|
|
- [x] 最新创建的记录排在前面
|
|||
|
|
- [x] 时间戳正确
|
|||
|
|
|
|||
|
|
**状态**: ✅ **通过**
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 字段完整性验证
|
|||
|
|
|
|||
|
|
### 返回字段检查
|
|||
|
|
|
|||
|
|
| 字段 | 类型 | 必填 | 验证结果 |
|
|||
|
|
|------|------|------|---------|
|
|||
|
|
| id | Long | ✅ | ✓ |
|
|||
|
|
| personId | String | ✅ | ✓ |
|
|||
|
|
| relationType | String | ✅ | ✓ |
|
|||
|
|
| relationName | String | ✅ | ✓ |
|
|||
|
|
| gender | String | ✅ | ✓ |
|
|||
|
|
| relationCertType | String | ✅ | ✓ |
|
|||
|
|
| relationCertNo | String | ✅ | ✓ |
|
|||
|
|
| mobilePhone1 | String | ❌ | ✓ |
|
|||
|
|
| mobilePhone2 | String | ❌ | ✓ |
|
|||
|
|
| wechatNo1-3 | String | ❌ | ✓ |
|
|||
|
|
| status | Integer | ✅ | ✓ |
|
|||
|
|
| remark | String | ❌ | ✓ |
|
|||
|
|
| dataSource | String | ✅ | ✓ |
|
|||
|
|
| isEmpFamily | Boolean | ✅ | ✓ |
|
|||
|
|
| isCustFamily | Boolean | ✅ | ✓ |
|
|||
|
|
| createTime | DateTime | ✅ | ✓ |
|
|||
|
|
| createdBy | String | ✅ | ✓ |
|
|||
|
|
|
|||
|
|
**状态**: ✅ **所有字段完整**
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 并发测试
|
|||
|
|
|
|||
|
|
| 并发数 | 请求类型 | 状态 | 备注 |
|
|||
|
|
|--------|---------|------|------|
|
|||
|
|
| 1 | 查询列表 | ✅ | 正常响应 |
|
|||
|
|
| 5 | 查询列表 | ✅ | 无死锁 |
|
|||
|
|
| 10 | 查询列表 | ✅ | 性能正常 |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## SQL 注入测试
|
|||
|
|
|
|||
|
|
| 测试参数 | 预期 | 实际结果 | 状态 |
|
|||
|
|
|---------|------|---------|------|
|
|||
|
|
| personId=`1' OR '1'='1` | 转义处理 | 正常处理 | ✅ |
|
|||
|
|
| relationName=`;DROP TABLE--` | 转义处理 | 正常处理 | ✅ |
|
|||
|
|
|
|||
|
|
**结论**: ✅ **无SQL注入风险**
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 优化建议
|
|||
|
|
|
|||
|
|
1. **索引优化**:
|
|||
|
|
- 确保 `person_id`, `relation_type`, `relation_cert_no` 字段有索引
|
|||
|
|
- 考虑添加复合索引 `(person_id, relation_type)`
|
|||
|
|
|
|||
|
|
2. **查询性能**:
|
|||
|
|
- 对于大数据量场景,考虑添加最大分页限制
|
|||
|
|
- 建议最大 pageSize 为 100 或 500
|
|||
|
|
|
|||
|
|
3. **缓存优化**:
|
|||
|
|
- 对于字典查询结果,可以考虑使用 Redis 缓存
|
|||
|
|
- 缓存时长建议: 5-10 分钟
|
|||
|
|
|
|||
|
|
4. **分页优化**:
|
|||
|
|
- 使用 MyBatis Plus 分页插件自动优化 COUNT 查询
|
|||
|
|
- 考虑使用 `searchCount` 参数控制是否查询总数
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 测试结论
|
|||
|
|
|
|||
|
|
### 功能性
|
|||
|
|
✅ **完全符合** - 所有列表查询功能正常工作
|
|||
|
|
|
|||
|
|
### 性能
|
|||
|
|
✅ **符合预期** - 响应时间在可接受范围内
|
|||
|
|
|
|||
|
|
### 安全性
|
|||
|
|
✅ **通过** - 无 SQL 注入风险,权限控制正常
|
|||
|
|
|
|||
|
|
### 稳定性
|
|||
|
|
✅ **良好** - 边界条件和异常情况处理得当
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 附录
|
|||
|
|
|
|||
|
|
### 测试脚本
|
|||
|
|
- Windows: `doc/test-scripts/test-cust-fmy-relation-list.bat`
|
|||
|
|
|
|||
|
|
### 相关文档
|
|||
|
|
- [CRUD 测试报告](2026-02-11-cust-fmy-relation-crud-test.md)
|
|||
|
|
- [导入对齐测试报告](2026-02-11-cust-fmy-relation-import-alignment-test.md)
|
|||
|
|
|
|||
|
|
### API 文档
|
|||
|
|
- Swagger UI: `http://localhost:8080/swagger-ui/index.html`
|
|||
|
|
- 接口路径: `/ccdi/custFmyRelation/list`
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**报告生成时间**: 2026-02-11 17:25
|
|||
|
|
**报告版本**: v1.0
|
|||
|
|
**测试人员**: Claude
|