JUnit官网
1.背景:
JUnit单元测试框架是基于Java语言的主流单元测试框架,多数的Java IDE软件都已经集成了Junit单元测试框架。JUnit是由Erich Damma和Kent Beck编写的一个回归测试框架,目前主流的版本是JUnit4以上版本。
2.使用技巧
Eclipse中使用:编译器的JUnit的控制面板中,Runs:表示测试方法的总数,Errors:表示抛出异常的方法的计数器,Failures:表示测试方法失败的计数器;测试方法出现绿色的打钩表示测试方法通过。
测试方法必须用@Test修饰,而且使用public void进行修饰,不能带任何修饰方法:
assertEquals(期望值,实际值)
测试失败的两种情况
1.Failure一般表示由单元的测试使用的断言方法判断失败所引起的,即测试点出现了问题,这就是说输出的结果和我们的预期结果不一样
2.error是由代码异常引起的,它可以产生于测试代码本身的错误,也就是可能是代码本身隐藏的一个bug(测试用例不是用来你是对的,而是用来证明你没有错!)
3.JUnit的运行流程
@BeforeClass:修饰的方法会在所有方法被调用前执行,而且该方法是静态的,所以当测试类加载后接着就会运行它,而且在内存中只会存在一份实例,它比较适合加载一些配置文件;
@AfterClass:static修饰所修饰的方法通常会用来对资源的清理,比如用来关闭数据库;
@Before和@After会在每一个测试方法前后各执行一次。
JUnit的常用注解
注解名称 | 注解含义 |
---|---|
@Test | 将一个普通的方法修饰成一个测试方法 |
@BeforeClass | 修饰的方法会在所有方法被调用前执行,而且该方法是静态的,所以当测试类加载后接着就会运行它,而且在内存中只会存在一份实例,它比较适合加载一些配置文件,此注解对应的方法只能执行一次 |
@AfterClass | static修饰所修饰的方法通常会用来对资源的清理,比如用来关闭数据库 ;此注解对应的方法也是只能执行一次 |
@Before | 会在每一个测试方法前执行一次 |
@After | 会在每一个测试方法hou执行一次 |
@Test(expected = xxx.class) | 将一个普通的方法修饰成一个测试方法 |
@Test(timeout = 毫秒) | 可以避免死循环或者测试性能 |
@Ignore(“…..”) | 所修饰的测试方法会被忽略 |
@RunWith | 可以更改测试运行器 |
@FixMethodOrder(MethodSorters.JVM) | 控制测试方法之间的顺序:按照JVM得到的方法顺序(代码中方法的定义顺序)执行,但是JVM不好控制,不建议使用 |
@FixMethodOrder(MethodSorters.NAME_ASCENDING) | 控制测试方法之间的顺序:按照方法名的顺序执行 |
示例代码
1测试demo
1.1:新建一个计算类
package com.dong.test;
public class Calculate {
public int add(int a,int b){
return a+b;
}
}
1.2:新建一个对应上面计算类的测试类
package com.dong.test;
import static org.junit.Assert.*;
import org.junit.Test;
public class CalculateTest {
/*语法要求:
*1.测试方法上必须使用@Test
*2.测试方法用public void 修饰,而且不带参数
*
*规范:
*1.新建一个源代码目录来保存测试代码
*2.测试单元中的每个方法必须可以独立测试,测试方法之间不能有任何的依赖
*3.测试类使用Test作为测试类的后缀
*4.测试方法使用test作为方法名的前缀
*/
@Test
public void testCalculate() {
Calculate calculate = new Calculate();
int actual = calculate.add(1, 2);
assertEquals(3, actual);//assertEquals("期望值", "实际值");
}
}
2.JUnit中的运行流程
package com.dong.test;
import static org.junit.Assert.*;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
/**
* 测试单元的执行顺序
* @author msi
*
*/
public class JUnitFlowTest {
@BeforeClass//修饰的方法会在所有方法被调用前执行,此注解对应的方法只能执行一次
public static void setUpBeforeClass() throws Exception {
System.out.println("@BeforeClass");
}
@AfterClass//修饰的方法会在所有方法被调用后执行,此注解对应的方法只能执行一次
public static void tearDownAfterClass() throws Exception {
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");
}
}
运行结果:
@BeforeClass
@Before
test1
@After
@Before
test2
@After
@AfterClass
控制测试方法顺序
@FixMethodOrder(MethodSorters.JVM):按照JVM得到的方法顺序(代码中方法的定义顺序)执行,但是JVM不好控制,不建议使用
@FixMethodOrder(MethodSorters.NAME_ASCENDING):按照方法名的顺序执行
package com.dong.test;
import static org.junit.Assert.*;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runners.MethodSorters;
/**
* @FixMethodOrder(MethodSorters.NAME_ASCENDING):按照方法名的顺序执行
* @author msi
*
*/
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class JUnitFlowTest {
@Test
public void testB() {
System.out.println("testB");
}
@Test
public void testA() {
System.out.println("testA");
}
@Test
public void testD() {
System.out.println("testD");
}
}
testA
testB
testD
补充:测试的思想:测试回环,也就是在测试单元中往数据库中添加了什么数据,后面应该删除该数据。