测试 Java 程序的最佳方法
Best way to test Java Program
我想测试下面的 java 程序。
package com.arrays;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* Find all pairs in an array of non-negative unique numbers whose sum is equal to k
* For Example. {1,3,4,5,6} and k=9, then {3,6} and {4,5}
*
*/
public class FindAllPairsIfSumToK {
public List<Pair> findAllPairsWhoseSumIsK(int[] inputArray, int k) {
Set<Integer> tempSet = new HashSet<>();
List<Pair> pairs = new ArrayList<>();
for(int i=0;i<inputArray.length;i++) {
tempSet.add(inputArray[i]);
}
for(int i=0;i<inputArray.length;i++) {
if((2*inputArray[i] != k) && tempSet.contains(k-inputArray[i])) {
pairs.add(new Pair(inputArray[i], k-inputArray[i]));
}
}
return pairs;
}
public static void main(String[] args) {
FindAllPairsIfSumToK findAllPairsIfSumToK = new FindAllPairsIfSumToK();
//Test 1
int[] inputArray1 = {1, 3, 5, 7, 9, 11};
List<Pair> output1 = findAllPairsIfSumToK.findAllPairsWhoseSumIsK(inputArray1, 10);
assert (output1.size() == 2) ;
//Test 2
int[] inputArray2 = {1, 2, 5, 6, 12, 15, 16};
List<Pair> output2 = findAllPairsIfSumToK.findAllPairsWhoseSumIsK(inputArray2, 17);
assert (output2.size() == 3) ;
}
class Pair{
int value1,value2;
public Pair(int value1, int value2) {
this.value1 = value1;
this.value2 = value2;
}
}
}
这就是我尝试测试程序的方式
//Test 1
int[] inputArray1 = {1, 3, 5, 7, 9, 11};
List<Pair> output1 = findAllPairsIfSumToK.findAllPairsWhoseSumIsK(inputArray1, 10);
assert (output1.size() == 2) ;
我用谷歌搜索了一下,但大多数都在讲述如何测试网络应用程序。
这是测试程序的正确方法吗?或者你能指导一下吗?
对于 java,有一个名为 JUnit 的单元测试库。根据您的 IDE,您必须以不同的方式包含它,但这里是基础知识。如果使用JUnit,你可以编写多个测试用例,这比在主函数中有测试用例更可取,因为你可以更好地组织测试。
如果您使用的是 eclipse,要生成新的 JUnit TestCase,只需右键单击源文件夹,然后 select:新建 -> 其他 -> JUnitTestCase,然后 select 一个 JUnit 版本。
在 JUnitTestCase 中,所有测试都是用 @Test
注释的函数,并使用 assertEqals、assertArrayEquals、assertNonNull 等检查结果。如果您创建一个新的源文件夹(将其称为 test 或类似名称)并创建使用与程序中相同的包结构并在与要测试的 class 相同的包中创建测试,您可以访问 package-private 和 protected 成员,但测试仍然与主程序分开组织。
你的测试使用 JUnit 看起来像这样:
@Test
public void Test_FindAllPairsIfSumToK(){
FindAllPairsIfSumToK findAllPairsIfSumToK = new FindAllPairsIfSumToK();
int[] inputArray1 = {1, 3, 5, 7, 9, 11};
List<Pair> output1 = findAllPairsIfSumToK.findAllPairsWhoseSumIsK(inputArray1, 10);
assertEquals (2, output1.size());
//maybe check if the correct ones are output:
output1.foreach(p -> assertEquals(10, p.value1 + p.value2));
}
另外,您可能希望将 pair 中的变量声明为 public final int
,以便可以从包外部访问它们,并且在构造 Pair 对象后无法更改它们。
此示例可以通过 运行 您的程序进行测试,将 -ea 或 -enableassertions 切换到 java。
唯一需要更改的是从 == 到 != 的条件,因为 assert 与抛出异常的条件相反。
请检查:
question
我想测试下面的 java 程序。
package com.arrays;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* Find all pairs in an array of non-negative unique numbers whose sum is equal to k
* For Example. {1,3,4,5,6} and k=9, then {3,6} and {4,5}
*
*/
public class FindAllPairsIfSumToK {
public List<Pair> findAllPairsWhoseSumIsK(int[] inputArray, int k) {
Set<Integer> tempSet = new HashSet<>();
List<Pair> pairs = new ArrayList<>();
for(int i=0;i<inputArray.length;i++) {
tempSet.add(inputArray[i]);
}
for(int i=0;i<inputArray.length;i++) {
if((2*inputArray[i] != k) && tempSet.contains(k-inputArray[i])) {
pairs.add(new Pair(inputArray[i], k-inputArray[i]));
}
}
return pairs;
}
public static void main(String[] args) {
FindAllPairsIfSumToK findAllPairsIfSumToK = new FindAllPairsIfSumToK();
//Test 1
int[] inputArray1 = {1, 3, 5, 7, 9, 11};
List<Pair> output1 = findAllPairsIfSumToK.findAllPairsWhoseSumIsK(inputArray1, 10);
assert (output1.size() == 2) ;
//Test 2
int[] inputArray2 = {1, 2, 5, 6, 12, 15, 16};
List<Pair> output2 = findAllPairsIfSumToK.findAllPairsWhoseSumIsK(inputArray2, 17);
assert (output2.size() == 3) ;
}
class Pair{
int value1,value2;
public Pair(int value1, int value2) {
this.value1 = value1;
this.value2 = value2;
}
}
}
这就是我尝试测试程序的方式
//Test 1
int[] inputArray1 = {1, 3, 5, 7, 9, 11};
List<Pair> output1 = findAllPairsIfSumToK.findAllPairsWhoseSumIsK(inputArray1, 10);
assert (output1.size() == 2) ;
我用谷歌搜索了一下,但大多数都在讲述如何测试网络应用程序。 这是测试程序的正确方法吗?或者你能指导一下吗?
对于 java,有一个名为 JUnit 的单元测试库。根据您的 IDE,您必须以不同的方式包含它,但这里是基础知识。如果使用JUnit,你可以编写多个测试用例,这比在主函数中有测试用例更可取,因为你可以更好地组织测试。
如果您使用的是 eclipse,要生成新的 JUnit TestCase,只需右键单击源文件夹,然后 select:新建 -> 其他 -> JUnitTestCase,然后 select 一个 JUnit 版本。
在 JUnitTestCase 中,所有测试都是用 @Test
注释的函数,并使用 assertEqals、assertArrayEquals、assertNonNull 等检查结果。如果您创建一个新的源文件夹(将其称为 test 或类似名称)并创建使用与程序中相同的包结构并在与要测试的 class 相同的包中创建测试,您可以访问 package-private 和 protected 成员,但测试仍然与主程序分开组织。
你的测试使用 JUnit 看起来像这样:
@Test
public void Test_FindAllPairsIfSumToK(){
FindAllPairsIfSumToK findAllPairsIfSumToK = new FindAllPairsIfSumToK();
int[] inputArray1 = {1, 3, 5, 7, 9, 11};
List<Pair> output1 = findAllPairsIfSumToK.findAllPairsWhoseSumIsK(inputArray1, 10);
assertEquals (2, output1.size());
//maybe check if the correct ones are output:
output1.foreach(p -> assertEquals(10, p.value1 + p.value2));
}
另外,您可能希望将 pair 中的变量声明为 public final int
,以便可以从包外部访问它们,并且在构造 Pair 对象后无法更改它们。
此示例可以通过 运行 您的程序进行测试,将 -ea 或 -enableassertions 切换到 java。
唯一需要更改的是从 == 到 != 的条件,因为 assert 与抛出异常的条件相反。
请检查: question