好的,所以我有一个课程作业问题表我刚刚完成,我知道它工作正常,但我想为它编写一些jUnit测试,就像一些测试练习一样。它引发了一些问题。我写了一个名为count
的函数,它接收int n
并汇总1 to n
中的所有值并返回它。所以,我为此编写了4个测试用例,并假设它们都应该采用相同的测试方法:
@Test
public void testCount() {
assertEquals(0, SimmonsPS5.count(0)); // 1 obj in table with name => 0 permutations
assertEquals(1, SimmonsPS5.count(1)); // 2 obj in table with name => 1 permutation
assertEquals(3, SimmonsPS5.count(2)); // 2 obj in table with name => 3 permutations (3c2)
assertEquals(5050, SimmonsPS5.count(100)); // 100 obj in table with name => 100c2 permutations (100(100+1)/2)
}
但是如果一个人没有通过测试(这可能意味着他们都做了),错误记者只会说一次测试失败,这是不正确的。
接下来,我在类中的main方法实例化该类,运行一些函数然后打印到stdout
。 main方法首先接受一个参数(文件名),然后读取文件并对其执行一些操作。所以我想测试它为每个文件输出正确的数据 - 如果这些测试用例中的每一个都存在于同一个测试方法中,还是单独存在?我选择了单独的,但唯一的原因是我觉得这些比以前的方法更容易失败。因此,如果这是测试它的正确方法,那么测试方法应该被调用? testMain1
,testMain2
等?什么是“被接受的”命名法?
我的main
测试用例:
private final ByteArrayOutputStream outContent = new ByteArrayOutputStream();
private final ByteArrayOutputStream errContent = new ByteArrayOutputStream();
@Before
public void setUpStreams() {
System.setOut(new PrintStream(outContent));
System.setErr(new PrintStream(errContent));
}
@After
public void cleanUpStreams() {
System.setOut(null);
System.setErr(null);
}
@Test
public void testMain4in() {
SimmonsPS5.main(new String[]{"4.in"});
assertEquals(47485, Integer.parseInt(outContent.toString().trim()));
}
@Test
public void testMain5in() {
SimmonsPS5.main(new String[]{"5.in"});
assertEquals(1667, Integer.parseInt(outContent.toString().trim()));
}
@Test
public void testMain6in() {
SimmonsPS5.main(new String[]{"6.in"});
assertEquals(45871, Integer.parseInt(outContent.toString().trim()));
}
@Test
public void testMain7in() {
SimmonsPS5.main(new String[]{"7.in"});
assertEquals(324, Integer.parseInt(outContent.toString().trim()));
}
@Test
public void testMain8in() {
SimmonsPS5.main(new String[]{"8.in"});
assertEquals(1057527, Integer.parseInt(outContent.toString().trim()));
}
请注意,stdout
的输出是一个整数。
答案 0 :(得分:2)
您希望每个测试都测试特定功能。所有执行的测试应共同能够指示功能是否正常工作或不能正常工作。所以,例如,在你的第一个例子中:
@Test
public void testCount() {
assertEquals(0, SimmonsPS5.count(0)); // 1 obj in table with name => 0 permutations
assertEquals(1, SimmonsPS5.count(1)); // 2 obj in table with name => 1 permutation
assertEquals(3, SimmonsPS5.count(2)); // 2 obj in table with name => 3 permutations (3c2)
assertEquals(5050, SimmonsPS5.count(100)); // 100 obj in table with name => 100c2 permutations (100(100+1)/2)
}
这是合适的。您正在测试count()
是否按设计行事。如果任何失败,则count()
的行为不符合设计。
这些测试中的许多测试失败并不重要 - 如果所有这些测试都失败,您采取的操作将与您在其中一个失败时采取的操作相同:Debug {{1 }}。
你的第二个案例:
main方法通过首先接受一个参数(文件名)然后读取文件并对其执行一些操作来完成此操作。所以我想测试它输出每个文件的正确数据 - 如果这些测试用例中的每一个都存在于相同的测试方法中,还是单独的测试方法?
您是否将这些组合成单个测试取决于概念上您正在测试的内容。您是否正在测试count()
是否有效?或者您正在测试它是否适用于单个特定文件?前者是一个概念上更正确的测试,因为您实际上不关心它对您的特定文件起作用,您真的关心它是否按照设计工作任何文件,你提出了一组测试文件,你认为这些文件准确地代表了程序将要运行的文件类型。