150 likes | 372 Views
JTester 专题培训 写好测试. 吴大瑞 2009-09-23. 大纲. 单元测试目标 示例:重构测试 测试结果分解 测试的坏味道 代码级坏味道 行为级坏味道 项目级坏味道 我们可以做的更好 Q&A. 单元测试目标. 提高产品质量 测试即规格 拒绝 bug 再次进入 快速错误定位 有助于理解需求 测试即文档 有助于降低风险 安全防护网 无害原则. 单元测试目标. 容易运行 自动化运行 可重复运行 自我检查 容易写测试 测试代码简洁 测试意图明显 测试焦点单一 容易维护测试 鲁棒性. 示例:重构测试.
E N D
JTester专题培训写好测试 吴大瑞 2009-09-23
大纲 • 单元测试目标 • 示例:重构测试 • 测试结果分解 • 测试的坏味道 • 代码级坏味道 • 行为级坏味道 • 项目级坏味道 • 我们可以做的更好 • Q&A
单元测试目标 • 提高产品质量 • 测试即规格 • 拒绝bug再次进入 • 快速错误定位 • 有助于理解需求 • 测试即文档 • 有助于降低风险 • 安全防护网 • 无害原则
单元测试目标 • 容易运行 • 自动化运行 • 可重复运行 • 自我检查 • 容易写测试 • 测试代码简洁 • 测试意图明显 • 测试焦点单一 • 容易维护测试 • 鲁棒性
示例:重构测试 • 一个复杂的测试例子 • 重构过程 • 重构测试的断言(使用对象断言,或者自定义断言) • 消除IF语句 • 使用teardown方法 • 隐藏不关心的细节(使用Helper类) • 参数化测试
测试结构分解 • SUT (system under test, 被测对象) • DOC (depended-on components, 依赖对象) • AAA过程 (given, when, then) • Arrange • Action • Assert • +1,清理战场 • 控制点 (直接输入,间接输入) • 观察点 (直接输出,间接输出)
测试的坏味道-代码级 • 难以理解的测试 • 想一口吃成胖子 • 隐藏了关键信息,神秘来客 • 大而全的准备数据 • 无关信息太多,分散了测试焦点 • 隔山打牛式的测试(间接测试) • 条件式测试 • 以不变应万变(IF-ELSE式测试) • Loop语句 • N组测试放在一起
测试的坏味道-代码级 • 难以测试的代码 • 没有适当的分层,高度耦合 • 没有采用DI方式管理依赖 (new, reflection) • 异步消息 • UI相关,其它…… • 产品代码依赖测试代码 • 产品代码中嵌入测试代码 • Api 依赖 • Jar 依赖 • 为了测试改写equals等
测试的坏味道-行为级 • 无法定位错误位置 • 大而全的测试 • 缺少assert信息 • 变化无常的测试 • 测试交叉影响 • 测试完毕资源不释放 • 依赖特定环境 • 脆弱的测试 • 牵一发而动全身
测试的坏味道-行为级 • 频繁的调试 • 人工干预测试过程 • 人工准备测试数据 • 人工判断测试 通过/失败 • 人工事件触发 • 你在跟我比慢吗? • 大而全的准备数据 • 异步测试 • 太多的测试在跑 (分而治之)
测试的坏味道-项目级 • 虫子回来了? • 你骗了我 • 狼来了? • 小洞不补,大洞叫苦。对bug熟视无睹? • 写代码的人不写测试 • 没有时间? • 缺少技能? • 代码难以测试? • 不屑?
测试的坏味道-项目级 • 测试代码难以管理 • Class/perTest Fixture/perTest Feature/perTest • 包管理混乱 • 命名意图不清 • 难以维护的测试代码 • 测试没有频繁运行,变化积重难返 • 没有做到一个分支一个测试 • 测试从不失败 • 难以维护的项目代码 • 没有单元测试(或没有足够的) • 不可测的代码
实例演示 我们可以做的更好
Q&A Q & A