idea创建测试单元步骤
目录顺序 Junit4的使用
测试分类:
- 黑盒测试(看不到代码不关心具体实现逻辑,只看见input和output,看程序输出结果的值)
- 白盒测试(不同的是,看到代码考量算法性能,看到具体的流程)junit就是白盒
下载jar
在github上,把以下两个jar包都下载下来。下载地址:点击打开链接
下载junit-4.12.jar,junit-4.12-javadoc.jar(文档),junit-4.12-sources.jar(源码)。
第一个在这里下载
下载hamcrest-core-1.3.jar,hamcrest-core-1.3-javadoc.jar(文档),hamcrest-core-1.3-sources.jar(源码)。
第二个这里下载
上面不推荐用下面的
这样手工并不快速我们可以通过maven的方法自动导入更快
- 在pom.xml中添加下面代码,然后点击自动导入
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
</dependencies>
- 把这个test文件夹要设置成测试文件的根目录,右键选中 Mark Directory As - Test Sources Root
- 然后出现了一个黄色灯泡,create new
假设写两个类
public class Math {
public int facional(int n) throws Exception {
if( n < 0 ) {
throw new Exception("负数没有阶乘");
}else if(n <= 1){
return 1;
}else {
return n*facional(n-1);
}
}
}
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.jupiter.api.Assertions.*;
class MathTest {
@Test
public void facional() throws Exception{
assertEquals(120,new Math().facional(5));
}
}
运行: run MathTest 。右下方一条绿色条说明测试通过,如果把120改成别的数字那么就会测试不通过显色红色条。JUnit4有一句话叫:“keeps the bar green to keep the code clean”。
解释一下MathTest,就六个地方要讲:
第一,导入了org.junit.Test;和org.junit.Assert.*;这两个包,注意后者是静态导入import static。
第二,testFactorial是在要测试的方法名Factorial前加个test(这也是个好习惯)。
第三,所有测试方法返回类型必须为void且无参数。
第四,一个测试方法之所以是个测试方法是因为@Test这个注解。
第五,assertEquals的作用是判断两个参数是否相等,例子中120是预期结果,new Math().factorial(5)是实际结果。但是通常不应该只比较一个值,要测试多几个特殊值,特别是临界值
执行顺序
几个常用的注解:
- @Test:把方法标记为测试方法
- @Before:每一个测试方法执行前自动调用一次,用于资源申请
- @After:每一个测试方法执行完自动调用一次,资源释放方法
- @BeforeClass:所有测试方法执行前执行一次,在测试类还没有实例化就已经被加载,所以用static修饰
- AfterClass:所有测试方法执行完执行一次,在测试类还没有实例化就已经被加载,所以用static修饰
- @Ignore:暂不执行该测试方法
代码样列
package com.xuhongchuan.util;
import org.junit.*;
import static org.junit.Assert.*;
/**
* Created by xuhongchuan on 2015/7/18.
*/
public class AnnotationTest {
public AnnotationTest() {
System.out.println("构造方法");
}
@BeforeClass
public static void setUpBeforeClass() {
System.out.println("BeforeClass");
}
@AfterClass
public static void tearDownAfterClass() {
System.out.println("AfterClass");
}
@Before
public void setUp() {
System.out.println("Before");
}
@After
public void tearDown() {
System.out.println("After");
}
@Test
public void test1() {
System.out.println("test1");
}
@Test
public void test2() {
System.out.println("test2");
}
@Ignore
public void test3() {
System.out.println("test3");
}
}
实验结果:
构造方法
Before
test1
After
构造方法
Before
test2
After
AfterClass
@BeforeClass和@AfterClass在类被实例化前(构造方法执行前)就被调用了,而且只执行一次,通常用来初始化和关闭资源。@Before和@After和在每个@Test执行前后都会被执行一次。@Test标记一个方法为测试方法没什么好说的,被@Ignore标记的测试方法不会被执行,例如这个模块还没完成或者现在想测试别的不想测试这一块。
以上有一个问题,构造方法居然被执行了两次。所以我这里要说明一下,JUnit4为了保证每个测试方法都是单元测试,是独立的互不影响。所以每个测试方法执行前都会重新实例化测试类。
步骤:
- 定义一个测试类
- 定义测试方法:可以独立运行,建议返回值void,参数列表空参
- 给方法加注解@Test,出现错误
- 导入junit的依赖,解决问题
- 断言找bug
- 判定结果红色失败,绿色成功