JUnit的核心对象:测试、测试类、测试集(Suite)、测试运行器
1. 测试:
@Test注释的、公共的、不带有任何参数、并且返回void类型的方法
2. 测试类:
公共的,包含对应类的测试方法的类
例如:CalculatorTest.java测试类,其中add()为测试方法
package com.junit.MyClass; import org.junit.Before;
import org.junit.Test; import static org.junit.Assert.*; /**
* Created by lesley on 2017/1/14.
*/ //测试类
public class CalculatorTest {
private Calculator calculator;
@Before
public void setUp() throws Exception {
calculator = new Calculator();
} //测试方法
@Test
public void add() throws Exception {
assertEquals(calculator.add(3, 5), 8);
} }
JUnit在调用执行每个@Test方法之前,为测试类创建一个新的实例。这有助于提供测试方法之间的独立性,并且避免在测试代码中产生意外的副作用。因为每个测试方法运行于一个新的测试类实例上,所以我们就不能在测试方法之间重用各个实例变量值。
3. Assert
为了进行验证,我们使用由JUnit的Assert类提供的assert方法:
import static org.junit.Assert.*;
其中常用的assert方法:
1.assertEquals()方法,用来查看对象中存的值是否是期待的值,与字符串比较中使用的equals()方法类似;
2.assertFalse()和assertTrue()方法,用来查看变量是是否为false或true,如果assertFalse()查看的变量的值是false则测试成功,如果是true则失败,assertTrue()与之相反。
3.assertSame()和assertNotSame()方法,用来比较两个对象的引用是否相等和不相等,类似于通过“==”和“!=”比较两个对象;
4.assertNull()和assertNotNull()方法,用来查看对象是否为空和不为空。
4. Suit——测试集
Suit是一个包含不同测试的容器,将多个相关的测试类归为一组,一起运行。
同时Suit也是一个运行器,如果没有定义Suit测试集,那么JUnit会自动提供一个测试集,包含测试类中的所有测试。
我们可以通过Suit进行批量操作:(前两章中有提到)
AllTest.java
package com.junit.MyClass; /**
* Created by lesley on 2017/1/14.
*/
import org.junit.runner.*;
import org.junit.runners.Suite; @RunWith(Suite.class)
@Suite.SuiteClasses({
CalculatorTest.class,
UserTest.class
})
public class AllTest { }
5. 测试运行器
测试运行器是JUnit用来管理测试类的生命周期,包括创建类、调用测试以及搜集结果。主要有几种:
JUnit 自带的几个测试运行器都继承了 org.junit.runner.Runner 类。如果想创建你自己的测试运行器,你就需要扩展Runner 类。
5.1 参数运行器——Parameterized
参数化的运行器允许使用不同的参数多次运行同一个测试。例如:
ParameterizedCalculateTest.java:
package com.junit.MyClass; import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized; import java.util.Arrays;
import java.util.Collection;
import static org.junit.Assert.*; /**
* Created by lesley on 2017/1/14.
*/
//使用Parameterized 的测试运行器来运行一个测试类
// 1. 测试类必须用@RunWith注释,并且将Parameterized.class作为参数
@RunWith(value = Parameterized.class)
public class ParameterizedCalculateTest {
// 2. 必须声明测试中所使用的所有的实例变量
private double expected;
private double value1;
private double value2; //3. 提供一个@parameters注释的方法
//1)这个方法的签名必须是: Parameters public static ja va.u til . Collect ion , 无任何参数。
//2) Collecting元素必须是相同长度的数组。这个数组的长度必须要和唯一的构造函数的参数个数相同
@Parameterized.Parameters
public static Collection<Integer[]> getTestParameters(){
return Arrays.asList(new Integer[][] {
{2, 1, 1},
{3,2,1},
{5,2,1}, //错误参数
}
);
} //4. 构造函数
public ParameterizedCalculateTest(double expected, double value1, double value2){
this.expected = expected;
this.value1 = value1;
this.value2 = value2;
} //5. 测试
@Test
public void add(){
Calculator calculator = new Calculator();
assertEquals(expected, calculator.add(value1, value2), 0);
} }
逐步分析JUnit的运行过程:
JUnit调用了静态方法getTestParameters(),为其集合中的每个数组进行循环:
调用构造函数,传入数组中的第一个元素:含有三个元素的数组{2, 1, 1},然后调用@Test方法。