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方法。