如何测试数组是否与多个输入数据相等

How to test array for equality with multiple input data

我一直在搜索任何文档,如果可以使用参数化 junit4 testing

基本上我有两个 classes,GameEntry 和 Scoreboard:

public class GameEntry{
    private String name;
    private int score;

    // Constructor and Getters...
}

public class Scoreboard{
    private int numEntries = 0;
    private GameEntry[] board;

    // Constructor
    public Scoreboard(int capacity){
        board = new GameEntry[capacity];
    }

    // Add method - Only if entry is higher than current entries
    public void add(GameEntry e){
        // Code here...         
    }

    // Remove method

    // Reset method
}

我读过有关参数化测试的文章,其中您 return 一组不同的输入数据 Passing arrays to Parameterized JUnit,但这并不是我想要做的。我对 运行 10 种不同的测试感兴趣,在这些测试中,我将创建一个包含游戏条目名称、分数值的输入文本文件,以及另一个用于名称和分数预期值的文本文件。我想将所有数据都排除在测试 class 之外,以防我以后想更改数据。在输入和预期的文件被解析之后,我将只使用 Assert.assertArrayEquals( expectedResult, result ) 来比较数组。

如果没有参数化 Junit 测试,我应该不会有任何问题,但是如果一个测试失败,整个测试都会失败。我想我可以保留一个计数器来跟踪输入。我只想写一个测试来避免 DRY。 Junit 或其他 testing framework 可能吗?

JUnit 5有“动态测试”的概念,可以让你在运行时生成测试用例。

看看这个例子(借用JUnit 5 workshop):

class PrimeNumbersTest {

    @TestFactory
    Stream<DynamicTest> test_first_1000_prime_numbers() throws Exception {
        return primes().mapToObj(prime -> DynamicTest.dynamicTest(
                // Test case name.
                "Prime: " + prime,
                // Test case content.
                () -> assertTrue(PrimeNumbers.isPrime(prime))));
    }

    private LongStream primes() throws Exception {
        Path primesTxt = Paths.get(getClass().getResource("/primes.txt").toURI());
        return Files.lines(primesTxt).mapToLong(Long::parseLong);
    }

}

test_first_1000_prime_numbers() 使用 @TestFactoryprimes() 返回的每个质数创建一个测试用例,从外部资源 primes-1000.txt 加载它们。例如,IntelliJ 显示如下:

因此,您可以为每个设置动态创建一个测试用例。这会将测试数据排除在测试 class 之外,只有那些包含失败断言的测试才会失败。

查看 user guide or this excellent blog post 了解更多信息,但请记住 JUnit 5 仍在开发中。