JUnit是一个Java语言的单元测试框架,由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework)。Junit是一套框架,继承TestCase类,就可以用Junit进行自动测试了。



Junit的特性:


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


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


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


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



这里我们简单介绍下Junit的环境配置,使用方法,具体深入的,请私下自己深入学习。



1、环境配置


1)在Eclipse中选中工程,右键“Properties”或是在菜单Project---Properties,打开项目配置的窗口,选择到Java Build Path。


2)右边的标签选择“Libraries”,点击“Add External JARS”按钮,然后选择Junit的jar包,点击“打开”按钮即将Junit使用的jar包添加到项目配置中;具体截图如下:




testng是基于junit的么_System



配置完毕后项目截图如下:


testng是基于junit的么_Test_02

testng是基于junit的么_testng是基于junit的么_03




2、简单的使用


下面是一个java源代码文件,我们要做的就是针对它使用Junit完成单元测试:


package mytest1;

public class Cal {
	private static int result;
	
	public void add(int n){
		result = result + n;
	}
	
	public void substract(int n){
		//bug:正确的应该是result=result-n;
		result = result -1;
	}
	
	public void multiply(int n){
		//方法没有写好,空方法
	}
	
	public void divide(int n) {
        result = result / n;
    }
	
	public void square(int n){
		result = n * n;
	}
	
	public void squareRoot(int n){
		//bug,这里是个死循环
		for(;;);
	}
	
	public void clear(){
		result = 0;
	}
	
	public int getResult(){
		return result;
	}
	
	
}


分析过代码后,开始针对该文件中的方法做单元测试。


1)在项目中选中Cal.java,然后右键New--Junit Test Case,新建一个Junit testcase类:


testng是基于junit的么_testng是基于junit的么_04



2)单元测试的类,一般都是XXXXTest.java。修改文件名后,点击“Next”,接着选择需要测试的方法等,具体如下:


testng是基于junit的么_testng是基于junit的么_05


testng是基于junit的么_System_06


3)点击OK后,生成对应的代码,但是这个代码还需要修改和完善才能做到单元测试的功能。完善后的代码如下:


testng是基于junit的么_Test_07


具体的文件如下:


package mytest1;

import static org.junit.Assert.*;

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

public class CalTest {
	private static Cal cal = new Cal();

	@Before
	public void setUp() throws Exception {
		cal.clear();
	}

	@Test
	public void testAdd() {
		cal.add(2);
		cal.add(3);
		assertEquals(5, cal.getResult());
		//fail("Not yet implemented");
	}

	@Test
	public void testSubstract() {
		cal.add(10);
		cal.substract(2);
		assertEquals(8, cal.getResult());
		//fail("Not yet implemented");
	}

	@Ignore("Multiply() not yet implemented")
	@Test
	public void testMultiply() {
		
	}

	@Test
	public void testDivide() {
		cal.add(8);
		cal.divide(2);
		assertEquals(4, cal.getResult());
		//fail("Not yet implemented");
	}
	
	@Test(expected = ArithmeticException.class)
	public void divideByZero(){
		cal.divide(0);
	}

}

4)执行单元测试类:右键Run As----Junit test。执行结果如下:

testng是基于junit的么_testng是基于junit的么_08


5)从执行结果中可以看到哪些测试成功,哪些测试失败。测试失败的,在Failure Trace窗口中可以看到测试失败的原因

testng是基于junit的么_testng是基于junit的么_09



3、Junit测试类中注解的含义和执行顺序


通过上面代码编写,可以看到Junit测试类中方法前面会有@Test,@Before等字符。这个是Java编程中的注解。


Junit中注解的含义如下:


@是注解   @Test

表明下面是测试方法

@Test(timeout=200)

表示下面的测试是限时测试,如果超过规定的时间,就测试失败

@Test(expected=IllegalArgumentException.class)

异常测试,验证方法能否抛出预期的错误

@Ignore

注释掉一个测试方法或一个类,被注释的方法或类,不会被执行

@BeforeClass

修饰static的方法,在整个类执行之前执行该方法一次。

@AfterClass

同样修饰static的方法,在整个类执行结束前执行一次。如释放资源

@Before

修饰public void的方法,在每个测试用例(方法)执行时都会执行

@After

修饰public void的方法,在每个测试用例执行结束后执行


接着就是JUnit中方法的执行顺序和生命周期,通过上述表格,大家可以清楚看到执行的顺序,下面简单一个例子,编写后执行就可以看到执行的效果:


package com.hotelrestsys.frame.check_out;

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

public class DayDialogTest {
    @BeforeClass
    public static void beforeclass(){
        System.out.println("beforeclass");
    }

    @AfterClass
    public static void afterclass(){
        System.out.println("afterclass");
    }

    @Before
    public void setUp() throws Exception {
        System.out.println("before");
    }

    @After
    public void tearDown() throws Exception {
        System.out.println("after");
    }

    @Test
    public void test1() {
        System.out.println("test1");
    }

    @Test
    public void test2(){
        System.out.println("test2");
    }

}

运行结果如下:

testng是基于junit的么_testing_10