在许多程序员眼中,单元测试似乎是可有可无的,觉得这应该是测试人员的工作。实际上,测试代码和生成代码同样重要。我们不但需要测试代码,而且需要的是整洁的测试代码。

测试为什么要整洁

我们对待测试代码需要像对待生产代码一样,写之前需要进行严谨的思考、详细的设计。这里分享一下我自己的学习编程的一些经历。

没有单元测试

刚毕业的时候,我的代码可以说是年少轻狂,总是对自己充满自信。根本就不写单元测试,写完之后自测也是随意的点两下就算自测通过了。代码提交测试后,恐怖的事情就出现了,铺天盖地的bug向我袭来。每天工作有一半以上的时间是在和测试同事沟通,其余的时间是在改bug。本来1天的工作可能需要3天才能完成。当我意识到这样做完全是费力不讨好的时候,我决心每次写完代码之后,要写一段单元测试,保证单元测试通过后再提交。

随意的单元测试

在开始写单元测试之后,我的工作效率提高了很多,下班都比原来早了。感觉写单元测试是一个无比正确的决定。随着项目的进行,中间处理过几次紧急的bug fix,当时就没有顾上去写单元测试。然而,当我又一次完成一个新的feature的时候,像往常一样开始跑单元测试,结果是:Failed!就是因为之前的改动导致的。由于手里还有其他比较紧急的工作,单元测试又被放下了。就这样,我又回到了没有单元测试的工作状态。

现在的我已经不像当初那样盲目的自信了,没有单元测试的代码让我感到恐慌。

决心重构单元测试

曾经有一段可用的单元测试放在我面前,但我没有珍惜,直到失去才追悔莫及。这次我决心重建单元测试,不但要重建,还要写一段好的单元测试。吸取上次的教训,要使我的单元测试可扩展,可维护。把一些公共的方法抽取出来,将不同概念的测试进行拆分。做到“每个概念一个测试”,测试中需要使用断言判断是否成功,而不是人为查看日志。每个测试都要包含构造-操作-检验三个环节,这三个环节要定义清楚。

这样一来,我就有了一套整洁的单元测试,后来修改代码后,单元测试可以方便的进行扩展和复用,工作效率再次提升。

整洁测试的规则

整洁测试需要遵循F.I.R.S.T规则。什么是F.I.R.S.T规则呢?

快速(Fast)

测试应该足够快,如果测试一次需要等待很长时间,没有人愿意频繁的运行测试,也就没办法快速发现问题。久而久之,我们又会失去测试……

独立(Independent)

测试之间应该相互独立,一个测试的失败不应该影响其他的测试,否则就会导致每次测试出现一大堆问题,我们每次只能解决最上级的测试暴露出来的问题,下级测试需要再次测试才行。这就会大大降低工作效率。

可重复(Repeatable)

测试应该在各种环境中可以重复执行,不论是你的本地环境,测试环境还是生产环境。测试都应该能够跑通。这样才能保证线上的质量,测试也才有意义。

自足验证(Self-Validating)

测试应该有布尔值输出(最好使用断言),我们不应该通过查看日志来判断测试是否通过,更不应该通过人为比较两个文本是否相同来判断测试是否通过。这样不但失去了测试的准确性,也浪费了我们自己的时间。

及时(Timely)

测试应该及时编写,在设计生产代码的同时就应该将测试一并设计好,不然的话,当你写好生产代码,也许会因为某些代码难以测试而放弃。

结语

总结一下今天讨论的内容,我们需要整洁的单元测试,它的地位与生产代码一样,需要我们认真设计。设计测试的时候需要遵循F.I.R.S.T原则。


觉得文章不错或者有什么问题的话,可以关注我的微信公众号,一起交流。

