前言
单元测试的规划时间应该在接口设计完成后、编码开始前
注解
以下常用注解修饰的方法被按照顺序执行
@BeforeClass
@Before
@Test
@After
@AfterClass
其中@BeforeClass和@AfterClass只会执行一次,并且必须是static void的;而@Before和@After会在每个@Test前后被执行,且必须是public void的
@Test注解可以指定必须抛出的异常(expected属性)、指定超时时间(timeout属性)
断言assert
assertTrue()
assertFalse()
assertEquals():调用equals方法
assertSame():判断地址是否相同
assertNull
参数化测试
测试类使用@RunWith(Parameterized.class)修饰
生成测试数据的方法使用@Paramters修饰,返回类型为Collection<Object[]>
使用@Parameter修饰需要注入的参数(来源是上述集合),可以指定下标
@RunWith(Parameterized.class)
public class CalculatorTest {
@Parameters
public static Collection<Object[]> data() {
return Arrays.asList(new Object[][]{
{1, 2, 3}, {4, 5, 9}, {9, 10, 19}, {112, 234, 346}
});
}
@Parameter(0)
public double a;
@Parameter(1)
public double b;
@Parameter(2)
public double expected;
@BeforeClass
public static void beforeClass() {
System.out.println("Before Class");
}
@Before
public void setUp() throws Exception {
System.out.println("Before");
}
@Test
public void testAdd() {
assertEquals(expected, new Calculator().add(a, b), 0.001);
}
@Test
public void testDivide() {
assertEquals(2, new Calculator().divide(4, 2), 0.001);
}
@After
public void tearDown() throws Exception {
System.out.println("After");
}
@AfterClass
public static void afterClass() {
System.out.println("After Class");
}
}
单个测试数据
返回Iterable或者Object数组
@Parameters
public static Iterable<? extends Object> data() {
return Arrays.asList("first test", "second test");
}
or
@Parameters
public static Object[] data() {
return new Object[] { "first test", "second test" };
}
区分每组测试数据
在@Parameters注解中为魅族测试用例指定名称,占位符如下:
{index} 测试用例编号
{0}, {1}, {2}.... 参数编号
@Parameters(name = "No.{index}:{0}+{1}?={2}")
多线程测试
测试类之间存在继承关系
被重写的方法不会被执行,否则先执行父类的再执行子类的