## JUnit特点
* 使用断言(Assertion)测试期望结果
* 可以方便的组织和运行测试
* 可以方便的查看测试结果
* 常用的开发工具IDEA, Eclipse都集成了JUnit
* 可以方便的集成到maven项目中
## maven依赖
```
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.x</version>
</dependency>
```
## 项目中的目录结构
项目目录必须是如下,测试类规定标准是在test目录中进行测试
```
├── src
│ ├── main
│ │ └── java
│ │ └── resources
│ └── test
│ │ └── java
│ │ └── resources
```
## 注解介绍
* @BeforeClass 全局只会执行一次,而且是第一个运行,用来初始化非常耗时的资源, 例如创建数据库
* @Before 在测试方法运行之前运行,初始化测试资源
* @Test 测试方法
* @Test(excepted=xx.class): xx.class表示异常类,表示测试的方法抛出此异常时,认为是正常的测试通过的
* @Test(timeout=毫秒数) :测试方法执行时间是否符合预期
* @After 在测试方法运行之后允许,释放测试资源
* @AfterClass 全局只会执行一次,而且是最后一个运行,清理@BeforeClass创建的资源, 例如创建数据库
* @Ignore 忽略此方法
* @RunWith:可以更改默认测试运行器org.junit.runner.Runner,JUnit使用Runner运行测试代码,在JUnit中有很多个 Runner,如果你没有指定,那么系统自动使用默认 Runner来运行你的代码。
## 测试类方法的执行顺序
```
BeforeClass()
测试类构造方法()
Before()
testA()
After()
Before()
testB()
After()
AfterClass()
```
## 断言介绍
断言的使用, 必须先引入必须的包,IDE创建的会自动引入
```
import static org.junit.Assert.*;
```
assertEquals(100, x): 断言相等
assertArrayEquals({1, 2, 3}, x): 断言数组相等
assertNull(x): 断言为null
assertTrue(x > 0): 断言为true
assertFalse(x < 0): 断言为false;
assertNotEquals: 断言不相等
assertNotNull: 断言不为null
## 参数化测试
* 可能会遇到这种测试,同样的逻辑方法,输入不同的参数,期望得到不同的结果,在以前需要写多个测试方法,JUnit4提供了参数化测试,需要在类上面指定如下的运行器:@RunWith (Parameterized.class)
* 在提供数据的方法上加上一个@Parameters注解,这个方法必须是静态static的,并且返回一个集合Collection,该方法没有参数。
* 为测试类声明几个变量,分别用于存放期望值和测试所用数据。
* 为测试类声明一个带有参数的公共构造函数,并在其中为上个环节中声明的几个变量赋值。
```
package org.test;
import java.util.Arrays;
import java.util.Collection;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
/**
* 参数化测试的类必须有Parameterized测试运行器修饰
*
*/
@RunWith(Parameterized.class)
public class AddTest {
private int input1;
private int input2;
private int expected;
/**
* 准备数据,数据的准备需要在一个方法中进行,该方法需要满足一定的要求:
1)该方法必须由Parameters注解修饰
2)该方法必须为public static的
3)该方法必须返回Collection类型
4)该方法的名字不做要求
5)该方法没有参数
*/
@Parameters
@SuppressWarnings("unchecked")
public static Collection prepareData(){
Object [][] object = {{-1,-2,-3},{0,2,2},{-1,1,0},{1,2,3}};
return Arrays.asList(object);
}
public AddTest(int input1,int input2,int expected){
this.input1 = input1;
this.input2 = input2;
this.expected = expected;
}
@Test
public void testAdd(){
Add add = new Add();
int result = add.add(input1, input2);
Assert.assertEquals(expected,result);
}
}
```