如何准备和提供测试数据
How to prepare and provide test data
我正在尝试为计算矩阵对角线之和差的小函数编写测试用例(使用 Java、Maven、Junit、Eclipse)。
待测函数
public static int diagonalDifference(Integer matrix[][], int n) {
int diagonalSum1 = 0;
int diagonalSum2 = 0;
int diagonalDifference = 0;
for (int i = 0; i < n; i++) {
diagonalSum1 = diagonalSum1 + matrix[i][i];
diagonalSum2 = diagonalSum2 + matrix[i][Math.abs(i - 2)];
}
diagonalDifference = Math.abs(diagonalSum1 - diagonalSum2);
return diagonalDifference;
}
}
从这个答案我尝试了类似的东西但没有成功,
public class testSolutions {
Solution solution = new Solution();
Integer a[][] = { { 11, 2, 4 }, { 4, 5, 6 }, { 10, 8, -12 } };
Integer b[][] = { { 12, 22, 8 }, { 2, 16, 8 }, { 10, 5, -1 } };
@DataProvider
public Object[][] provideMatrixAndExpectedSum() {
return new Object[][] { { a, new Integer(15) } };
}
@Test
@UseDataProvider("provideMatrixAndExpectedSum")
public void test(Integer a[][], int n) {
int diagonalDifference = Solution.diagonalDifference(a, n);
assertEquals(diagonalDifference, 15);
}
}
当我 运行 执行此操作时,出现错误 "Method test should have no parameters."
我的问题是:
- 如何为这种情况编写测试用例?
- 如何准备测试数据?
- 我们能否在资源文件夹中创建一个类似属性文件的文件,以便它也可以提供给其他功能。
好像要测试的函数接受一个二维数组和returns一个整数,你需要测试返回的值是否正确。
我有一个使用 JUint 的类似代码和测试单元。不要理会我的代码做了什么,只关注传递了什么输入和要验证的输出。
public class countUniqueNums {
public int countUnique (int[] nums) {
int unique=0;
int [] intVal = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
for (int i = 0; i<nums.length; i++) {
intVal[nums[i]+9]++;
if (intVal[nums[i]+9]==1)
unique++;
else
if (intVal[nums[i]+9]==2)
unique--;
}
return unique;
}
}
测试单元为:
import static junitparams.JUnitParamsRunner.$;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
import org.junit.runner.RunWith;
import junitparams.JUnitParamsRunner;
import junitparams.Parameters;
@RunWith(JUnitParamsRunner.class)
public class countUniqueNumsParamTest {
@SuppressWarnings({ "unused", "deprecation" })
private static final Object[] countUniqueNumbers () {
return $(
// Parameters are (1,2), 1=expected result count, 2= input array
$(1,new int[]{0}), //Test Case 1
$(0,new int[]{}), //Test Case 2
$(0,new int[]{0,0}), //Test Case 3
$(0,new int[]{0,0,0}), //Test Case 4
$(1,new int[]{0,1,1,1}), //Test Case 5
$(1,new int[]{1,1,1,0}), //Test Case 6
$(2,new int[]{1,0,2,1}), //Test Case 7
$(4,new int[]{0,1,2,3}) //Test Case 8
);
}
@Test
@Parameters(method="countUniqueNumbers")
public void test(int unique, int[] nums) {
countUniqueNums cun = new countUniqueNums();
assertEquals(unique, cun.countUnique(nums));
}
}
确保在 Eclipse 中为 JUnit 导入正确的库。定制您的测试用例 class 以匹配我的测试用例,您应该可以开始了。
希望这有帮助。
我发现对于像您这样的用例,这种方法通常非常令人不安,尤其是因为它不是必需的,而且会使阅读和理解测试变得更加困难。
为什么没有必要?如果我编写了一个对两个整数求和的方法并测试了 1 + 2 = 3,为什么我需要编写另一个测试来确保 2 + 2 = 4?您可以问自己的问题是,“我需要在我的代码中更改什么,以便第二个测试 (2+2=4) 失败, 但是 第一个测试仍然通过?"如果我可以更改生产代码,那么第二个失败,但第一个没有,这意味着它通常是两个单独的测试。
为什么更难理解?
一块
int summand1 = 1;
int summand2 = 2;
int sum = MyMath.sum(summand1, summand2);
assertEquals(3, sum);
我是不是比
更容易理解
public void myTest(int summand1, int summand2, int expectedResult) {
int sum = MyMath.sum(summand1, summand2);
assertEquals(expectedResult, sum)
}
如果测试失败,我在几行代码中就掌握了所有信息。对于第二种,你不知道使用了什么参数,参数的定义可以在你测试的某个地方class,所以你需要更多的时间来真正找出问题所在。
我正在尝试为计算矩阵对角线之和差的小函数编写测试用例(使用 Java、Maven、Junit、Eclipse)。
待测函数
public static int diagonalDifference(Integer matrix[][], int n) {
int diagonalSum1 = 0;
int diagonalSum2 = 0;
int diagonalDifference = 0;
for (int i = 0; i < n; i++) {
diagonalSum1 = diagonalSum1 + matrix[i][i];
diagonalSum2 = diagonalSum2 + matrix[i][Math.abs(i - 2)];
}
diagonalDifference = Math.abs(diagonalSum1 - diagonalSum2);
return diagonalDifference;
}
}
从这个答案我尝试了类似的东西但没有成功,
public class testSolutions {
Solution solution = new Solution();
Integer a[][] = { { 11, 2, 4 }, { 4, 5, 6 }, { 10, 8, -12 } };
Integer b[][] = { { 12, 22, 8 }, { 2, 16, 8 }, { 10, 5, -1 } };
@DataProvider
public Object[][] provideMatrixAndExpectedSum() {
return new Object[][] { { a, new Integer(15) } };
}
@Test
@UseDataProvider("provideMatrixAndExpectedSum")
public void test(Integer a[][], int n) {
int diagonalDifference = Solution.diagonalDifference(a, n);
assertEquals(diagonalDifference, 15);
}
}
当我 运行 执行此操作时,出现错误 "Method test should have no parameters."
我的问题是:
- 如何为这种情况编写测试用例?
- 如何准备测试数据?
- 我们能否在资源文件夹中创建一个类似属性文件的文件,以便它也可以提供给其他功能。
好像要测试的函数接受一个二维数组和returns一个整数,你需要测试返回的值是否正确。 我有一个使用 JUint 的类似代码和测试单元。不要理会我的代码做了什么,只关注传递了什么输入和要验证的输出。
public class countUniqueNums {
public int countUnique (int[] nums) {
int unique=0;
int [] intVal = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
for (int i = 0; i<nums.length; i++) {
intVal[nums[i]+9]++;
if (intVal[nums[i]+9]==1)
unique++;
else
if (intVal[nums[i]+9]==2)
unique--;
}
return unique;
}
}
测试单元为:
import static junitparams.JUnitParamsRunner.$;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
import org.junit.runner.RunWith;
import junitparams.JUnitParamsRunner;
import junitparams.Parameters;
@RunWith(JUnitParamsRunner.class)
public class countUniqueNumsParamTest {
@SuppressWarnings({ "unused", "deprecation" })
private static final Object[] countUniqueNumbers () {
return $(
// Parameters are (1,2), 1=expected result count, 2= input array
$(1,new int[]{0}), //Test Case 1
$(0,new int[]{}), //Test Case 2
$(0,new int[]{0,0}), //Test Case 3
$(0,new int[]{0,0,0}), //Test Case 4
$(1,new int[]{0,1,1,1}), //Test Case 5
$(1,new int[]{1,1,1,0}), //Test Case 6
$(2,new int[]{1,0,2,1}), //Test Case 7
$(4,new int[]{0,1,2,3}) //Test Case 8
);
}
@Test
@Parameters(method="countUniqueNumbers")
public void test(int unique, int[] nums) {
countUniqueNums cun = new countUniqueNums();
assertEquals(unique, cun.countUnique(nums));
}
}
确保在 Eclipse 中为 JUnit 导入正确的库。定制您的测试用例 class 以匹配我的测试用例,您应该可以开始了。 希望这有帮助。
我发现对于像您这样的用例,这种方法通常非常令人不安,尤其是因为它不是必需的,而且会使阅读和理解测试变得更加困难。
为什么没有必要?如果我编写了一个对两个整数求和的方法并测试了 1 + 2 = 3,为什么我需要编写另一个测试来确保 2 + 2 = 4?您可以问自己的问题是,“我需要在我的代码中更改什么,以便第二个测试 (2+2=4) 失败, 但是 第一个测试仍然通过?"如果我可以更改生产代码,那么第二个失败,但第一个没有,这意味着它通常是两个单独的测试。
为什么更难理解? 一块
int summand1 = 1;
int summand2 = 2;
int sum = MyMath.sum(summand1, summand2);
assertEquals(3, sum);
我是不是比
更容易理解public void myTest(int summand1, int summand2, int expectedResult) {
int sum = MyMath.sum(summand1, summand2);
assertEquals(expectedResult, sum)
}
如果测试失败,我在几行代码中就掌握了所有信息。对于第二种,你不知道使用了什么参数,参数的定义可以在你测试的某个地方class,所以你需要更多的时间来真正找出问题所在。