Junit介绍
Junit 测试框架是最流行的Java单元测试框架。
Junit4特性:
- 简单的注解,提供书写Junit测试的基本特性
- 断言方法(Assert Methods)比较测试的方法执行结果值和期望值
- @Ignore 注解,忽略测试方法或者测试类的执行
- 期望异常测试
- 超时测试 , 测试方法的执行时间
- 测试组件,一起运行一些测试类
- 参数化测试, 以不同的输入参数值测试方法
Eclipse应用Junit
1. 打开Eclipse中的Junit视图窗口:
Window → Show View → Other→Java → JUnit → OK
2、Junit视图窗口特性
- ① Runs: 显示了执行了的junit测试用例(方法)总数
- ② Errors: 显示结果为error/exception的测试用例总数
- ③ Failures:显示测试用例执行失败总数
- ④ Failure Trace:展示 error/exception or failure trace
- ⑤ Show Failures Only:只显示失败的用例信息
- ⑥ Scroll Lock:scroll lock
- ⑦ Rerun Test: 重新运行测试用例
- ⑧ Rerun Test – Failure First:重新运行测试用例,先执行失败了的测试用例
- ⑨ Stop Junit Test Run:停止单元测试
- ⑩ Test Run History:显示测试用例运行历史
Junit使用
使用步骤:创建一个Java项目 → 创建Junit测试类 → 执行Junit测试类
1、创建Java项目
package com.xueji.junit;
public class MathUtil {
public int add(int i, int j) {
return i + j;
}
}
2、
创建Junit测试类
鼠标右键MathUtil.java --> new --> JUnit Test Case --> Next --> 选择相应的测试方法 --> Finish --> 得到测试类
MathUtilTest.java
package com.xueji.junit;
import static org.junit.Assert.*;
import org.junit.Test;
public class MathUtilTest {
@Test
public void testAdd() {
MathUtil mathUtil = new MathUtil();
int actualResult = mathUtil.add(1, 2);
int expectedResult = 3;
assertEquals(expectedResult, actualResult);
}
}
3、运行该测试类
右击MathUtilTest.java --> Run As --> Junit Test
Junit注解
Junit4 注解提供了书写单元测试的基本功能。本章将介绍@BeforeClass, @AfterClass,@Before, @After 和@Test 这几个基本的注解。 @BeforeClass注解
被@BeforeClass注解的方法会是:这样的方法被用作执行计算代价很大的任务,如打开数据库连接。被@BeforeClass 注解的方法应该是静态的(即 static类型的).
- 只被执行一次
- 运行junit测试类时第一个被执行的方法
@AfterClass注解
被@AfterClass注解的方法应是:
该类型的方法被用作执行类似关闭数据库连接的任务。被@AfterClass 注解的方法应该是静态的(即 static类型的).
- 只被执行一次
- 运行junit测试类是最后一个被执行的方法
@Before注解
被@Before 注解的方法应是:该类型的方法可以被用来为测试方法初始化所需的资源。
- junit测试类中的任意一个测试方法执行 前 都会执行此方法
@After注解
被@After注解的方法应是:该类型的方法被用来关闭由@Before注解修饰的测试方法打开的资源。
- junit测试类中的任意一个测试方法执行后 都会执行此方法, 即使被@Test 或 @Before修饰的测试方法抛出异常
@Test 注解
被@Test注解的测试方法包含了真正的测试代码,并且会被Junit应用为要测试的方法。@Test注解有两个可选的参数:
- expected 表示此测试方法执行后应该抛出的异常,(值是异常名)
- timeout 检测测试方法的执行时间
Junit断言方法(Assert methods)
Junit 4 断言方法允许检查测试方法的期望结果值和真实返回值。Junit的org.junit.Assert类提供了各种断言方法来写junit测试。这些方法被用来检查方法的真实结果值和期望值。下列一些有用的断言方法列表:
Method | Description |
---|---|
assertNull(java.lang.Object object) | 检查对象是否为空 |
assertNotNull(java.lang.Object object) | 检查对象是否不为空 |
assertEquals(long expected, long actual) | 检查long类型的值是否相等 |
assertEquals(double expected, double actual, double delta) | 检查指定精度的double值是否相等 |
assertFalse(boolean condition) | 检查条件是否为假 |
assertTrue(boolean condition) | 检查条件是否为真 |
assertSame(java.lang.Object expected, java.lang.Object actual) | 检查两个对象引用是否引用同一对象(即对象是否相等) |
assertNotSame(java.lang.Object unexpected, java.lang.Object actual) | 检查两个对象引用是否不引用统一对象(即对象不等) |
Junit 4参数化测试
Junit 4 参数化测试 允许通过变化范围的参数值来测试方法。参数擦测试可以通过以下简单的步骤实现:- 对测试类添加注解 @RunWith(Parameterized.class)
- 将需要使用变化范围参数值测试的参数定义为私有变量
- 使用上一步骤声明的私有变量作为入参,创建构造函数
- .创建一个使用@Parameters注解的公共静态方法,它将需要测试的各种变量值通过集合的形式返回。
- 使用定义的私有变量定义测试方法
Junit 4 参数化测试样例
EvenNumberChecker.java 校验输入的数字是否为偶数:
public class EvenNumberChecker {
/**
* Is input number even.
*
* @param i input number
* @return <code>true</code> if input is even number; otherwise return false
*/
public boolean isEven(int i) {
if (i % 2 == 0) {
return true;
} else {
return false;
}
}
}
EvenNumberCheckerTest.java
对 EvenNumberChecker.java 进行参数化测试:
import static org.junit.Assert.*;
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;
/**
* @author javatutorials.co.in
*/
// Step 1
@RunWith(Parameterized.class)
public class EvenNumberCheckerTest {
// Step 2: variables to be used in test method of Step 5
private int inputNumber;
private boolean isEven;
// Step 3: parameterized constructor
public EvenNumberCheckerTest(int inputNumber, boolean isEven) {
super();
this.inputNumber = inputNumber;
this.isEven = isEven;
}
// Step 4: data set of variable values
@Parameters
public static Collection<Object[]> data() {
Object[][] data = new Object[][] {
{ 2, true },
{ 5, false },
{ 10, false }
};
return Arrays.asList(data);
}
@Test
public void test() {
System.out.println("inputNumber: " + inputNumber + "; isEven: " + isEven);
EvenNumberChecker evenNumberChecker = new EvenNumberChecker();
// Step 5: use variables in test code
boolean actualResult = evenNumberChecker.isEven(inputNumber);
assertEquals(isEven, actualResult);
}
}
Junit 4测试套件(Test Suite)
Junit 4允许通过使用测试套件类批量运行测试类 . 为一套测试类创建一个测试套件,要为测试类添加以下注解:- @RunWith(Suite.class)
- @SuiteClasses(TestClass1.class, TestClass2.class)
当运行时,所有包含在@SuiteClasses注解内的所有测试类都会被执行。
AllTests.java Test Suite Class
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;
/**
* @author javatutorials.co.in
*/
@RunWith(Suite.class)
@SuiteClasses({ ArithmeticTest.class, GeometryTest.class })
public class AllTests {
}
Junit 4忽略测试(Ignore Test)
Junit 4 忽略测试(Ignore test)被用来禁止执行junit测试类的某些或者全部测试方法。Junit 提供了@Ignore注解来实现 忽略测试。它可以用来跳过失败、或者抛出异常的测试方法。- Junit 4 Ignore Test 应用到某些测试方法上
- Junit 4 Ignore Test 应用到整个测试类上
Junit 4超时测试(Timeout test)
Junit 4超时测试(Timeout test)可以被用来测试方法的执行时间。 Junit 4 超时测试可以被用在:- 在测试类的方法上使用 @Timeout 注解
- 测试类的所有方法应用 Timeout规则
在测试类的方法上使用 @Timeout 注解
Junit 4 提供了 @Timeout 注解来测试任意特定方法的执行时间。如果测试方法的执行时间大于指定的超时参数,测试方法将抛出异常,测试结果为失败。指定的超时参数是以毫秒记.@Timeout 注解样例
TimeoutTest.java test class for timeout test.
import org.junit.Test;
/**
* @author javatutorials.co.in
*/
public class TimeoutTest {
/**
* Example of timeout test.
* Test will fail if it takes more than 200 ms to execute
*/
@Test(timeout = 200)
public void testTimeout() {
while (true);
}
}
测试类的所有方法应用 Timeout规则
Junit 4 提供了 Timeout 规则来测试类中的所有方法。如果类中的任意一个方法执行时间超过了在Timeout 规则中规定的值,测试方法将抛出异常,测试结果为失败。指定的超时参数是以毫秒记。Timeout 规则
TimeoutRuleTest.java 测试Timeout 规则的测试类:
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.Timeout;
/**
* @author javatutorials.co.in
*/
public class TimeoutRuleTest {
/**
* Rule is applied to all methods of class
* time is specified in milliseconds
*/
@Rule
public Timeout timeout = new Timeout(1000);
/**
* Example of timeout test.
* Test will fail if it takes more than 1 sec to execute
*/
@Test
public void testTimeout1() {
while(true);
}
/**
* Example of timeout test.
* Test will fail if it takes more than 1 sec to execute
*/
@Test
public void testTimeout2() {
while(true);
}
}
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
本文出处为 http://blog.youkuaiyun.com/luanlouis,转载请注明出处,谢谢!