读书笔记-实用单元测试(英文版)
Pragmatic Unit Testing in C# with NUnit
Author: Andrew Hunt ,David Thomas with Matt Hargett
1)单元测试实际上成了集成测试,需要大量的setup和测试代码,需要很长时间来运行,引入的数据库,网络等资源.
2) 单元测试只测试了一种情况,缺少异常情况的测试,没有通过测试表达出代码的实际用途.
3) 单元测试是不可维护的,当单元测试失败时忽略或删除它,当Bug出现时,没有新的单元测试加入.
1) 根据测试对象,设置需要的条件和资源等等,如set up
2) 调用被测试的方法.
3) 验证结果 eg:assert
4) 打扫战场:tear down.
1) Right:所有测试结果都正确性吗?
2) Boundry:边界测试都正确吗?
3) Inverse: 是检查了相反关系.
4) Cross-check:是否使用其它方式测试结果.
5) Error:是否引入错误条件测试.
6) Performance:性能测试是否在意料之中.
1) 真实对象有着不确定的行为.(有着不可预测的结果).
2) 真实对象很难创建,像需要文件系统,数据库或网络.
3) 真实对象有着很难触发的行为,如网络错误.
4) 真实对象响应很慢.
5) 真实对象有或是一个用户界面.
6) 测试需要了解真实对象是如何使用的,如测试需要确认调用了一个回调函数.
7) 真实对象还不存在.
1) 使用接口来描述对象的相关方法.
2) 用产品代码实现这个接口.
3) 在测试中使用MOCK实现这个接口.
1) Automatic:自动化,测试可以自动执行,包括两方面: 执行测试和检查结果.
2) Thorough:彻底的,主要是代码的测试覆盖率.
3) Repeatable:可重复性.每一个测试都可重复执行.且产生同样的结果.
4) Independent:每一个测试都是独立的,不与其他测试耦合.与测试顺序无关.
5) Professional:职业的.测试代码与产品代码一样,需要保质保量.
1) 代码还没有完成
2) 代码没有编译
3) 代码已经编译了,代码对已存在的代码的编译,造成影响.
4) 代码没有相应的单元测试.
5) 代码有失败单元测试.
6) 代码通过了自己的测试,但是影响了其他模块的测试结果.
1) 写了一个新的方法
2) 修正了一个bug
3) 每一次成功的编译
4) 每一次的成功check in
5) 持续集成时.
1) 在遗留代码中进行开发,新写的代码一定要写单元测试.
2) 对遗留代码,我们根据情况选择那个可测的代码进行单元测试.
3) 对于那些不容易测试的代码,我们要进行重构,我们要选取最容易出错的代码,最常使用的代码进行单元测试.
5, 测试代码也应该是代码评审的一部分.
1) 更好的分离关注点:一个方法只做一个件事,更容易测试.
2) 定义类常量改进设计:尽量不要使用字符串进行判断.
3) 用测试驱动设计提高接口设计
4) 建立与本地化验证职责.
Chapter10:GUI测试
………………………………………….