【Java 语言生态篇】Junit 测试单元

01 概述

JUnit是一个由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework)。Junit测试是白盒测试。JUnit有它自己的JUnit扩展生态圈。多数Java的开发环境都已经集成了JUnit作为单元测试的工具。[1]

JUnit是一个开放源代码的Java测试框架,用于编写和运行可重复的测试。他是用于单元测试框架体系xUnit的一个实例(用于java语言)。它包括以下特性:

1、用于测试期望结果的断言(Assertion)

2、用于共享共同测试数据的测试工具

3、用于方便的组织和运行测试的测试套件

4、图形和文本的测试运行器

测试一般分为:单元测试、集成测试(主要看一块代码加进去后,系统会不会有问题)、验收测试和压力测试。在大点的公司开发人员每天上班后,第一件事情就是从svn上把自己负责的代码checkout下来,然后运行单元测试,如果单元测试通过,那么说明自己的代码没有问题,然后就在代码块上修改与添加,完成后再用junit进行测试,测试完成后如果没有问题,那么就把相应的代码块提交给svn上。[2]

02 Junit配置

环境:Eclipse 中配置junit,

  1. 选择项目Junit4(在Package Explorer中)
  2. 右击鼠标
  3. 选择properties
  4. 选择Java Build Path (在左边的菜单中)
  5. 在右边选择标签 Libraries
  6. 单击按钮“Add Library”
  7. 选择JUnit , 单击按钮 “Next>”
  8. 选择JUnit library version 为: JUnit4
  9. 单击按钮“Finish”
  10. 单击按钮 “OK”

或手动 添加Junit.jar和hamcrest-core-xx.jar,hamcrest-library-xx.jar (或hamcrest-all-xx.jar)。(建议手动添加,在eclipse中通过前一种方法只引入Junit-xx.jar 和 hamcrest-core-xx.jar)

03 Junit3 和 Junit4的区别
  1. Junit3必须引入和继承TestCase
  2. Junit3 测试方法必须以test开头
  3. Junit3 测试方法前后的执行方法必须名为setUp() 和 tearDown()
  1. Junit4 不需要引入和继承TestCase。采用注解,在方法前加入@Test
  2. Junit4 测试方法不需要强制为test开头
  3. Junit4 测试方法前后执行方法不需要强制命名为setUp() 和 tearDown() ,只需要添加注解@Before和@After
  4. Junit4 中添加了异常测试
04 Junit4的几个常用注解[3]

Junit 4 的单元测试用例执行顺序为:

@BeforeClass –> @Before –> @Test –> @After –> @AfterClass;

每一个测试方法的调用顺序为:@Before –> @Test –> @After。

--------------------------------------------------------------------

  1. @Before:初始化方法,在任何一个测试执行之前必须执行的代码;
  2. @After:释放资源,在任何测试执行之后需要进行的收尾工作。在每个测试方法执行之后执行一次,该annotation只能修饰public void 方法;
  3. @Test:测试方法,表明这是一个测试方法。在Junit中将会自动被执行。该annotation只能够修饰public void 方法。对于方法的声明也有如下要求:名字可以随便取,没有任何限制,但是返回值必须为void,而且不能有任何参数。如果违反这些规定,会在运行时抛出一个异常。至于方法内该写些什么,那就要看你需要测试些什么了;在这里可以测试期望异常和超时时间,如 @Test(timeout = 100):我们给测试函数设定一个执行时间,超过了这个时间(100毫秒),它们就会被系统强行终止,并且系统还会向你汇报该函数结束的原因是因为超时,这样你就可以发现这些Bug了。
  4. @Ignore:忽略的测试方法,标注的含义就是“某些方法尚未完成,暂不参与此次测试”;这样的话测试结果就会提示你有几个测试被忽略,而不是失败。一旦你完成了相应函数,只需要把@Ignore标注删去,就可以进行正常的测试。
  5. @BeforeClass:针对所有测试,只执行一次,且必须为public static void;
  6. @AfterClass:针对所有测试,将会在所有测试方法执行结束后执行一次,且必须为public static void;
