300 likes | 391 Views
写 好测试. 吴大瑞. 写 好测试. 1. 为什么要写测试. 什么时候开始写测试. 2. 要对哪些代码进行测试. 3. “坏”的测试有哪些特点. 4. 怎样写出好的测试. 5. 不写测试的理由. 没有时间写单元测试。 单元测试的价值不高,完全是浪费时间。 业务逻辑比较简单,不值得编写单元测试。 不知道怎么编写单元测试。 老大没有要求,所以不写。 前期写,到后期就失控了。 我不想抢了 QA 的饭碗。 ……. 我讨厌 写测试. 软件. 一个 bug 被隐藏的时间越长,修复这个 bug 的代价就越大。. 写测试的好处. 写测试的好处.
E N D
写好测试 吴大瑞
写好测试 1 为什么要写测试 什么时候开始写测试 2 要对哪些代码进行测试 3 “坏”的测试有哪些特点 4 怎样写出好的测试 5
不写测试的理由 • 没有时间写单元测试。 • 单元测试的价值不高,完全是浪费时间。 • 业务逻辑比较简单,不值得编写单元测试。 • 不知道怎么编写单元测试。 • 老大没有要求,所以不写。 • 前期写,到后期就失控了。 • 我不想抢了QA的饭碗。 • …… 我讨厌 写测试
软件 一个bug被隐藏的时间越长,修复这个bug的代价就越大。 写测试的好处
写测试的好处 • 合格产品必须检验 • 调试和集成的痛苦 后期的调试 • 紧急发布 前期的编码
写测试的好处 这些程序都干了什么滴! 什么乱七八糟的! 如果我们有很多健康的测试,是不是有助于其他人呢?
写测试的好处 • 单元测试可以用来发现bug?
写测试的好处 起到了第一层防护网作用 保证组件是符合设计目标的 为重构打下良好的基础
要测哪些东西 • Service (AO BO) • DAO • Action(控制层) • WEB (UI)
TDD模式 • 边写边测 • 后期补写 什么时候写测试 TDD 是一种开发实践,与测试技能无关。 补充测试不是一个长久的策略。 为每个可能的bug写个重现的case,然后修复它。
简单例子 Arrange 清单列表是空的 创建货物清单,输入产品的单价、数量、折扣、计算总价。 Action 验证清单的正确性 Assert
AAA : Arrange Action Assert Given When Then
坏测试的气味 • 测试代码冗长,晦涩难懂。 • 测试失败的信息不够明确,需要太多的debug才能定位。 • 测试需要人工的干预(比如数据准备,改变条件等)。 • 整个测试没有验证点,即使代码抛出了异常,测试还是通过的。
坏测试的气味 • 贪心的测试,妄图一个case搞定世界。 • 测试代码的意图不明确,次要的信息太多了。 • 准备的数据太复杂,企图为所有的测试case服务。
坏测试的气味 • 变化无常的测试 一会儿通过,一会儿通不过。 • 牵一发动全身的测试 一点点代码的改变,导致大量的测试失败。
坏测试的气味 • 蜗牛的速度 • 测试代码中有条件分支(if-else)
什么是好的测试 因为小巧 • 所以简单
最最重要的 打好奠基,写好业务代码 如何写好测试
如何写好测试 • 命名要规范,且命名要反映你的意图 Class → ClassTest → ClassTest_SpecialPurpose methodA → testMethodA → testMethodA_SpecailPurpose → testMethodA_测试意图说明 methodB → …… 建议可以使用 moreunit 这个eclipse插件 ctrl + j 创建测试类或跳转到测试类 ctrl + u 创建测试方法或跳转到对应方法
如何写好测试 • 目录的组织要规范 • 测试代码应该和业务代码在一起? 我们公司的目录结构 src/java /java.test Maven的目录结构 src/main/java /resources /test/java /resrouces
如何写好测试 • 要及时将测试代码维护起来。 提交到svn的代码必须是健康的 持续测试 发现错误,及时维护 (小洞不补,大洞叫苦)
如何写好测试 • 善用mock 既不忌讳,也不滥用。
如何写好测试 • 善用断言 • 行为测试/状态测试 • AAA (输入/输出)
如何写好测试 如果你的代码一点变化,引起了大量测试失败? 如果你的代码已经发生变化,但却没有测试为此“下台”?
如何写好测试 • 测试要独立,换言之,就是B测试不要依赖A测试的结果。 • 保持适当的潮湿(un DRYness) • 不要吹毛求疵 • 乐观/悲观路径的测试。
总结 • 不好的测试也是一种灾难。 • 单元测试只是一种手段,要明白它能干什么,不能干什么。 • 不要太过于相信覆盖率。
测试模式 http://xunitpatterns.com/ 测试反模式 http://tdd-antipatterns.net/index.php?title=Main_Page 参考资料