菜鸟学Java(二十一)——怎样更好的进行单元測试——JUnit
測试在软件生命周期中的重要性,不用我多说想必大家也都很清楚。软件測试有许多分类,从測试的方法上可分为:黑盒測试、白盒測试、静态測试、动态測试等;从软件开发的过程分为:单元測试、集成測试、确认測试、验收、回归等。
在众多的分类中,与开发者关系最紧密的莫过于单元測试了。像其它种类的測试基本上都是由专门的測试人员来完毕,仅仅有单元測试是全然由开发者来完毕的。那么今天我们就来说说什么是单元測试,为什么要进行单元測试,以及如更好的何进行单元測试。
什么是单元測试?
单元測试(unit testing),是指对软件中的最小可測试单元进行检查和验证。比方我们能够測试一个类,或者一个类中的一个方法。
为什么要进行单元測试?
为什么要进行单元測试?说白了就是单元測试有什么优点,事实上測试的优点无非就是降低bug、提高代码质量、使代码易于维护等。单元測试有什么优点请看一下百度百科中归纳的四条:
1、它是一种验证行为。
程序中的每一项功能都是測试来验证它的正确性。它为以后的开发提供支援。就算是开发后期,我们也能够轻松的添加功能或更改程序结构,而不用操心这个过程中会破坏重要的东西。而且它为代码的重构提供了保障。这样,我们就能够更自由的对程序进行改进。
2、它是一种设计行为。
编写单元測试将使我们从调用者观察、思考。特别是先写測试(test-first),迫使我们把程序设计成易于调用和可測试的,即迫使我们解除软件中的耦合。
3、它是一种编写文档的行为。
单元測试是一种无价的文档,它是展示函数或类怎样使用的最佳文档。这份文档是可编译、可执行的,而且它保持最新,永远与代码同步。
4、它具有回归性。
自己主动化的单元測试避免了代码出现回归,编写完毕之后,能够随时随地的高速执行測试。
怎样更好的进行单元測试?
在讨论怎样更好的进行单元測试之前,先来看看我们曾经是怎么測试代码的。
曾经是这样測试程序的:
public int add(int x,int y) {
return x + y;
} public static void main(String args[]) {
int z = new Junit().add(2, 3);
System.out.println(z);
}
如上面所看到的,在測试我们写好的一个方法时,一般是用一个main方法调用一下我们要測试的方法,然后将结果打印一下。如今看来这样的方式已经很out了,所以出现了许多单元測试的工具,如:JUnit、TestNG等。借助它们能够让我们的单元測试变得很方便、高效。今天就说说怎样利用JUnit进行单元測试。
我们新建一个Java Project以便进行演示,至于Java Project怎么创建我就不在此赘述了,假设连怎么建Java Project,那你还不适合看这篇文章。建好以后在该项目的“src”文件夹上右击,选择new——》JUnit Test Case,然后按下图填写必要信息:
填写好包名和类名(选择New JUnit 4 Test),点击最以下的那个“Browse”button来选择须要測试的类:
手动输入我们要測试的类,选择该类,点击“OK”,回到第一张图的界面,然后点击“Next”,来到下图:
勾选要測试的方法,点击“Finish”,这样我们的JUnit測试实例就建好了。然后就能够写详细的測试了:
package com.tgb.junit.test; //静态引入
import static org.junit.Assert.*;
import static org.hamcrest.Matchers.*; import org.junit.Test; import com.tgb.junit.Junit; public class JUnitTest { @Test
public void testAdd() {
int z = new Junit().add(2, 3);
assertThat(z , is(5));
} @Test
public void testDivide() {
int z = new Junit().divide(4, 2);
assertThat(z, is(2));
}
}
写好以后,右击该类选择“Run As”——》“JUnit Test”,出现下图代表測试通过:
到这里,可能有人会有疑问,JUnit跟用main方法測试有什么差别呢?
首先,JUnit的结果更加直观,直接依据状态条的颜色就可以推断測试是否通过,而用main方法你须要去检查他的输出结果,然后跟自己的期望结果进行对照,才干知道是否測试通过。有一句话能够很直观的说明这一点——keeps the bar green to keeps the code clean。意思就是说,仅仅要状态条是绿色的,那么你的代码就是正确的。
第二点,JUnit让我们同一时候执行多个測试变得很方便,以下就演示一下怎样进行多实例測试:
首先我们要再建一个待測试类,然后再建一个相应的JUnit測试实例,步骤略。然后在我们測试实例的包上右击选择“Run As”——》“Run Configurations”,例如以下图;
选择第二项“Run all tests in the selected project, package or source folder”,然后点击“Run”效果例如以下:
能够看到,我们本次測试了两个类,共三个方法,这样的方便的效果在測试实例越多的情况下,体现的越明显。至于main方法执行多个測试,想想就认为很麻烦,这里就不演示了。
JUnit除了能够測试这些简单的小程序,还能够測试Struts、JDBC等等,这里仅仅是用这个小程序做过简单的介绍。本实例使用的是hamcrest断言,而没有使用老的断言,由于hamcrest断言更加接近自然语言的表达方式,更易于理解。
本实例须要引入以下三个jar包:
hamcrest-core-1.3.jar
hamcrest-library-1.3.jar
junit-4.10.jar
最后附上经常使用hamcrest断言的使用说明:
数值类型
//n大于1而且小于15,则測试通过
assertThat( n, allOf( greaterThan(1), lessThan(15) ) );
//n大于16或小于8,则測试通过
assertThat( n, anyOf( greaterThan(16), lessThan(8) ) );
//n为不论什么值,都測试通过
assertThat( n, anything() );
//d与3.0的差在±0.3之间,则測试通过
assertThat( d, closeTo( 3.0, 0.3 ) );
//d大于等于5.0,则測试通过
assertThat( d, greaterThanOrEqualTo (5.0) );
//d小于等于16.0,则測试通过
assertThat( d, lessThanOrEqualTo (16.0) ); 字符类型
//str的值为“tgb”,则測试通过
assertThat( str, is( "tgb" ) );
//str的值不是“tgb”,则測试通过
assertThat( str, not( "tgb" ) );
//str的值包括“tgb”,则測试通过
assertThat( str, containsString( "tgb" ) );
//str以“tgb”结尾,则測试通过
assertThat( str, endsWith("tgb" ) );
//str以“tgb”开头,则測试通过
assertThat( str, startsWith( "tgb" ) );
//str忽略大写和小写后,值为“tgb”,则測试通过
assertThat( str, equalToIgnoringCase( "tgb" ) );
//str忽略空格后,值为“tgb”,则測试通过
assertThat( str, equalToIgnoringWhiteSpace( "tgb" ) );
//n与nExpected相等,则測试通过(对象之间)
assertThat( n, equalTo( nExpected ) ); collection类型
//map中包括key和value为“tgb”的键值对,则測试通过
assertThat( map, hasEntry( "tgb", "tgb" ) );
//list中包括“tgb”元素,则測试通过
assertThat( iterable, hasItem ( "tgb" ) );
//map中包括key为“tgb”的元素,则測试通过
assertThat( map, hasKey ( "tgb" ) );
//map中包括value为“tgb”的元素,则測试通过
assertThat( map, hasValue ( "tgb" ) );
菜鸟学Java(二十一)——怎样更好的进行单元測试——JUnit的更多相关文章
- 菜鸟学Java(十一)——GET与POST
相信大家在面试的时候经常会被问到:GET与POST有什么区别吧?你是怎么回答的呢?POST比GEt安全?GET有URL的长度限制而POST没有或者很大?GET通过URL或者Cookie传参数,POST ...
- 菜鸟学Java(十九)——WEB项目測试好帮手,Maven+Jetty
做WEB开发,測试是一件非常费时间的事情.所以我们就应该用更简单.更快捷的方式进行測试.今天就向大家介绍一个轻量级的容器--jetty.j今天说的etty是Maven的一个插件jetty-maven- ...
- Java单元測试工具JUnit 5新特性一览
Java单元測试工具JUnit 5新特性一览 作者:chszs,未经博主同意不得转载. 经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs JUnit是最流行的开源 ...
- 谈谈单元測试之(二):測试工具 JUnit 3
前言 上一篇文章<为什么要进行烦人的单元測试?>讨论了一下现阶段软件开发中,程序猿们測试情况的现状.这篇文章中,我打算介绍一下单元測试的工具(插件).而且推荐大家以后在开发中,真正的用上单 ...
- 敏捷自己主动化单元測试 (从前台 JavaScript 至后台 Java)
此份材料的内容适用于前台 JavaScript 与后台 Java 的单元測试◦ 希望, 能协助开发者可在最短的时间内, 开展单元測试的工作◦ 附件: 敏捷自己主动化单元測试 例子代码: QUnit 例 ...
- 菜鸟学Java(十五)——Java反射机制(二)
上一篇博文<菜鸟学编程(九)——Java反射机制(一)>里面,向大家介绍了什么是Java的反射机制,以及Java的反射机制有什么用.上一篇比较偏重理论,理论的东西给人讲出来总感觉虚无缥缈, ...
- 菜鸟学Java(十四)——Java反射机制(一)
说到反射,相信有过编程经验的人都不会陌生.反射机制让Java变得更加的灵活.反射机制在Java的众多特性中是非常重要的一个.下面就让我们一点一点了解它是怎么一回事. 什么是反射 在运行状态中,对于任意 ...
- 菜鸟学java开篇
从事it工作已有接近两年的时间了, 一直从事的是php的工作, 一直都想学java ,原因就不多说了, 毕竟优秀的php程序员,都会是一个其他方面的高手, 例如java ,并不是说java有多好,ph ...
- 菜鸟学SSH(十一)——Hibernate之SchemaExport+配置文件生成表结构
今天说点基础的东西,说说怎样通过SchemaExport跟Hibernate的配置文件生成表结构.事实上方法很easy,仅仅须要两个配置文件,两个Java类就能够完毕. 首先要生成表,得先有实体类,以 ...
随机推荐
- akka.net与微软分布式框架Orleans
微软分布式框架Orleans开源了 开源地址: https://github.com/dotnet/orleans 昨天编译了一下,这个最新的Orleans安装程序(用github源码编译的) 下载地 ...
- Adb shell得到root才干
于Adb shell我们希望用一些文件系统文件夹时,经常有在没有痛苦Root才干,系统会提示su: Permission Denied. su不是每个手机有一个.能不能在这里下载: http://do ...
- jsp include指令标签
假设须要在JSP页面内某处总体嵌入一个文件,就能够考虑使用这个指令标签. 该指令标签例如以下: <%@ include file ="文件的名字"%> 该指令标签的作用 ...
- windows 设置脚本IP
毫无疑问,在windows设置IP非常方便,因为有操作简单,直观的界面.通过图形用户界面设置IP在一般情况下是足够.但是,对于那些谁经常出差,由人产生的转换工作,这样的变化IP无疑耗时且不方便.假设一 ...
- 2014.06.14 GlusterFS技术交流视频
6月14线下GlusterFS视频交流.高清视频是非常好的,我初听言论方面,谈到迅速,似乎不是很清楚,讲座结束后速度需要改进.谢谢能力的天空AbleSky高大内设,谢谢学生参加. 在线公开课:http ...
- android 该项目的优化toast优化技巧
我们这样做的时候经常登录认证使用toast提示用户输入出现错误等..很多人都直接使用 Toast.makeText(LoginActivity.this, "请联系小区的物业管理" ...
- Appium - iOS Mac环境结构
Appium - iOS Mac环境结构 笔者: Max.Bai 时间: 2014/10 1. iOS开发环境的搭建 1.1系统要求 MacOS X 10.7 or higher, 10.9.2 re ...
- 跑openstack命令错误【You must provide a username via either -...】
openstack设置环境,openstack该服务已经启动.当运行openstack当一个命令,如nova service list例如,下面的错误信息 You must provide a use ...
- Web Host消息处理管道
Web Host消息处理管道 前言 我们知道Web API本身是无法提供请求-响应的机制,它是通过Web Host以及Self Host的寄宿的宿主方式来提供一个请求-响应的运行环境.二者都是将请求和 ...
- CentOS7 安装Hadoop集群环境
先按照上一篇安装与配置好CentOS以及zookeeper http://www.cnblogs.com/dopeter/p/4609276.html 本章介绍在CentOS搭建Hadoop集群环境 ...