Junit
导入jar文件:
junit-4.12.jar
//junit-4.11之后需要自己导入该包
hamcrest-core-1.3.jar
一、简介
JUnit是一个Java编程语言编写的单元测试框架。是xUnit测试框架家族中最为成功的一个。JUnit是用于编写和运行可重复的自动化测试的开源测试框架, 这样可以保证我们的代码按预期工作。
JUnit为我们提供了如下功能:
- 断言测试预期结果。
- 测试功能共享通用的测试数据。
- 测试套件轻松地组织和运行测试。
- 图形和文本测试运行。
JUnit可以用于测试如下程序单元:
- 整个对象
- 对象的方法,或几个交互的方法
- 几个对象之间的互动(交互)
二、Junit注解
JUnit4通过注解的方式来识别测试方法。目前支持的主要注解有:
- @BeforeClass 全局只会执行一次,而且是第一个运行
- @Before 在测试方法运行之前运行
- @Test 测试方法
- @After 在测试方法运行之后允许
- @AfterClass 全局只会执行一次,而且是最后一个运行
- @Ignore 忽略此方法
先上一个栗子,测试一下上边的注解:
被测试类:Calculator
package main.java.StuJunit;
public class Calculator {
public int addtion(int a,int b){
return a+b;
}
public int subtraction(int a,int b){
return a-b;
}
public int multiplication(int a,int b){
return a*b;
}
public double division(double a,double b){
return a/b;
}
}
单元测试类:
package test.java.TestJunit;
import main.java.StuJunit.Calculator;
import org.junit.*;
public class Test_Test {
Calculator calculator = new Calculator();
@BeforeClass
public static void testBeforeClass(){
System.out.println("BeforeClass...");
}
@Before
public void test1Before(){
System.out.println("test1Before...");
}
@Test
public void test1(){
System.out.println(calculator.addtion(2,4));
}
@Ignore
@Test
public void test2(){
System.out.println(calculator.multiplication(3,3));
}
@After
public void test1After(){
System.out.println("test1After...");
}
@AfterClass
public static void testAfterClass(){
System.out.println("AfterClass...");
}
}
这里有个点需要注意:BeforeClass 和 AfterClass 在类运行时全局只执行一次,所以修饰的方法应该为静态方法,否则会出现如下异常:
异常:
java.lang.Exception: Method testBeforeClass() should be static
被@Ignore标注的测试方法,将不会被执行,但是会在控制台打印出 “Test ignored.”信息,我们还可以给@Ignore传递参数,定制忽略信息,如下:
@Ignore("test2 被忽略了...")
三、断言Assert
Junit测试框架中Assert类就是实现断言的工具,主要作用如下:
- 单元测试用于判断某个特定条件下某个方法的行为;
- 执行单元测试为了证明某段代码的执行结果和期望的一致;
下面介绍Junit测试库中几种常用的断言。
断言 | 描述 |
void assertEquals([String message], expected value, actual value) | 断言两个值相等。值可能是类型有 int, short, long, byte, char or java.lang.Object. 第一个参数是一个可选的字符串消息 |
void assertTrue([String message], boolean condition) | 断言一个条件为真 |
void assertFalse([String message],boolean condition) | 断言一个条件为假 |
void assertNotNull([String message], java.lang.Object object) | 断言一个对象不为空(null) |
void assertNull([String message], java.lang.Object object) | 断言一个对象为空(null) |
void assertSame([String message], java.lang.Object expected, java.lang.Object actual) | 断言两个对象引用相同的对象 |
void assertNotSame([String message], java.lang.Object unexpected, java.lang.Object actual) | 断言,两个对象不是引用同一个对象 |
void assertArrayEquals([String message], expectedArray, resultArray) | 断言预期数组和结果数组相等。数组的类型可能是 int, long, short, char, byte or java.lang.Object. |
断言的简单使用示例:
使用某个断言时,需要我们静态导入该断言,断言都在org.junit.Assert类中。如下:
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertSame;
使用:
package test.java.TestJunit;
import org.junit.Test;
import static org.junit.Assert.*;
public class Test_Assert {
@Test
public void stuAssert(){
String str1 = "testStr";
String str2 = new String("testStr");
String str3 = str1;
String str4 = null;
//断言两个对象不相等
assertNotSame("str1和str2不相等",str1,str2);
//断言两个对象相等
assertSame(str1,str3);
//断言两个对象的值相等
assertEquals(str1,str2);
//断言一个对象不为空
assertNotNull(str2);
//断言一个对象为空
assertNull(str4);
//断言一个条件为true
assertTrue(str1.length()>3);
//断言一个条件为false
assertFalse(str1==str2);
//断言两个数组的值相等
int[] a = new int[]{1,2,3,4};
int[] b = new int[]{1,2,3,4};
//assertSame(a,b);对象不相等
assertArrayEquals(a,b);
}
}