老李分享:单元测试的 5 个错误

当我第一次听说可以使用框架比如JUnit来进行单元测试的时候,我惊叹这真是一个简单而强大的概念。它取代了随机测试,使你可以保存你的测试代码,并按照需要随时运行它们。按照我的理解,关于单元测试并没有多少产生误解的可能。但是过去的几年中,我确实见过几种或多或少不太正确的单元测试使用方式。这里按照重要程度,列出5条:

1. 跟协作逻辑一起来测试算法。如果跟协作逻辑代码分离开来,那么算法逻辑是最容易测试的(参见选择性单元测试 – 代价和好处)。否则在你的逻辑被测试之前,你就不得不先进行诸如通过任务队列提交一个任务之类的工作。 任务队列部分只会使事情变得复杂。除非你想测试任务队列本身,否则你就应当把调用run方法时所执行的逻辑剥离开来,并对它进行单独测试。那样,不论是编码还是测试都会更易于编写和管理。

2. Mock测试太多。也许单元测试的最大好处就是它迫使你编写能够独立测试的代码。也就是说,你的代码会变得模块化。当你把你要处理的对象的周围的一切都模拟了,就没有什么能迫使你去把各部分分离开来。你会发现这样写出的代码,你很难在外围添加独立的部分 – 因为所有东西都纠缠在一起。Bill Wake最近发推说: ”真是讽刺 – 模拟测试框架越强大,你在改进设计时所感受到的压力就会越小。”

3. 不使用断言。有时我会看到一些测试,里面创建了一个对象,调用了一些方法,然后,就没有然后了。也许它是在循环里这样做的,而且在创建和调用上会有些差异。但是,却没有用断言来做任何检查。这就完全失去了意义 – 没有检查你的代码是否按照预期进行工作的。当然,代码是运行了,但是仅此而已。如果抛出了一个异常,我们会注意到它,但是却不会验证其它任何事情。

4. 在测试代码中遗留print语句。我把这视为手工测试的后遗症 – 你希望看到对象的值来判断它们是否正确。但是所有的检查都应当使用断言来完成。如果单元失败了,你也能看到它,因为这个测试也会失败。当测试通过时,什么也不应当打印出来。在编写测试代码时,使用print语句有时是有用的。但是在需要用print的地方应当设置一个标志位,用来在进行测试的时候屏蔽它。

5. 查看日志信息,而不是运行结果。 还好这并不普遍,但是我却见过一个非常有能力的开发人员这么干过。要知道,真正重要的是方法的运行结果,而不是日志中都打印了什么,因为即使代码中有错误,测试也可能会通过。好了,说的很明白了。

后面3个问题都很容易规避。头2个问题则需要付出更多努力,但是会得到良好分离的代码。

转载于:https://blog.51cto.com/10988776/1722923

老李分享:单元测试的 5 个错误相关推荐

  1. 老李分享:jvm垃圾回收

    老李分享:jvm垃圾回收 1.垃圾收集算法核心思想 java语言建立了垃圾回收机制,用于跟踪正在被使用(引用)的对象和没有被使用(引用)的对象,该机制可以有效防范动态内存分配中可能发生的两个危险:因垃 ...

  2. 老李分享:《Java Performance》笔记1——性能分析基础

    老李分享:<Java Performance>笔记1--性能分析基础 1.性能分析两种方法: (1).自顶向下: 应用开发人员通过着眼于软件栈顶层的应用,从上往下寻找性能优化的机会. (2 ...

  3. 老李分享:持续集成学好jenkins之Git和Maven配置

    老李分享:持续集成学好jenkins之Git和Maven配置 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请 ...

  4. 老李分享:5个衡量软件质量的标准

    老李分享:5个衡量软件质量的标准 1. Sourc Lines of Code (SLOC)  统计代码行数可能是最简单的方法.它能体现软件的规模,为项目的发展和计划提供一些数据支撑.例如,我们每个月 ...

  5. 老李分享:HTTP协议之请求和响应

    老李分享:HTTP协议之请求和响应 HTTP请求头详解: GET http://www.foo.com/ HTTP/1.1 GET是请求方式,请求方式有GET/POST http://www.foo. ...

  6. 老李分享:系统可用性评估

    老李分享:系统可用性评估 移动互联网时代,似乎大家都在强调架构或服务的高可用,那什么是高可用性呢? 首先,我们来了解下什么是系统的可用性(System Usability),即系统服务不中断运行时间占 ...

  7. 老李分享:Mac快捷键

    老李分享:Mac快捷键 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908821478,咨询 ...

  8. 老李分享:shell 监控cpu,memory,load average 1

    老李分享:shell 监控cpu,memory,load average poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课 ...

  9. 老李分享:Web Services 组件 1

    老李分享:Web Services 组件 在过去的几年里,三大主流技术已经成为构成当今 web service 技术的全球标准.接下来我们来讨论一下这些技术. XML-RPC XML-RPC 是在计算 ...

  10. 老李分享:https协议

    老李分享:https协议 最近我们看到很多站点使用 HTTPS 协议提供网页服务.通常情况下我们都是在一些包含机密信息的站点像银行看到 HTTPS 协议. 如果你访问 google,查看一下地址栏,你 ...

最新文章

  1. 在线实时大数据平台Storm本地模式运行的一个小发现
  2. 图解 Elasticsearch 原理
  3. open cv提取图片特征值_基于VGG16网络提取Flicker8K数据集图像特征
  4. java nio.Buffer的属性变化
  5. SAP Odata filter的语法
  6. 数据交互智能终端设想
  7. [LintCode] Reverse Pairs 翻转对
  8. Iterator图解
  9. mysql 迁移后无法启动_Mysql数据迁移后启动出错_MySQL
  10. 95-230-010-源码-WordCount走读-概述
  11. Word中输入10以上带圈数字
  12. hn版是什么版本的教材_初中教材都有什么版本
  13. ❤️肝下25万字的《决战Linux到精通》笔记,你的Linux水平将从入门到入魔❤️【建议收藏】
  14. scrapy框架爬虫
  15. linux操作系下RAR的使用
  16. Java的8大基本数据类型
  17. 自动驾驶仿真实验流程--以PanoSim仿真软件为例
  18. 运用selenium库写淘宝抢购详解【3】(文末附带源码)
  19. 【Linux上安装Scala】
  20. JS安全防护算法与逆向分析——新浪微博登录JS加密算法

热门文章

  1. Cocos2d-x动画播放(序列帧)
  2. 独门绝技:一招克死所有病毒(转贴,没有用过)
  3. Transact-SQL 语法约定
  4. Linux下maven安装
  5. python time
  6. Windows 2003上 SaltStack/Salt 和 psutil 可能存在的问题及解决
  7. 【随机过程】随机过程之更新过程(1)
  8. JSP版LCX:端口转发神器 KPortTran
  9. 他们为啥说我没有数据分析思维?
  10. 个人生活的量化分析(二):Apple健康数据分析