2017-05-22 35 views
1

我一直在搜索任何文档,如果这可能与参数化junit4 testing如何测试数组与多输入数据的相等性

基本上我已经是两个阶级,GameEntry和记分牌:

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

+0

您可以使用TestNG,其中数据提供者可用于解决这样的问题。尽管即使使用TestNG,如果一个测试用例的测试用例失败,测试也会被中止。 – biziclop

回答

1

JUnit 5拥有“动态测试”的概念,它允许您在运行时生成测试用例。

看一看这个例子中(从JUnit 5 workshop借来的):

public class PrimeNumbersTest { 

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

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

} 

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

enter image description here

所以,你可以动态地创建一个测试案例为您的每个设置的。这将测试数据保留在测试类之外,并且只有那些包含失败断言的测试才会失败。

看一看在user guide或进一步信息,这个出色的blog post,但请记住,JUnit的5仍处于开发阶段。

相关问题