3.7

PSP时间记录与分析

  1. 预估时间表(计划)
    | PSP2.1阶段 | 预估时间 | 说明 |
    |---------------------------|----------|------|
    | 计划 | 30min | 整体任务规划 |
    | 估计任务时间 | 30min | 模块时间分配 |
    | 开发 | 5h | |
    | 需求分析 | 45min | 包括教师/地点规则确认 |
    | 设计文档 | 30min | 接口/DB设计 |
    | 设计复审 | 15min | 自查设计 |
    | 代码规范 | 20min | 制定Android/Java规范 |
    | 具体设计 | 40min | 类图/流程图 |
    | 具体编码 | 2h | 核心功能实现 |
    | 代码复审 | 30min | 静态检查 |
    | 测试 | 1h | 单元/集成测试 |
    | 报告 | 1h | |
    | 测试报告 | 30min | 用例整理 |
    | 工作量计算 | 10min | |
    | 总结改进 | 20min | |
    | 合计 | 6.5h | |

  2. 实际耗时表(执行)

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

关键偏差原因:

  1. 教师名单验证逻辑比预期复杂

  2. Retrofit网络请求调试耗时

  3. 地点前缀匹配算法重构

  4. 测试用例集(10个关键用例)

输入验证测试

测试场景 输入数据 预期结果 实际结果 通过
空课程名 课程名:""
教师:王建民
地点:一教101
提示"课程名称不能为空"
无效教师 课程名:数学
教师:张三
地点:二教201
提示"教师不在允许名单中"
非法地点 课程名:物理
教师:刘丹
地点:图书馆
提示"地点前缀无效"
超长课程名 课程名:256字符...
教师:高飞
地点:基教B1
数据库截断存储 前端拦截

业务逻辑测试

测试场景 操作步骤 预期结果 实际结果
重复课程 添加"数学(王建民)"后
再次添加相同课程
提示"课程名称重复"
并发添加 同时发送10个相同课程请求 仅1条成功,其余报错 ✅ (DB唯一约束)
特殊字符 课程名:"C++编程"
教师:孙静
地点:三教#202
成功添加

集成测试

测试场景 测试条件 验证点 结果
断网提交 关闭网络后点击保存 提示网络错误
服务超时 模拟5秒延迟响应 显示加载状态
数据同步 添加后立即查询 数据一致性

正确性验证方法:

  1. 代码覆盖率100%(JaCoCo报告)

  2. 边界值分析(如地点"一教"和"一教A"都通过)

  3. 数据库事务测试(重复提交回滚)

  4. 压力测试(100并发请求无数据错乱)

  5. 项目学习总结

技术收获

  1. Android输入验证体系

    • 掌握TextInputLayout+TextWatcher实时验证
    • 实现Validator接口统一校验规则
    interface Validator<T> {
        fun validate(input: T): ValidationResult
    }
    
  2. 网络层优化

    • 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)
        }
    }
    
  3. 架构设计改进

    • 从MVVM升级到MVI模式,状态管理更清晰
    • 使用Sealed Class定义UI状态:
    sealed class AddCourseState {
        object Idle : AddCourseState()
        data class Error(val msg: String) : AddCourseState()
        object Success : AddCourseState()
    }
    

过程改进建议

  1. 需求阶段

    • 提前制作原型图确认交互细节
    • 使用Swagger定义API契约
  2. 开发阶段

    • 采用TDD开发流程(下次尝试)
    • 引入静态分析工具(Detekt)
  3. 测试策略

    • 增加Robolectric本地化测试
    • 使用MockWebServer测试网络层

量化改进效果

指标 改进前 改进后
缺陷密度 5/千行 2/千行
构建时间 2min 45s
测试覆盖率 75% 92%

体会:前期充分的设计评审能减少30%以上的编码返工时间,特别是在输入验证这种业务规则复杂的场景。

posted @ 2025-03-07 21:43  李蕊lr  阅读(8)  评论(0)    收藏  举报