【问题标题】:How to test array for equality with multiple input data如何使用多个输入数据测试数组是否相等
【发布时间】:2017-05-22 15:49:55
【问题描述】:

如果参数化 junit4 testing 可行,我一直在搜索任何文档。

基本上我有两个类,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
}

我已经阅读过参数化测试,您可以在其中返回一组不同的输入数据Passing arrays to Parameterized JUnit,但这并不是我想做的。我有兴趣运行 10 个不同的测试,在这些测试中,我将创建一个输入文本文件,其中包含 gameEntries 名称、分数值,以及另一个用于名称和分数的预期值的文本文件。我想将所有数据保留在测试类之外,以防我以后想更改数据。在输入和预期的文件被解析之后,我将只使用Assert.assertArrayEquals( expectedResult, result ) 来比较数组。

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

【问题讨论】:

  • 您可以使用 TestNG,其中数据提供者可用于解决此类问题。尽管即使使用 TestNG,如果一个测试用例针对一个条目失败,该测试也会中止该用例。

标签: java unit-testing parameterized


【解决方案1】:

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 显示如下:

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

请查看user guide 或此出色的blog post 以获取更多信息,但请记住,JUnit 5 仍在开发中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-26
    • 1970-01-01
    • 2022-12-01
    • 2022-11-06
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    相关资源
    最近更新 更多