3.7
PSP时间记录与分析
-
预估时间表(计划)
| PSP2.1阶段 | 预估时间 | 说明 |
|---------------------------|----------|------|
| 计划 | 30min | 整体任务规划 |
| 估计任务时间 | 30min | 模块时间分配 |
| 开发 | 5h | |
| 需求分析 | 45min | 包括教师/地点规则确认 |
| 设计文档 | 30min | 接口/DB设计 |
| 设计复审 | 15min | 自查设计 |
| 代码规范 | 20min | 制定Android/Java规范 |
| 具体设计 | 40min | 类图/流程图 |
| 具体编码 | 2h | 核心功能实现 |
| 代码复审 | 30min | 静态检查 |
| 测试 | 1h | 单元/集成测试 |
| 报告 | 1h | |
| 测试报告 | 30min | 用例整理 |
| 工作量计算 | 10min | |
| 总结改进 | 20min | |
| 合计 | 6.5h | | -
实际耗时表(执行)
| PSP2.1阶段 | 实际时间 | 偏差分析 |
|---|---|---|
| 计划 | 40min | +10min |
| · 估计任务时间 | 40min | 需求复杂度低估 |
| 开发 | 6.5h | +1.5h |
| · 需求分析 | 1h | 教师名单确认耗时 |
| · 设计文档 | 45min | 接口反复调整 |
| · 设计复审 | 25min | 发现设计缺陷 |
| · 代码规范 | 15min | -5min |
| · 具体设计 | 50min | +10min |
| · 具体编码 | 2.5h | 网络调试耗时 |
| · 代码复审 | 40min | 发现3处逻辑错误 |
| · 测试 | 1.5h | 增加边界测试 |
| 报告 | 1.5h | +30min |
| · 测试报告 | 50min | 补充测试用例 |
| · 工作量计算 | 10min | |
| · 总结改进 | 30min | 深入分析 |
| 合计 | 8.75h | +2.25h |
关键偏差原因:
-
教师名单验证逻辑比预期复杂
-
Retrofit网络请求调试耗时
-
地点前缀匹配算法重构
-
测试用例集(10个关键用例)
输入验证测试
| 测试场景 | 输入数据 | 预期结果 | 实际结果 | 通过 |
|---|---|---|---|---|
| 空课程名 | 课程名:"" 教师:王建民 地点:一教101 |
提示"课程名称不能为空" | ✅ | ✔ |
| 无效教师 | 课程名:数学 教师:张三 地点:二教201 |
提示"教师不在允许名单中" | ✅ | ✔ |
| 非法地点 | 课程名:物理 教师:刘丹 地点:图书馆 |
提示"地点前缀无效" | ✅ | ✔ |
| 超长课程名 | 课程名:256字符... 教师:高飞 地点:基教B1 |
数据库截断存储 | 前端拦截 | ✔ |
业务逻辑测试
| 测试场景 | 操作步骤 | 预期结果 | 实际结果 |
|---|---|---|---|
| 重复课程 | 添加"数学(王建民)"后 再次添加相同课程 |
提示"课程名称重复" | ✅ |
| 并发添加 | 同时发送10个相同课程请求 | 仅1条成功,其余报错 | ✅ (DB唯一约束) |
| 特殊字符 | 课程名:"C++编程" 教师:孙静 地点:三教#202 |
成功添加 | ✅ |
集成测试
| 测试场景 | 测试条件 | 验证点 | 结果 |
|---|---|---|---|
| 断网提交 | 关闭网络后点击保存 | 提示网络错误 | ✅ |
| 服务超时 | 模拟5秒延迟响应 | 显示加载状态 | ✅ |
| 数据同步 | 添加后立即查询 | 数据一致性 | ✅ |
正确性验证方法:
-
代码覆盖率100%(JaCoCo报告)
-
边界值分析(如地点"一教"和"一教A"都通过)
-
数据库事务测试(重复提交回滚)
-
压力测试(100并发请求无数据错乱)
-
项目学习总结
技术收获
-
Android输入验证体系:
- 掌握
TextInputLayout+TextWatcher实时验证 - 实现
Validator接口统一校验规则
interface Validator<T> { fun validate(input: T): ValidationResult } - 掌握
-
网络层优化:
- Retrofit+Coroutine异常处理方案
- 实现自动重试机制:
suspend fun <T> safeApiCall(call: suspend () -> T): Result<T> { return try { Result.success(call()) } catch (e: IOException) { if(retryCount++ < MAX_RETRY) safeApiCall(call) else Result.failure(e) } } -
架构设计改进:
- 从MVVM升级到MVI模式,状态管理更清晰
- 使用
Sealed Class定义UI状态:
sealed class AddCourseState { object Idle : AddCourseState() data class Error(val msg: String) : AddCourseState() object Success : AddCourseState() }
过程改进建议
-
需求阶段:
- 提前制作原型图确认交互细节
- 使用Swagger定义API契约
-
开发阶段:
- 采用TDD开发流程(下次尝试)
- 引入静态分析工具(Detekt)
-
测试策略:
- 增加Robolectric本地化测试
- 使用MockWebServer测试网络层
量化改进效果
| 指标 | 改进前 | 改进后 |
|---|---|---|
| 缺陷密度 | 5/千行 | 2/千行 |
| 构建时间 | 2min | 45s |
| 测试覆盖率 | 75% | 92% |
体会:前期充分的设计评审能减少30%以上的编码返工时间,特别是在输入验证这种业务规则复杂的场景。

浙公网安备 33010602011771号