Junit是一个单元测试工具,eclipse自带。
依赖:
// http://mvnrepository.com/artifact/junit/junit
compile group: 'junit', name: 'junit', version: '4.12'
1.使用步骤
1.先写源文件,假设要测验的是A.java.
2.在packageExplorer视图中,右击A.java源文件,选择 new| JUnit Test Case
图1 测试类自动生成
3.单击next出现下面的对话框。
图2 选择测试的方法
4.自动生成一个源文件,按照需求完善其中的代码,见图1 的 ATest.java
5.右击ATest.java,选择 run as|JUnit Test。
图3 测试结果图示
2.常用注解
@
BeforeClass:针对所有测试,只执行一次,且必须为
static void
@ Before:初始化方法,对于每一个测试方法都要执行一次
@ Test:测试方法,在这里可以测试期望异常和超时时间
@ After:释放资源,对于每一个测试方法都要执行一次
@ AfterClass:针对所有测试,只执行一次,且必须为static void
所以,一个JUnit4的单元测试用例执行顺序为:
@BeforeClass -> @Before -> @Test -> @After -> @AfterClass;
每一个测试方法的调用顺序为:
@Before -> @Test -> @After;
@ Before:初始化方法,对于每一个测试方法都要执行一次
@ Test:测试方法,在这里可以测试期望异常和超时时间
@ After:释放资源,对于每一个测试方法都要执行一次
@ AfterClass:针对所有测试,只执行一次,且必须为static void
所以,一个JUnit4的单元测试用例执行顺序为:
@BeforeClass -> @Before -> @Test -> @After -> @AfterClass;
每一个测试方法的调用顺序为:
@Before -> @Test -> @After;
所有加注解的方法必须为
public。
3.常用方法
void org.junit.Assert.
assertEquals(Object expected, Object actual)
拿预期的与实际的进行对比。若不一致还会打印出哪里不一致。
拿预期的与实际的进行对比。若不一致还会打印出哪里不一致。
#以两个queue进行assertEquals(),失败时打印结果见下。
java.lang.AssertionError: expected:
<[URLinfo1, __ct__URLinfo, __ct__URL_NotBot, __ct__URL_NotBot_vacation, __ct__URL_NotBot_vacation_5m_sum_perip, __ct__URL_NotBot_vacation_ajax_url_5m_sum_perip, alarm]>
but was:
<[URLinfo, __ct__URLinfo, __ct__URL_NotBot, __ct__URL_NotBot_vacation, __ct__URL_NotBot_vacation_5m_sum_perip, __ct__URL_NotBot_vacation_ajax_url_5m_sum_perip, alarm]>
at org.junit.Assert.fail(Assert.java:91)
at org.junit.Assert.failNotEquals(Assert.java:645)
at org.junit.Assert.assertEquals(Assert.java:126)
at org.junit.Assert.assertEquals(Assert.java:145)
at test.com.ctrip.search.antibot.count.util.UtilsTest.testTopoSort(UtilsTest.java:77)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
void org.junit.Assert. assertTrue(boolean condition)
期望结果为true。
void org.junit.Assert. assertFalse(boolean condition)
期望结果为false。
问:集合类如何比较?
答:List,Set,Queue,Map这些集合类的抽象类都重写了equals()方法,所以可以直接比较,容器中的元素仍为容器时仍可比较。若放的是自己的类,这些类也需要重写equals()方法。
答:List,Set,Queue,Map这些集合类的抽象类都重写了equals()方法,所以可以直接比较,容器中的元素仍为容器时仍可比较。若放的是自己的类,这些类也需要重写equals()方法。
4.参数化测试
对于一个函数,我们准备了很多测试用例,如何批量测试呢?Junit的参数化测试可以满足。
@org.junit.runner.
RunWith
在运行测试的时候会调用指定的类,通常用于@RunWith(Parameterized.class)。
此注解需要加在自己的类前面。
org.junit.runners. Parameterized
用于参数化测试的类。
@org.junit.runners.Parameterized. Parameters
此注解加在产生测试数据的方法上面。函数名无限制。返回值需要是Iterable<Object[]>,里面盛放的是参数1,参数2,...,参数n,预期结果。
在运行测试的时候会调用指定的类,通常用于@RunWith(Parameterized.class)。
此注解需要加在自己的类前面。
org.junit.runners. Parameterized
用于参数化测试的类。
@org.junit.runners.Parameterized. Parameters
此注解加在产生测试数据的方法上面。函数名无限制。返回值需要是Iterable<Object[]>,里面盛放的是参数1,参数2,...,参数n,预期结果。
例子:
import static org.junit.Assert.*;
import java.util.Arrays;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized.Parameters;
import org.junit.Test;
import org.junit.runners.Parameterized;
@RunWith(Parameterized.class)
public class StringDistanceTest {
//测试中用到的参数
private String param1;
private String param2;
private int result;
//对应的构造函数
public StringDistanceTest(String param1, String param2, int result) {
this.param1 = param1;
this.param2 = param2;
this.result = result;
}
@Parameters
public static Iterable
data223(){
return Arrays.asList(new Object[][]{
{"kitten", "sitting",3},
{"g", "sitting",6},
{"a","b",1},
{"abcd","dcba",14}
});
}
@Test
public void Test(){
//字符串的编辑距离
assertEquals(result, StringDistance.getStringDistance(param1, param2));
}
}
对应的图见图4-1.
图4-1 Junit参数化测试
5.多线程测试
Junit本身是不支持普通的多线程测试的,这是因为Junit的底层实现上,是用System.exit()退出用例执行的。JVM都终止了,在测试线程启动的其他线程自然也无法执行。
“GroboUtils”这个工具可以用于多线程测试,但mvn仓库中似乎没有,先mark一下。