当前位置: 首页 > 教程 > Junit4 >

Junit4 参数化测试

精华
小牛编辑
103浏览
2023-03-14

1 参数化测试的介绍

自定义流道参数化实现参数化测试。运行参数化测试类时,将为测试方法和测试数据元素的叉积创建实例。
例如,要测试斐波那契函数,请编写:
import static org.junit.Assert.assertEquals;

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;
/**
 * 小牛知识库网: https://www.xnip.cn
 */
@RunWith(Parameterized.class)
public class FibonacciTest {
    @Parameters
    public static Collection<Object[]> data() {
        return Arrays.asList(new Object[][] {     
                 { 0, 0 }, { 1, 1 }, { 2, 1 }, { 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 }  
           });
    }

    private int fInput;

    private int fExpected;

    public FibonacciTest(int input, int expected) {
        this.fInput = input;
        this.fExpected = expected;
    }

    @Test
    public void test() {
        assertEquals(fExpected, Fibonacci.compute(fInput));
    }
}
/**
 * 小牛知识库网: https://www.xnip.cn
 */
public class Fibonacci {
    public static int compute(int n) {
     int result = 0;
     
        if (n <= 1) { 
         result = n; 
        } else { 
         result = compute(n - 1) + compute(n - 2); 
        }
        
        return result;
    }
}

FibonacciTest的每个实例都将使用二元参数构造函数和方法中的数据值构造 @Parameters 。

2 使用@Parameter进行字段注入而不是构造函数

也可以将数据值直接注入字段中,而无需使用@Parameter批注的构造函数,如下所示:
import static org.junit.Assert.assertEquals;

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.Parameter;
import org.junit.runners.Parameterized.Parameters;
/**
 * 小牛知识库网: https://www.xnip.cn
 */
@RunWith(Parameterized.class)
public class FibonacciTest {
    @Parameters
    public static Collection<Object[]> data() {
        return Arrays.asList(new Object[][] {
                 { 0, 0 }, { 1, 1 }, { 2, 1 }, { 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 }  
           });
    }

    @Parameter // first data value (0) is default
    public /* NOT private */ int fInput;

    @Parameter(1)
    public /* NOT private */ int fExpected;

    @Test
    public void test() {
        assertEquals(fExpected, Fibonacci.compute(fInput));
    }
}

public class Fibonacci {
    ...
}

3 使用单个参数进行测试

(自4.12-beta-3开始)
如果您的测试仅需要单个参数,则不必用数组包装它。相反,您可以提供Iterable或对象数组。
@Parameters
public static Iterable<? extends Object> data() {
    return Arrays.asList("first test", "second test");
}

或者

@Parameters
public static Object[] data() {
    return new Object[] { "first test", "second test" };
}

4 识别单个测试用例

为了在Parameterized测试中轻松识别各个测试用例,可以使用@Parameters注解提供名称。该名称允许包含在运行时替换的占位符:
  • {index}:当前参数索引
  • {0}, {1}, …:第一个,第二个,依此类推,参数值。注意:单引号 ' 应转义为两个单引号 ''。

4.1 范例

import static org.junit.Assert.assertEquals;

import java.util.Arrays;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
/**
 * 小牛知识库网: https://www.xnip.cn
 */
@RunWith(Parameterized.class)
public class FibonacciTest {

    @Parameters(name = "{index}: fib({0})={1}")
    public static Iterable<Object[]> data() {
        return Arrays.asList(new Object[][] { 
                 { 0, 0 }, { 1, 1 }, { 2, 1 }, { 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 }
           });
    }

    private int input;
    private int expected;

    public FibonacciTest(int input, int expected) {
        this.input = input;
        this.expected = expected;
    }

    @Test
    public void test() {
        assertEquals(expected, Fibonacci.compute(input));
    }
}

public class Fibonacci {
    ...
}

在上面给出的示例中,参数化运行器创建的名称类似[3:fib(3)= 2]。如果未指定名称,则默认情况下将使用当前参数索引。

4.2 输出