Java Junit测试例子

本文详细介绍JUnit4.x单元测试框架的重要性和基本用法,包括如何编写测试案例、使用常见注解、设置测试运行器及测试套件等。通过具体示例展示了如何实现参数化测试以提高代码复用度。
Calutor.java
package com.sc.zy;

public class Calutor {

	public int add(int num1,int num2){
		return num1+num2;
	}
	
	public int sub(int num1,int num2){
		return num1-num2;
	}
	
	public int mul(int num1,int num2){
		return num1*num2;
	}
	
	public int div(int num1,int num2){
		if(num2==0){
			throw new MyException();
		}
		
		return num1/num2;
	}
}

MyException.java

package com.sc.zy;

public class MyException extends RuntimeException {

}

CalutorTest.java


package com.sc.zy;

import junit.framework.Assert;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;


public class CalutorTest {
	
	private Calutor c;

	@BeforeClass
	public static void setUpBeforeClass(){
		System.out.println("=====static init=======");
	}
	
	@AfterClass
	public static void tearDownAfterClass(){
		System.out.println("=====static destory=======");
	}
	
	@Before
	public void setUp(){
		System.out.println("=======@before=======");
		c=new Calutor();
	}
	
	@After
	public void tearDown(){
		System.out.println("=======@after=======");
	}
	
	@Test
	public void testAdd(){
		int sum=c.add(1, 2);
		Assert.assertEquals(3, sum);
	}
	@Test(expected=com.sc.zy.MyException.class)
	public void testDiv(){
		c.div(1, 0);
	}
	
	@Ignore
	public void testDiv1(){
		int d=c.div(1, 5);
		Assert.assertEquals(0, d);
	}
}


Junit4.x单元测试

l单元测试的重要性
lJunit是什么?
l如何书写Junit4测试例子?
lJunit4中常见注解
l测试运行器,测试套件
l参数化测试


单元测试能带来:

l高的代码质量
l少的Debug时间
l自动化快速测试
l更多

什么是JUnit?

lJava设计的单元测试框架
l方便开发者编写单元测试并运行
l是第一个单元测试框架

l首先写一个功能类Calculator.java
l编写测试类,一般测试类我们习惯如图放置,测试类的名字一般是原类名+Test组成,如图:





l@Before:Junit在每个测试方法执行之前都要执行@Before注解的方法,完成初始化测试环境。方法名一般叫:setUp();
l@After:Junit在每个测试方法执行之后都要执行@After注解的方法,完成清理测试环境。方法名一般叫:tearDown();

   注:上述方法必须是public  void 方法名(),方法名随意。


l@BeforeClass:针对所有测试,只执行一次,且必须为static void。方法名一般叫:setUpBeforeClass
l@AfterClass针对所有测试,只执行一次,且必须为static void方法名一般叫:tearDownAfterClass

  注:上述方法必须是publicstatic void 方法     名()

l@Test:测试方法,在这里可以测试期望异常和超时时间。
l@Ignore:忽略的测试方法
lJUnit4 的单元测试用例执行顺序为:
@BeforeClass –> @Before –> @Test –>@After –> @AfterClass
一个测试方法的调用顺序为:
@Before –> @Test –> @After


又一个新概念出现了——测试运行器JUnit中所有的测试方法都是由它负责执行的。JUnit为单元测试提供了默认的测试运行器,但 JUnit并没有限制您必须使用默认的运行器。相反,您不仅可以定制自己的运行器(所有的运行器都继承自org.junit.runner.Runner),而且还可以为每一个测试类指定使用某个具体的运行器。指定方法也很简单,使用注解org.junit.runner.RunWith


如果测试类没有显式的声明使用哪一个测试运行器,JUnit会启动默认的测试运行器执行测试类(比如上面提及的单元测试代码)。一般情况下,默认测试运行器可以应对绝大多数的单元测试要求;当使用JUnit提供的一些高级特性(例如即将介绍的两个特性)或者针对特殊需求定制 JUnit测试方式时,显式的声明测试运行器就必不可少了。

l在实际项目中,随着项目进度的开展,单元测试类会越来越多,可是直到现在我们还只会一个一个的单独运行测试类,这在实际项目实践中肯定是不可行的。为了解决这个问题,JUnit提供了一种批量运行测试类的方法,叫做测试套件。这样,每次需要验证系统功能正确性时,只执行一个或几个测试套件便可以了。测试套件的写法非常简单,您只需要遵循以下规则:



l创建一个空类作为测试套件的入口。
l使用注解org.junit.runner.RunWithorg.junit.runners.Suite.SuiteClasses修饰这个空类。
lorg.junit.runners.Suite作为参数传入注解RunWith,以提示JUnit为此类使用套件运行器执行。
l将需要放入此测试套件的测试类组成数组作为注解SuiteClasses的参数。
l保证这个空类使用public 修饰,而且存在公开的不带有任何参数的构造函数。

l我们把测试类TestWordDealUtil放入了测试套件RunAllUtilTestsSuite中,在Eclipse 中运行测试套件,可以看到测试类TestWordDealUtil被调用执行了。测试套件中不仅可以包含基本的测试类,而且可以包含其它的测试套件,这样可以很方便的分层管理不同模块的单元测试代码。但是,您一定要保证测试套件之间没有循环包含关系,否则无尽的循环就会出现在您的面前……

l为了保证单元测试的严谨性,我们模拟了不同类型的字符串来测试方法的处理能力,为此我们编写大量的单元测试方法。可是这些测试方法都是大同小异:代码结构都是相同的,不同的仅仅是测试数据和期望值。有没有更好的方法将测试方法中相同的代码结构提取出来,提高代码的重用度,减少复制粘贴代码的烦恼?在以前的JUnit版本上,并没有好的解决方法,而现在您可以使用 JUnit提供的参数化测试方式应对这个问题。

l测试类必须由Parameterized测试运行期修饰
l准备数据。数据的准备需要在一个方法中进行,该方法需要满足以下条件:
1.该方法必须由Parameters注解修饰
2.该方法必须是public  static
3.该方法必须返回Collection类型
4.该方法名字不要求,必须是无参的

l写一个类Parameterized测试运行期修饰
l编写数据准备方法
l编写类的有参构造方法,该方法与数据准备方法中数组数据的顺序一致。

   return Arrays.asList(newObject[][]{

        {3,1,2},{5,2,3},{8,1,7},{11,9,1}});

l编写测试方法
l例子见备注


package com.anbo.dao;

import java.util.Arrays;
import java.util.Collection;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

import static org.junit.Assert.assertEquals;;

@RunWith(Parameterized.class)
public class CalculatorTest {
	private int expected;
	private int a;
	private int b;
	
	public CalculatorTest(int expected,int input1,int input2){
		this.expected=expected;
		this.a=input1;
		this.b=input2;
	}
	@Parameters
	public static Collection dataCo(){
		return Arrays.asList(new Object[][]{
				{3,1,2},{5,2,3},{8,1,7},{11,9,1}
		});
	}
	@Test
	public void testAdd(){
		assertEquals(expected,a,b);
	}
}




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值