代码洁癖系列(七):单元测试的地位相关推荐

  1. 代码洁癖系列(八):迭代的原则

    我们都知道,一个软件的维护成本往往要高于其研发成本.在维护过程中,我们的代码需要不断的进行迭代.迭代的目的有两个:修复bug和增加新特性.但是迭代也会带来一系列新的问题,比如新的bug,或者是破坏代码 ...

  2. 代码洁癖系列(五):外在的格式美

    我们在阅读一些优秀项目的源码时,一定会感叹他们代码的整洁和一致性.而作为第一印象,代码格式的整齐是让人能够继续阅读下去的动力.今天我们分别从垂直格式和横向格式两个方面来讨论代码的格式.修正格式的方法有 ...

  3. 代码洁癖系列(一):什么是整洁代码

    作为一个代码洁癖患者,我最大的愿望就是世界和平--对不起,拿错剧本了,最大的愿望就是将对代码的洁癖传播给每一个人,净化所有的代码.这是一个宏大的愿望,但我会一直努力净化我所看到的每一行代码,并且希望能 ...

  4. 代码洁癖系列(六):处理错误

    程序运行过程中,有些错误是不可避免的,而如何使程序在出现错误时代码仍然正常工作就成了程序员的日常工作之一.那么处理错误和代码整洁有什么关系呢? 前面我们提到过,try-catch代码块会破坏代码的结构 ...

  5. 代码洁癖系列(三):整洁的类和函数

    前面我们讨论了什么样的命名更能够让你赏心悦目,今天来讨论一下面向对象编程过程中最重要的环节,编写类和函数.我们仍然用Java来演示,什么样的类和函数才算是整洁的. 首先讨论函数,函数定义好了,类也就容 ...

  6. 代码洁癖系列(四):可忽略的注

    刚开始学编程的时候,老师就告诉我们,注释很重要,但是一直到现在,也没有人真正告诉过我要怎么写注释.还有很多人甚至干脆不写注释.所以今天想聊一下到底如何写注释. 提到注释就让我想起一个段子:两个程序员去 ...

  7. 代码洁癖系列(四):可忽略的注释

    刚开始学编程的时候,老师就告诉我们,注释很重要,但是一直到现在,也没有人真正告诉过我要怎么写注释.还有很多人甚至干脆不写注释.所以今天想聊一下到底如何写注释. 提到注释就让我想起一个段子:两个程序员去 ...

  8. 代码洁癖系列(二):命名的艺术

    不知道大家还记不记得<家有儿女>里有这么一段经典台词:"我叫夏雪","我叫夏雨","我叫夏冰雹". 刘星自己给自己起的名字承包了 ...

  9. 代码洁癖症的我,学习 Lint 学到心态爆炸

    本文由 GitCode8 授权投稿 原文链接:https://juejin.im/post/5d307615f265da1b6b1d0dd9 前言 以前对下面的问题,我的态度是,不报错就是没问题,报错 ...

最新文章

  1. Ubuntu PyCharm cv2 无代码提示解决方法
  2. java的初始化顺序
  3. 地图上实现高效率绘制海量点的原理
  4. HTML5表格简单应用案例之[招聘需求表]
  5. 天梯赛-是否完全二叉搜索树
  6. BZOJ 1010: [HNOI2008]玩具装箱toy 斜率优化dp
  7. 有谁了解 最基础的计算机的网络结构呢?
  8. 多目标跟踪——MOT数据集的学习笔记
  9. Python 爬取 201865 条《隐秘的角落》弹幕,发现看剧不如爬山?
  10. 手机芯片 AI 之争:高通、联发科均超华为!
  11. 转载《OpenGIS: Open Geodata Interoperation Specification》中文翻译
  12. 11.程序员的自我修养---运行库
  13. sim7020c功耗_SIM7020C NB-IoT HAT教程
  14. LINUX下DNS的查看和配置,Linux系统中查看和修改DNS配置的方法
  15. vab EXCEL 日历制作
  16. chrome 抓取图片_利用chrome开发工具进行动态网页抓取
  17. 萌爪医生微信小程序内部服务器错误,企业微信提示网络错误怎么回事
  18. 深渊水妖 (模拟 看清题意
  19. FPGA进行多路并行插值滤波(多相滤波)的实现原理
  20. 电脑常见错误代码解析

热门文章

  1. 机器学习入门(十六):SVM——线性 SVM,间隔由硬到软
  2. 4 Vue中的Ajax
  3. Unicode编码解码在线转换工具
  4. 案例二:客户信息管理
  5. 敏捷迭代管理 --每日站会
  6. make makefile cmake qmake都是什么,有什么区别?
  7. 智能门锁真的靠谱吗?
  8. c语言每个字符占10个字符位左对齐,C语言考前复习资料
  9. 创客exynos-fs4412系统移植-(uboot,内核,文件系统)
  10. 2016计算机销量排名,2016US News计算机排名TOP100详情一览表