类似的jUnit测试用例是否应该在同一个测试中?

时间:2014-03-19 05:36:33

标签: java unit-testing junit

好的,所以我有一个课程作业问题表我刚刚完成,我知道它工作正常,但我想为它编写一些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方法首先接受一个参数(文件名),然后读取文件并对其执行一些操作。所以我想测试它为每个文件输出正确的数据 - 如果这些测试用例中的每一个都存在于同一个测试方法中,还是单独存在?我选择了单独的,但唯一的原因是我觉得这些比以前的方法更容易失败。因此,如果这是测试它的正确方法,那么测试方法应该被调用? testMain1testMain2等?什么是“被接受的”命名法?

我的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的输出是一个整数。

1 个答案:

答案 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()是否有效?或者您正在测试它是否适用于单个特定文件?前者是一个概念上更正确的测试,因为您实际上不关心它对您的特定文件起作用,您真的关心它是否按照设计工作任何文件,你提出了一组测试文件,你认为这些文件准确地代表了程序将要运行的文件类型。

相关问题