JUnit测试应该重叠吗?

时间:2012-02-19 21:36:15

标签: java java-ee junit

我做了一个测试,检查问题的答案是否正确添加。我也有一个更新方法测试。但正如您在更新方法中看到的那样,您会看到我在执行测试之前是否已经添加了答案。这是错的吗? Shoud我认为它有效,因为我已经有了添加另一个测试所涵盖的答案的情况,或者我应该做出这样的断言?

@Test
public void shouldAddAnswersToQuestion() {
    try {
        addAnswerToQuestion(new Answer("It is 3", false));
        addAnswerToQuestion(new Answer("It is 4", true));
        addAnswerToQuestion(new Answer("It is 5", false));
        addAnswerToQuestion(new Answer("It is 6", false));

        assertEquals(4, question.getAnswers().size());
    } catch (MultipleAnswersAreCorrectException e) {
        e.printStackTrace();
    }
}


@Test
public void shouldUpdateAnswerInQuestion() {
    try {
        Answer answer = new Answer("It is 4", true);
        addAnswerToQuestion(answer);

        Answer answerFromList = null;

        answerFromList = question.getAnswers().get(0);
        assertEquals(answer, answerFromList);

        answer.setDescription("It is now 5 instead of 4");
        question.updateAnswer(answer);

        answerFromList = question.getAnswers().get(0);
        assertEquals(answer, answerFromList);
    } catch (MultipleAnswersAreCorrectException e) {
        e.printStackTrace();
    }
}

4 个答案:

答案 0 :(得分:1)

测试应仅在一点可观察行为上断言。通常认为测试偶然接触的其他行为是正确的,因为我们在其他地方测试它们。

“一点可观察的行为”并不意味着你应该只有一个断言,而是你应该只对一个“事物”或一个“行为单位”断言,因为某些事物或行为的价值。 / p>

如果我已经编写了shouldUpdateAnswerInQuestion测试,那么我就不会添加第一个断言。

答案 1 :(得分:1)

要回答这个问题,我有一个问题要问你。如果发生回归并且不再添加答案(断言中断),是否一个测试中断或两个(或者扩展,10,20,30或其他)是否更清楚?

我个人认为,如果一个功能完全破坏,一个测试应该失败。

答案 2 :(得分:0)

不,是的。

你不能,也不应该在shouldUpdateAnswerInQuestion中假设addAnswerToQuestion已通过。也许该测试将在下一个或同时进行或根本不进行...

然而,在您对shouldUpdateAnswerInQuestion的测试中,检查您添加的内容应该是您所需要的全部内容。

你的问题在我看来,是answer.setDescription(“它现在是5而不是4”);

也许

answer.setDescription(String.Concate("It is now 5 instead of ", question.getAnswers().get(0));

会更好。

答案 3 :(得分:0)

测试覆盖率的冗余是好的,因为这意味着您的覆盖范围将在维护期间保持更高。今天测试相同代码路径的两个测试可能会在明天测试不同的代码路径。

也就是说,存在可维护性问题。每次进行彻底的更改时,维护一个包含n次测试的大型测试套件可能会花费O(n)程序员的时间。如果某些测试是多余的并且难以维护,您可以通过去除它们来简化开发。

如果附加测试不会增加维护开销,那么只需添加它即可。

如果旧测试是一个维护问题,请注意部分测试是多余的,因此维护人员可以摆脱重叠部分而不是维护整个事情。