如何测试数组是否与多个输入数据相等
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()
使用 @TestFactory
为 primes()
返回的每个质数创建一个测试用例,从外部资源 primes-1000.txt
加载它们。例如,IntelliJ 显示如下:
因此,您可以为每个设置动态创建一个测试用例。这会将测试数据排除在测试 class 之外,只有那些包含失败断言的测试才会失败。
查看 user guide or this excellent blog post 了解更多信息,但请记住 JUnit 5 仍在开发中。
我一直在搜索任何文档,如果可以使用参数化 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()
使用 @TestFactory
为 primes()
返回的每个质数创建一个测试用例,从外部资源 primes-1000.txt
加载它们。例如,IntelliJ 显示如下:
因此,您可以为每个设置动态创建一个测试用例。这会将测试数据排除在测试 class 之外,只有那些包含失败断言的测试才会失败。
查看 user guide or this excellent blog post 了解更多信息,但请记住 JUnit 5 仍在开发中。