05 hamcrest 和 testSuite 介绍[4]

hamcrest就是专门为增强junit来提供的框架。Junit中,主要使用assert做一些基本的判断。但很多时候使用assert做判断,并不方便,如果要判断某几个值是否为true或false,这时使用hamcrest来判断就会方便许多。

在一个项目中,可能有很多的测试类,如果每个测试类都要点击运行,那么成百上千个类都需要测试,这会是个比较繁重的工作,这时可以使用可以使用junit的jar包中提供的Suite来解决这个问题。

06 综合实例

TestCalcuate类

import static org.junit.Assert.*;
import static org.hamcrest.Matchers.*;

import org.junit.Before;
import org.junit.Test;

public class TestCalcuate {
	Calcuate cal;
	@Before
	public void setUp(){
		cal=new Calcuate();
	}
	@Test
	public void testAdd(){
		int rel=cal.add(22, 33);
		assertEquals("加法存在问题",rel, 55);
	}

	@Test
	public void testMinus(){
		int rel=cal.minus(33, 11);
		assertEquals("减法存在问题",rel,22);
	}
	@Test(expected=ArithmeticException.class)
	public void testDivid(){
		int rel=cal.divide(22, 0);
		assertEquals("除法存在问题",rel,2);
	}
	@Test
	public void testMul(){
		int rel=cal.mul(10, 20);
		assertEquals("乘法存在问题", rel,200);
	}
	@Test(timeout=1000)
	public void testTime(){
		try{
			Thread.sleep(200);
		}catch(Exception e){
			e.printStackTrace();
		}
		int rel=cal.mul(10, 20);
		assertEquals("乘法存在问题", rel,200);
	}

	@Test
	public void testHam(){
		assertThat(50, allOf(greaterThan(49),lessThan(60)));
		assertThat(60, allOf(greaterThan(40),lessThan(90)));
		assertThat("like.txt", endsWith(".txt"));
	}
}

TestA类

import org.junit.*;
public class TestA {
	@Test
	public void testA(){
		System.out.println("testA");
	}
}

TestB类

import org.junit.*;
public class TestB {
	@Test
	public void testB(){
		System.out.println("testB");
	}
}

TestSuite类

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;

@RunWith(Suite.class)
@SuiteClasses({TestA.class,TestB.class,TestCalcuate.class})
public class TestSuite {
	@Test
	public void testSuite(){
		System.out.println("testSuite");
	}
}
07 其它问题

1、测试原则:[4]

  1. 建议创建一个专门的source folder--->test来编写测试类代码。上面例子就新建一个test的资源包。
  2. 测试类的包应该保持和需要测试的类一致。上面的例子中Calcuate类在src/cn/whp/util包中,相应的测试类就在test/cn/whp/util中。
  3. 测试单元中的每个测试方法都必须可以独立执行,不相互依赖,没有顺序。

2、用junit在进行单元测试的时候,使用assertThat方法,发现hamcrest的greaterThan等方法无法识别【说是没有定义】,而且无法静态引用到Matchers类【import static org.hamcrest.Matchers.*;】 [5]

  原因:因为junit默认只会依赖hamcrest-core-1.3包,而实际上hamcrest还有一个hamcrest-library.jar用来放置很多工具

参考文献

[1] 百度百科 Junit

[2] 悔海 http://huihai.iteye.com/blog/1986568

[3] 小倩的博客 http://blog.sina.com.cn/s/blog_8354dda80101ee8v.html

[4] 悔海 http://huihai.iteye.com/blog/1994270

[5] http://www.fwqtg.net/junit-使用hamcrest的matcher找不到的问题(比如greaterthan).html

时间: 2024-10-04 20:41:40

【Java 语言生态篇】Junit 测试单元的相关文章

使用java语言通过appium工具测试ios应用一些问题总结

