测试日期: 2024-11-16
测试人员: AI测试工程师
测试范围: 前端Web应用 + 后端API
测试角度: 用户视角,功能完整性,数据一致性,用户体验
本次测试从用户使用角度出发,对事件管理系统的核心功能进行了全面测试,发现了以下问题:
- 严重BUG: 3个
- 重要问题: 8个
- 一般问题: 12个
- 优化建议: 10个
位置: frontend/src/pages/EventList.tsx:29
问题描述:
setTotal(data.length * page + (data.length === pageSize ? pageSize : 0))这个计算逻辑完全错误,无法正确显示总记录数。
影响:
- 分页组件显示的总数不正确
- 用户无法知道实际有多少条记录
- 可能导致分页功能混乱
复现步骤:
- 访问事件列表页面
- 查看分页组件显示的总数
- 切换页码,观察总数变化
预期行为: 显示数据库中实际的事件总数
修复建议:
- 后端API需要返回总数(total_count)
- 前端使用后端返回的总数
位置: api/main.py:77-93
问题描述:
/api/events 端点只返回事件列表,没有返回总数(total)和分页信息。
影响:
- 前端无法正确实现分页
- 无法显示准确的记录总数
- 用户体验差
修复建议:
@app.get("/api/events", response_model=List[EventListItem], tags=["事件管理"])
async def list_events(
page: int = Query(1, ge=1, description="页码"),
page_size: int = Query(10, ge=1, le=100, description="每页数量")
):
# 需要返回: { "items": [...], "total": 100, "page": 1, "page_size": 10 }位置:
api/database.py:201-215(后端返回is_overdue字段)frontend/src/pages/UrgentEvents.tsx:37-42(前端自己计算isOverdue)frontend/src/types/index.ts(类型定义缺少is_overdue字段)
问题描述:
- 后端返回的紧急事件包含
is_overdue字段(SQL计算),但前端类型定义中没有 - 前端没有使用后端返回的
is_overdue,而是自己用isOverdue()函数计算 - 后端返回的紧急事件字段不完整(缺少description、updated_at等)
影响:
- TypeScript类型检查可能报错
- 前后端计算逻辑可能不一致
- 前端无法使用后端已计算好的is_overdue字段,浪费资源
修复建议:
- 更新前端Event类型,添加
is_overdue?: boolean - 前端直接使用后端返回的
is_overdue字段,而不是重新计算 - 后端返回完整的字段,或前端明确知道哪些字段可用
位置: frontend/src/pages/EventList.tsx
问题描述: 用户无法在事件列表页面筛选不同状态的事件(待处理、进行中、已完成等)。
影响:
- 用户需要查看所有事件才能找到特定状态的事件
- 不符合用户使用习惯
- 降低工作效率
修复建议:
- 添加状态筛选标签或下拉框
- 类似Dashboard中的统计卡片,可以点击跳转到筛选后的列表
位置: frontend/src/components/EventForm.tsx
问题描述: 创建事件成功后,如果再次打开创建表单,可能保留上次的值。
影响:
- 用户可能误提交重复数据
- 需要手动清空表单
修复建议:
- 在Modal关闭时重置表单
- 或在创建成功后重置表单
位置: frontend/src/pages/EventDetail.tsx:114
问题描述: 删除跟进记录时没有确认对话框,直接删除。
影响:
- 用户可能误删重要记录
- 删除操作不可逆,风险高
修复建议:
const handleDeleteFollowup = async (followupId: number) => {
Modal.confirm({
title: '确定删除这条跟进记录吗?',
onOk: async () => {
// 删除逻辑
}
})
}位置: frontend/src/pages/SearchResults.tsx
问题描述: 当搜索关键词为空时,显示"请输入搜索关键词",但用户可能不知道如何触发搜索。
影响:
- 用户体验不友好
- 可能让用户困惑
修复建议:
- 在搜索框添加提示
- 或自动跳转到事件列表页面
位置: frontend/src/components/EventForm.tsx:82-95
问题描述: 虽然表单验证要求紧急事件必须填写截止时间,但可能存在以下问题:
- 如果用户先勾选紧急,填写截止时间,然后取消勾选,截止时间仍然保留
- 截止时间可能早于当前时间
影响:
- 可能创建已过期的紧急事件
- 数据不一致
修复建议:
- 取消紧急标记时,清空截止时间
- 添加截止时间必须晚于当前时间的验证
位置: 多个文件
问题描述: 很多地方的错误处理只是显示"加载失败"、"操作失败"等通用信息,没有具体错误原因。
影响:
- 用户不知道具体问题
- 无法判断是网络问题还是数据问题
- 调试困难
修复建议:
- 根据错误类型显示不同的提示信息
- 网络错误、权限错误、数据错误等区分处理
位置: frontend/src/pages/EventDetail.tsx
问题描述: 当其他用户更新了事件或添加了跟进记录时,当前用户无法手动刷新查看最新数据。
影响:
- 多人协作时数据不同步
- 需要刷新整个页面才能看到更新
修复建议:
- 添加手动刷新按钮
- 或实现自动轮询(可选)
位置: api/database.py:294-298
问题描述:
删除跟进记录时,没有更新关联事件的 updated_at 字段。
影响:
- 事件的时间线不准确
- 可能影响排序和筛选
修复建议:
- 删除跟进记录时,同时更新事件的
updated_at
位置: frontend/src/pages/EventList.tsx:81-90
问题描述: 当没有事件时,分页组件仍然显示(显示"共 0 条")。
影响:
- 界面不够简洁
- 用户体验略差
修复建议:
- 只在有数据时显示分页组件
位置: 多个组件
问题描述: 不同页面显示的日期时间格式可能不一致。
影响:
- 用户体验不统一
- 可能造成困惑
修复建议:
- 统一使用
formatDateTime函数 - 确保所有地方格式一致
位置: 多个页面
问题描述: 某些操作的加载状态不够明显,用户可能不知道系统正在处理。
影响:
- 用户可能重复点击
- 体验不佳
修复建议:
- 使用更明显的加载提示
- 按钮添加loading状态
位置: frontend/src/components/EventForm.tsx
问题描述: 某些验证规则的提示信息可以更友好。
影响:
- 用户体验略差
修复建议:
- 优化验证提示文案
位置: frontend/src/pages/UrgentEvents.tsx
问题描述: 用户无法选择按截止时间、创建时间等排序。
影响:
- 灵活性不足
修复建议:
- 添加排序选项
位置: frontend/src/pages/SearchResults.tsx
问题描述: 只能按关键词搜索,不支持按状态、创建人、时间范围等筛选。
影响:
- 搜索功能有限
修复建议:
- 添加高级搜索功能
位置: frontend/src/components/EventCard.tsx
问题描述: 整个卡片应该是可点击的,但可能只有部分区域可点击。
影响:
- 用户体验略差
修复建议:
- 确保整个卡片都是可点击区域
位置: 全局
问题描述: 没有键盘快捷键,如 Ctrl+N 创建事件等。
影响:
- 效率提升空间
修复建议:
- 添加常用操作的快捷键
位置: 全局
问题描述: 虽然使用了Ant Design的响应式组件,但某些页面在移动端可能体验不佳。
影响:
- 移动端用户使用不便
修复建议:
- 测试移动端显示效果
- 优化移动端布局
位置: 全局
问题描述: 用户无法导出事件列表或统计数据。
影响:
- 功能不完整
修复建议:
- 添加导出Excel/CSV功能
位置: frontend/src/pages/EventList.tsx
问题描述: 无法批量选择、批量更新状态、批量删除等。
影响:
- 效率低
修复建议:
- 添加批量操作功能
位置: 全局
问题描述: 无法查看谁在什么时候做了什么操作。
影响:
- 无法追溯操作历史
- 多人协作时可能有问题
修复建议:
- 添加操作日志功能
位置: api/database.py:201-215
问题描述:
get_urgent() 方法只返回部分字段(id, title, order_number, urgent_deadline, creator, status, created_at, is_overdue),缺少description、updated_at、is_urgent等字段。
影响:
- 前端EventCard组件可能需要这些字段
- 数据不完整可能导致显示问题
修复建议:
- 返回完整的Event字段,或创建专门的UrgentEventResponse模型
位置: api/database.py:185-199
问题描述:
search() 方法只返回部分字段,缺少description、updated_at等。
影响:
- 搜索结果展示不完整
- 与列表API返回格式不一致
修复建议:
- 统一返回格式,或明确文档说明
位置:
api/database.py:208(SQL中使用datetime('now'))frontend/src/utils/format.ts(使用dayjs)
问题描述: 后端使用SQLite的datetime('now'),前端使用dayjs,可能存在时区不一致问题。
影响:
- 超时判断可能不准确
- 时间显示可能不一致
修复建议:
- 统一时区处理
- 后端返回UTC时间,前端转换为本地时间
建议: 使用React Query或SWR实现数据缓存,减少不必要的API请求。
建议:
- 使用懒加载
- 代码分割
- 图片优化
建议: 使用骨架屏替代简单的Loading,提升用户体验。
建议: 对于删除等危险操作,提供撤销功能。
建议: 在Dashboard中添加图表展示,更直观。
建议:
- 添加搜索防抖
- 支持搜索历史
- 高亮搜索结果
建议: 当有紧急事件或超时事件时,显示通知。
建议:
- 自动保存草稿
- 表单字段记忆
- 智能提示
建议: 在应用中添加帮助文档或使用提示。
建议: 添加性能监控,追踪页面加载时间、API响应时间等。
- ✅ 创建事件
- ✅ 查看事件列表
- ✅ 查看事件详情
- ✅ 编辑事件
- ✅ 删除事件
- ✅ 添加跟进记录
- ✅ 删除跟进记录
- ✅ 搜索事件
- ✅ 查看紧急事件
- ✅ 查看统计看板
- ⬜ 并发操作测试
- ⬜ 大数据量测试(1000+事件)
- ⬜ 网络异常测试
- ⬜ 浏览器兼容性测试
- ⬜ 移动端测试
- ⬜ 性能压力测试
- ⬜ 安全性测试
- ⬜ 数据备份恢复测试
- BUG-001: 分页总数计算错误
- BUG-002: 后端API缺少分页总数返回
- BUG-003: 紧急事件类型不匹配
- ISSUE-001: 事件列表缺少状态筛选功能
- ISSUE-002: 创建事件后表单未重置
- ISSUE-003: 删除跟进记录缺少确认提示
- ISSUE-005: 紧急事件截止时间验证不完善
- ISSUE-006: 错误处理信息不够详细
- ISSUE-004: 搜索功能缺少空状态提示
- ISSUE-007: 事件详情页缺少刷新按钮
- ISSUE-008: 跟进记录删除后事件更新时间未更新
- 其他一般问题
- 所有优化建议
整体而言,应用的核心功能基本完整,但在以下方面需要改进:
- 数据一致性: 分页、总数等数据需要后端支持
- 用户体验: 缺少一些常用功能(筛选、批量操作等)
- 错误处理: 需要更友好的错误提示
- 数据完整性: 某些操作没有更新关联数据
建议优先修复P0和P1级别的问题,确保核心功能稳定可用。
报告生成时间: 2024-11-16
测试工具: 代码审查 + 静态分析
建议: 进行实际运行测试以发现更多问题