Java后端必备Java 杂谈

测试驱动之我思我为

2018-12-14  本文已影响0人  关捷

写过长代码复杂逻辑的同学可能会意识到,在同一个类中进行业务逻辑堆积,承担的职责过重,那么很可能会造成方法调用链过长条件分支过多代码复杂,这会使我们对全局的掌控能力降低思维负担加重,从而对程序的信心不足,甚至会对后期维护产生抵触情绪

背景

最近参与了新系统的开发,写了一个功能,展示收银台,整个业务逻辑层1000+的代码量,业务复杂,依赖系统多,开发时间紧(一周)。

第一版,业务逻辑层全部写在了一个类中,几十个方法,主干代码分支众多,分支中又有系统调用,真是主干长,枝叶茂盛,看着费劲,由于急于上线(有单元测试覆盖率要求),单元测试简直瞎编乱造,这样的代码将来不管谁来维护都是噩梦。

第二版,决定重构,由于系统已经上线,代码更不敢随便修改(部分原因是单元测试写的不到位造成的),在不改变代码的前提,把当前的大类,进行了切分,方法搬移到了不同的类中,拆出了十几个类。每个类单独的进行单元测试,有了单元测试后,终于可以放心地对代码进行重构了,使用了门面模式进行分层设计、策略模式和责任链模式处理条件分支,最后整个代码清晰度有了很大的提升。

现在,回想起来,深刻的认识到:单元测试是造就编码自信的不二法门

单元测试以方法为基本单元进行测试验证。针对一个被测试的单元,通过给定的相关输入,验证其输出及过程的正确性。

工程上的一个共识是,如果程序的每个模块都是正确的、模块与模块的连接是正确的、那么程序基本上就会是正确的。

单元测试的正面效应

拥有高质量的单元测试,将得到如下反馈:

可以说,经过单元测试的代码,让人更放心,当然如果你是天生蜜汁自信的人另说。

什么样的代码难写单元测试?

如何写出可测的代码呢?

思考过这个问题的同学,估计都有一套自己的方法论,下面是我个人的总结:

提炼!让功能逻辑内聚!

早写!写完功能代码或者写功能时,尽早思考接下来如何测试!

分离!把支线的分支逻辑分离到单独的类,用策略模式以及责任链模式处理分支。

分层!当功能逻辑复杂时,增加层次结构,让复杂的逻辑分散到下层不同的类中,降低单个类的复杂度。

总结下来,就是类要小、方法要内聚、if要少。

最后,设计是不断演化而趋向完美的,单元测试的难易程度某种程度体现了设计的复杂度,测试驱动设计的思想,个人理解就是通过编写单元测试,来暴露出设计上的缺陷,进而改进设计。

上一篇下一篇

猜你喜欢

热点阅读