测试驱动之我思我为

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

背景

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

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

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

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

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

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

单元测试的正面效应

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

  • 明确代码在给定的条件下能够正常的工作,这个是单元测试的本质功效;
  • 促进代码内聚,高度内聚的代码才能够简单的单元测试,单元测试反过来会促使高内聚的设计;
  • 增强重构的意愿,谁要是把线上代码重构出了bug,绝对会收获一大坨的负面情绪,而单元测试能够保证重构后的正确性。
  • 让你积累更多自信,点点滴滴量变产生质变。自信到底有多重要,搜索一下这个你看似很熟悉的名词,重要性绝对超出你的想象。

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

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

  • 有人说过长的方法,个人认为不尽然,方法的长短不是关键,关键在于方法承载的功能是否凝练,内聚,也就是说方法调用产生的结果会不会因为多个原因而改变。

  • 外部调用太多,每个外部调用都是引起方法变化的原因,验证当前方法逻辑时,我们需要伪造出调用的结果,调用越多,逻辑就越复杂,伪造数据就越难,写测试用例就越费劲。

  • 分支过多,条件分支会造成测试用例编写的难度成倍增加,想要对逻辑全面覆盖,就需要每个分支都运行到位,通常需要伪造合适的参数,然后写多份几乎相同的用例,用例代码copy来copy去,最后就是一锅粥。最后还要区分到底哪个参数走到哪个分支,头都搞晕,这样的用例以后几乎都难维护.

如何写出可测的代码呢?

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

提炼!让功能逻辑内聚!

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

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

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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352

推荐阅读更多精彩内容

  • 1.测试与软件模型 软件开发生命周期模型指的是软件开发全过程、活动和任务的结构性框架。软件项目的开发包括:需求、设...
    宇文臭臭阅读 6,723评论 5 100
  • 1.测试与软件模型 软件开发生命周期模型指的是软件开发全过程、活动和任务的结构性框架。软件项目的开发包括:需求、设...
    Mr希灵阅读 21,957评论 7 278
  • 前言 本开发规范基于《阿里巴巴Java开发手册终极版》修改,并集成我们自己的项目开发规范,整合而成。 为表示对阿里...
    4ea0af17fd67阅读 5,638评论 0 5
  • “鸡汤”是一种很玄乎的东西,刚开始喝的时候只觉得清香无比,喝下去之后觉得浑身五脏六腑都充满了能量。然而喝的多了却是...
    16aa5fab5f62阅读 461评论 0 6
  • 文/墨雪 共青的日子里,掺了酸甜苦辣 丢了家乡的问候 有的时候等待的发霉了 大路上的老街灯又发了芽。 共青的夜有些...
    诗与雪阅读 229评论 0 4