问题一 1.3.7版本好像有一个bug,就是需要替换这个文件(下载地址:http://download.csdn.net/detail/u011496891/8677069)进入到apium的安装目录下 修改 node_modules/appium/node_modules/node-idevice文件,否则就出现下面这个错误了.这个bug不知道什么时候修复.. org.openqa.selenium.SessionNotCreatedException: A new session could

Java语言进阶篇基本概念

一.Object类.常用API 1.Object类 此类事Java语言中的根类,即所有类的父类.如果一个类没有指定父类,那么默认则继承自Object类. 2.日期时间类 (1)Date类(特定的瞬间).format类(日期/时间格式化子类的抽象类) //创建日期对象 Date date = new Date(); //创建日期格式化对象,指定输出格式,注意:y年M月d日H时m分s秒 DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss

.嵌入式jetty启动spring(java配置方式),junit测试用.标准spring 配置(java config) 嵌入式jetty9启动

package com.doctor.embeddedjetty; import java.util.concurrent.TimeUnit; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; import org.springframework.web.con

Java Junit测试框架

Java    Junit测试框架 1.相关概念 ? JUnit:是一个开发源代码的Java测试框架,用于编写和运行可重复的测试.它是用于单元测试框架体系xUnit的一个实例(用于java语言).主要用于白盒测试,回归测试. ? 白盒测试:把测试对象看作一个打开的盒子,程序内部的逻辑结构和其他信息对测试人 员是公开的. ? 回归测试:软件或环境的修复或更正后的再测试,自动测试工具对这类测试尤其有用. ? 单元测试:最小粒度的测试,以测试某个功能或代码块.一般由程序员来做,因为它需要知道内部程序设

Java进阶 五 Junit测试

我们在编写大型程序的时候,需要写成千上万个方法或函数,这些函数的功能可能很强大,但我们在程序中只用到该函数的一小部分功能,并且经过调试可以确定,这一小部分功能是正确的.但是,我们同时应该确保每一个函数都完全正确,因为如果我们今后如果对程序进行扩展,用到了某个函数的其他功能,而这个功能有bug的话,那绝对是一件非常郁闷的事情.所以说,每编写完一个函数之后,都应该对这个函数的方方面面进行测试,这样的测试我们称之为单元测试.传统的编程方式,进行单元测试是一件很麻烦的事情,你要重新写另外一个程序,在该程

junit测试时,出现java.lang.IllegalStateException: Failed to load ApplicationContext

课程设计要求进行junit测试,我是在已经做好的ssh项目上做的测试,测试类代码如下 package com.zhang.web.services; import static org.junit.Assert.*; import org.junit.After; import org.junit.Before; import org.junit.Test; import javax.annotation.Resource; import org.junit.runner.RunWith; im

java--学习java从这里开始:Java语言基础(1)《基础知识篇》--黑马程序员

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- Java语言基础(1) 从这篇日记开始说一些关于java的语言基础知识, 1  Java语言概述 java的创始人——詹姆斯·高斯林(James Gosling) 1977年获得了加拿大卡尔加里大学计算机科学学士学位,1983年获得了美国卡内基梅隆大学计算机科学博士学位,毕业后到IBM工作,设计IBM第7一代工作站NeWS系统,但不受重视.后来转至Sun公司,1990年,与Patrick,Na

java web进阶篇(三) 表达式语言

表达式语言(Expression Language ,EL)是jsp2.0中新增的功能.可以避免出现许多的Scriptlet代码 格式: ${ 属性名称 },  使用表达式语言可以方便的访问对象中的属性,提交的参数或者进行各种数学运算,而且使用表达式语言最大的特点是如果输出的内容是null,则会自动使用空字符串("")表示. <%request.setAttribute("name", "info");%> <h1>${n

Junit测试出现异常:Exception in thread &quot;main&quot; java.lang.NoSuchMethodError: org.junit.platform.commons.util.

在进行单元测试时,测试出现异常 Exception in thread "main" java.lang.NoSuchMethodError: org.junit.platform.commons.util.ReflectionUtils.getDefaultClassLoader()Ljava/lang/ClassLoader; 错误就在pom.xml的依赖中,仔细查看控制台输出你会发现IntelliJ IDEA正在尝试使用JUnit5运行我的测试用例. at com.intelli