提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
书中提出一种观念:代码质量与其整洁度成正比。干净的代码,既在质量上较为可靠,也为后期维护、升级奠定了良好基础。最近正在写单测补充,所以挑选《代码整洁之道》中的第九章,单元测试作为分享主题。
前言名词解释
TDD,测试驱动开发(Test Driven Development),是一种敏捷开发模式,具体指:
开发者先编写接口的测试用例然后再编写实现代码通过测试不断增加测试用例、重构 代码来改善设计,完成开发。
TDD 的优点:从测试角度来驱动,提升代码质量。
TDD 的缺点也很明显,时间成本增加,降低开发速度。
1.TDD三定律
第一定律:在编写不能通过的单元测试前,不可变写生产代码。
第二定律:只可编写刚好不可通过的单元测试,不能编译也算不通过。
第三定律:只可编写刚好足以通过当前失败测试的生产代码。
2.保持测试整洁
测试用例会随着项目的迭代而更改,测试越脏,就越难修改。
脏测试带来的问题:阅读困难,后期维护成本高,最后可能弃掉测试代码组,提高了风险。
整洁测试的好处:保障生产代码可扩展、可维护、可复用。修改起来更放心。
3.整洁的测试
整洁的测试最重要的就是可读性,需要像其他代码一样:明确,简洁,还有足够的表达力。
4.每个测试一个断言
好处是每个测试都归结为一个可快速方便理解的结论。
刚开始写的单测:
@Test
public void testWithdrawNotifyProcess(){
MockitoAnnotations.initMocks(this);
Mockito.when(transferDomainService.receiveProcessResult(any(TransferExecResultEvent.class))).thenReturn(true);
TransferExecResultEvent transferExecResultEvent = new TransferExecResultEvent();
transferService.withdrawNotifyProcess(transferExecResultEvent);
/**虽然这么写不会报错并且可以测试通过,单不规范
* 该方法是有返回值的,必须要有返回值的断言
**/
}
修改之后
@Test
public void testWithdrawNotifyProcess(){
MockitoAnnotations.initMocks(this);
Mockito.when(transferDomainService.receiveProcessResult(any(TransferExecResultEvent.class))).thenReturn(true);
TransferExecResultEvent transferExecResultEvent = new TransferExecResultEvent();
boolean result = transferService.withdrawNotifyProcess(transferExecResultEvent);
Assert.assertEquals(result,true);
}
无返回值方法测试用例:
@Test
public void testSetApplicationContext(){
MockitoAnnotations.initMocks(this);
ApplicationContext applicationContext = new GenericApplicationContext();
transferHoldEngine.setApplicationContext(applicationContext);
verify(transferHoldEngine).setApplicationContext(applicationContext);
//无返回值的方法用verify()来判断方法时候执行
}
@Test
public void testGenerateTasks() throws Exception {
ExternalRequestNoRuleContext externalRequestNoRuleContext = new ExternalRequestNoRuleContext();
externalRequestNoRuleContext.setExpression("test");
String text = null;
try{
externalRequestNoRuleExecutor.generateExternalNoByCustomRule(externalRequestNoRuleContext);
}catch (Exception e){
text = "exception";
}
assertNull(text);
}
5.F.I.R.S.T.
快速(Fast) 测试应该够快
独立(Independent) 测试应该相互独立。
可重复(Repeatable) 测试应当可在任何环境中重复通过。
自足验证(Self-Validating) 测试应该有布尔值输出。
及时(Timely)测试应及时编写。
6.小结
书中提到测试代码和生产代码一样重要,所以在做单测补充的过程中也要保持代码整洁,将代码规范养成习惯。