单元测试的目的
- 提高外部质量
- 提高内部质量
- 提高开发效率
- 提高个人开发技能
TDD三部曲
-
写一个不通过的测试
验证测试代码本身确实能够捕获错误
-
写实现代码,使其刚好通过测试
保证每一个代码逻辑都是测试驱动的,从而达到前面的测试覆盖率
-
通过重构去除坏味道,如重复、魔数、命名不准确、代码复杂等
持续改进代码质量
单元测试的原则
F:fast 单元测试应该快速完成,一个产品的全部单元测试在几分钟内
I:independent,测试用例相互不依赖,即不需要固定的顺序执行
R:repeatable 被测系统不变,单元测试执行多少次都一样
S:self-validating ,需包含足够多的断言进行自我验证
T:timely 测试先行,单元测试和实现代码一起及时完成并提交
单元测试的代码结构、命名方法
最佳实践
-
全量运行
运行所有单元测试,至少保证代码提交前全量运行并通过单元测试
-
快速循环
单元测试有多个小循环(分钟级)
-
三角法
一个测试点 + 两个测试案例
-
测试文档化
清晰的测试方法命名,说明测试覆盖的逻辑点
通过TDD进行重构
重构要点
code smell
重构注意事项
- 自动化测试的保障下进行重构
- 通过多个小步骤逐步重构
改变接口时注意事项
- 是否需要兼容旧接口,如果是,旧接口调用新接口保持一致性
- 将旧接口声明为Deprecated,要求其他程序逐步迁移至新接口
- 在合适时机彻底删除旧接口
面向对象设计要点
- 单一职责原则——SRP
- 开闭原则——OCP
- 里式替换原则——LSP
- 依赖倒置原则——DIP
- 接口隔离原则——ISP
- 迪米特原则——LOD
1、单一职责原则
定义:
一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中。
单一职责原则是实现高内聚、低耦合的指导方针,是最简单却最难运用的原则,需要设计人员发现类的不同职责并将其分离
2、开闭原则
定义:
软件实体应当对扩展开放,对修改关闭。
指软件实体应尽量在不修改原有代码的情况下进行扩展。
3、里氏替换原则
定义:
所有引用基类的地方必须能透明地使用其子类的对象。
里氏替换原则表明,在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常,反过来则不成立。
在运用里氏替换原则时,应该将父类设计为抽象类或者接口,让子类继承父类或实现父类接口,并实现在父类中声明的方法。
4、依赖倒转原则
定义:
高层模块不应该依赖底层模块,它们都应该依赖抽象。抽象不应该依赖于细节,细节应该依赖于抽象。
依赖倒转原则要求:要针对接口编程,不要针对实现编程。
5、接口隔离原则
定义:
客户端不应该依赖那些它不需要的接口。
在使用接口隔离原则的时候,需要注意控制接口的粒度,接口不能太小,如果太小会导致系统中接口泛滥,不利于维护;接口也不能太大,太大的接口将违背接口隔离原则,灵活性较差,使用起来不方便。
6、迪米特法则-又称最少知识原则
定义:
每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位。
设计模式
23种
开闭原则
函数重构原则
短小 10行内
单一职责
具有描述性的名称
参数尽可能少
尽量避免重复
函数重构方法
提炼函数 extract method
内联函数 inline method
内联临时变量 inline Temp
以查询取代临时变量
引入解释性变量
分解临时变量
移除对参数的赋值
以函数对象取代函数
替换算法