JUnit 4学习笔记(下)

  1. JUnit 4 参数化测试
  2. 测试套件
    1. 测试类1
    2. 测试类2
    3. 测试套件类
  3. 超时测试
    1. 使用 @Timeout 注解
    2. 测试类的所有方法应用 Timeout 规则
    3. 测试执行顺序
  4. 参考

JUnit 4 参数化测试

Junit 4 参数化测试 允许通过变化范围的参数值来测试方法。参数擦测试可以通过以下简单的步骤实现:

  1. 对测试类添加注解 @RunWith(Parameterized.class)
  2. 将需要使用变化范围参数值测试的参数定义为私有变量。
  3. 使用上一步骤声明的私有变量作为入参,创建构造函数。
  4. 创建一个使用 @Parameters 注解的公共静态方法,它将需要测试的各种变量值通过集合的形式返回。
  5. 使用定义的私有变量定义测试方法。

EvenNumberCheckerTest 类 对 EvenNumberChecker 类进行参数化测试:

import static org.junit.Assert.*;

import java.util.Arrays;
import java.util.Collection;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

// Step 1 对测试类添加注解 @RunWith(Parameterized.class)
@RunWith(Parameterized.class)
public class EvenNumberCheckerTest {

    // Step 2: 将需要使用变化范围参数值测试的参数定义为私有变量
    private int inputNumber;
    private boolean isEven;

    // Step 3: 使用上一步骤声明的私有变量作为入参,创建构造函数
    public EvenNumberCheckerTest(int inputNumber, boolean isEven) {
        super();
        this.inputNumber = inputNumber;
        this.isEven = isEven;
    }

    // Step 4: 创建一个使用@Parameters注解的公共静态方法,它将需要测试的各种变量值通过集合的形式返回。
    @Parameters
    public static Collection<Object[]> data() {
        Object[][] data = new Object[][]{
                {2, true},
                {5, false},
                {10, true}
        };
        return Arrays.asList(data);
    }

    @Test
    public void test() {
        System.out.println("inputNumber: " + inputNumber + "; isEven: " + isEven);
        EvenNumberChecker evenNumberChecker = new EvenNumberChecker();
        // Step 5: 使用定义的私有变量定义测试方法
        boolean actualResult = evenNumberChecker.isEven(inputNumber);
        assertEquals(isEven, actualResult);
    }
}

class EvenNumberChecker {
    /**
     * 校验输入的数字是否为偶数
     */
    public boolean isEven(int i) {
        if (i % 2 == 0) {
            return true;
        } else {
            return false;
        }
    }
}

测试套件

JUnit 4 允许通过使用测试套件类批量运行测试类,为一套测试类创建一个测试套件,要为测试类添加注解:@RunWith(Suite.class)@SuiteClasses(TestClass1.class, TestClass2.class)

当运行时,所有包含在 @SuiteClasses 注解内的所有测试类都会被执行。

测试类1

import org.junit.Test;
import static org.junit.Assert.assertEquals;

public class GeometryTest {
    @Test
    public void testSquareArea() {
        Geometry geometry = new Geometry();
        int actualResult = geometry.squareArea(2);
        int expectedResult = 4;
        assertEquals(expectedResult, actualResult);
    }
}
class Geometry {
    public int squareArea(int length) {
        return length * length;
    }
}

测试类2

import org.junit.Test;
import static org.junit.Assert.assertEquals;

public class ArithmeticTest {
    @Test
    public void testAdd() {
        Arithmetic arithmetic = new Arithmetic();
        int actualResult = arithmetic.add(1, 2);
        int expectedResult = 3;
        assertEquals(expectedResult, actualResult);
    }
}
class Arithmetic {
    public int add(int i, int j) {
        return i + j;
    }
}

测试套件类

import org.junit.runner.RunWith;
import org.junit.runners.Suite;

@RunWith(Suite.class)
@Suite.SuiteClasses({ArithmeticTest.class, GeometryTest.class})
public class AllTests {

}

超时测试

使用 @Timeout 注解

public class TimeoutTest {

    // 测试结果会是失败
    @Test(timeout = 200) // 毫秒
    public void testTimeout() {
        while (true);
    }
}

测试类的所有方法应用 Timeout 规则

Timeout Rule 中设置的超时时间应用于整个测试过程,包括任何的 @Before@After 方法。

public class TimeoutRuleTest {

    /**
     * Rule 应用该类所有方法
     */
    @Rule
    public Timeout timeout = new Timeout(1000); // 毫秒

    /*
    @Rule
    public final TestRule globalTimeout = Timeout.millis(20); // 毫秒

    @Rule
    public final TestRule globalTimeout = Timeout.seconds(2); // 秒
    */
    @Test
    public void testTimeout1() {
        while (true) ;
    }

    @Test
    public void testTimeout2() {
        while (true) ;
    }
}

测试执行顺序

从4.1.1版本开始,JUnit 默认使用一种确定的、非不可预测的顺序来调用测试方法(MethodSorters.DEFAULT)。如果想改变它,可以在测试类上加上 @FixMethodOrder 注解,并指定一种可用的 MethodSorters
有下面几种:

  1. @FixMethodOrder(MethodSorters.JVM):使用Java虚拟机返回的顺序。可能导致每次执行的顺序不同。
  2. @FixMethodOrder(MethodSorters.NAME_ASCENDING):使用测试方法名的字典序。

参考

Junit 4 Tutorials(Junit 4 教程)

JUnit4 wiki翻译



转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 bin07280@qq.com

文章标题:JUnit 4学习笔记(下)

文章字数:876

本文作者:Bin

发布时间:2018-03-31, 21:41:33

最后更新:2019-08-06, 00:53:17

原始链接:http://coolview.github.io/2018/03/31/Java/JUnit%204%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%EF%BC%88%E4%B8%8B%EF%BC%89/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录