首页 > 技术文章 > JUit——(三)JUnit核心对象(测试、测试类、Suit和Runner)

lesleysbw 2017-01-14 21:38 原文

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

 

推荐阅读