【Java程序员修炼之道 之 单元测试】

单元测试是一个很是好用的工具,是一个Java程序员修养的一部分。从04年开始,我就开始在项目实践中使用单元测试。十几年来,参与的项目基本上都或多或少的使用了单元测试,多的能有100%覆盖率的要求,少的也要覆盖主要代码,发现这个实践在提升软件质量和开发速度上仍是颇有好处的。在和朋友同事的交流中,发现有不少项目没有使用单元测试,也有不少程序员不会写单元测试,可是你们对这个都颇有兴趣。因此我想把本身掌握的关于单元测试的技能(架构、设计和技术)和实施策略分享一下。固然,要是有那个企业愿意要求我去作相关的内训和咨询,我会很高兴的。程序员

单元测试这系列想讲讲两方面内容: 
1. 如何项目中使用单元测试 
2. Java单元测试的技术 
3. 一些实施单元测试的误区
数据库

本文包括下面几部分的内容 
1. 我所理解的单元测试的定义和分类 
2. 实施单元测试的好处 
3. Java程序员单元测试工具库
架构

单元测试的定义和分类

单元测试的定义指程序员编写的用于测试逻辑代码的代码。个人理解中单元测试分红如下两类:框架

代码测试

代码测试是指对代码的实现进行测试,不依赖于第三方环境,运行速度很快。举几个例子:ide

  • 测试aController对象的doGet方法正确的把参数P1和P2传递给了bService对象的query方法工具

  • 测试一个Dao类的get方法正确的把"select a,b from t where l=5"传递给jdbcTemplate的query方法,并把查询结果返回。
    post

集成测试

集成测试是指集成了第三方依赖以后的测试。它会依赖于第三方环境,运行速度相对代码测试慢。举几个例子:单元测试

  • 经过Http协议测试REST服务学习

  • 调用Dao类,测试它从数据库里面正确的获取到了数据
    测试

实施单元测试的好处进行早期测试

在软件工程中,你们都知道越早开始测试越好,越早开始测试就能越早发现缺陷,修改代价就越小。 
可是对于软件系统的测试须要你至少编写完一个可运行的最小化系统以后才能进行。在外人看到的可操做的界面出现以前,已是开发人员好几天努力工做的汗水了。可是按照传统的工做方法,全部的这些努力,在界面没有出来以前,除了知道他们是能够编译经过的,没法进行任何测试。更甚的是,若是你的系统依赖于一个未实现的第三方系统,那么在那个第三方系统能正确响应你的请求以前,你的代码得不到任何有效的测试。 
可是使用单元测试技术,经过使用Stub和Mock技术,咱们能够不用依赖界面,不用依赖第三方系统,就能够对代码进行测试处,甚至,你能够实现一个方法就测试一个方法,不用等整个功能都完成了再测试。

能够放心的修改代码以及进行代码重构

单元测试是能够自动化运行的,若是代码有良好的单元测试覆盖,在对代码进行重构和修改以后,咱们能够用极短的时间(几分钟)对整个系统进行一下测试,测试所有经过,这个说明的修改对系统没有形成严重影响(这不能说明单元测试覆盖不到的地方也没有问题),因而你就能够安心的继续修改代码和重构代码。

有助于提升代码质量和架构设计

为了便于单元测试和代码覆盖,架构必然会在逻辑封装,解耦合,依赖注入,控制反转,对外接口封装等方面进行优化。 
举几个例子:

  • 把逻辑代码和界面代码都写在一块儿,会致使对逻辑代码的测试要包括对界面元素的解析。因而,“逻辑代码和界面代码的分离”成了中止单元测试以外的最小代价的解决方案

  • 在代码中实例化所依赖的对象,会加大隔离测试的难度,而且在所依赖的对象实现以前,没法进行测试。因而,依赖注入成了最佳的选择。

可重复对代码进行验证

编写良好的单元测试代码能够自动化运行,能够在全部的开发人员的环境里运行,能够在持续集成环境里运行,能够在每次代码修改提交后运行,项目的代码和功能在反复的收到测试。

加快开发速度

前期的小小投入,可以在整个项目周期中发挥做用,可以提升代码的质量,可以对代码进行早期测试,可以减小代码Bug,可以保证代码不会被其余代码破坏。修改Bug和调试的时间、相关的沟通时间被大幅度的减小。项目时间能更有保证。

起到代码文档的做用

对于一个方法或者一个对象的使用,有的时候光用注释很难说清楚。单元测试中对该方法/对象的使用提供了实例说明的做用,使咱们更容易理解对其的使用。

Java程序员单元测试工具库

写单元测试也是须要掌握一些工具的,不过这些工具使用起来都比较简单,也和容易学习。在后面的文章中,我将会介绍其中的一部分我常常用到的。

单元测试框架

在Java世界中,有两个使用最多的单元测试框架,JUnit和TestNG。使用最多和支持最普遍的是JUnit。后面的文章中我将会给你们介绍一下它的使用。

Mock工具

Mock工具是进行代码测试所必须掌握的一个工具。目前流行的有Mockito, EasyMock和JMock这三种。我之前用过EasyMock和JMock,后来开始使用Mockito以后就停不下来了。后面的文章中会给你们介绍一下它的用法。

其余工具

通用型的我将会介绍Hamcrest,一个用于验证测试结果工具库。其余的有一些用于各类专门目的而使用的工具,这类工具备不少,好比

  • Spring Test,用于对Spring程序进行集成测试的必需品,我将会在后面的文章中介绍

  • Spring MVC Test Framework,一个用于Spring MVC编写的Web应用的工具,我将会在后面的文章中介绍

  • DBUnit,这个也有不少人用,可是我基本上没用过,因此就不介绍了。有兴趣的能够本身去看看。

  • rest-assured, Java DSL for easy testing of REST services,看起来很美,尚未用过,等我学习使用完以为好用了再分享。

相关文章
相关标签/搜索