2012-02-19 70 views
1

我做了一个测试,检查是否正确添加问题的答案。我也有更新方法测试。但正如你在更新方法中看到的那样,你会发现我在检测真正应该做的事情之前检查是否添加了答案。这是错的吗?我应该假设它是有效的,因为我已经有了添加另一个测试覆盖的答案的情况,还是应该做出这样的断言?JUnit测试是否应该重叠?

@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(); 
    } 
} 

回答

1

测试应该只对一点可观察行为断言。测试偶然触及的其他行为通常应该被认为是正确的,因为我们在别处测试它们。

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

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

0

不,是的。

在shouldUpdateAnswerInQuestion中,您不能,也不应该假设在传递addAnswerToQuestion时。也许该测试将运行下一个或并行或根本不...

但是,在您的shouldUpdateAnswerInQuestion测试中,检查您添加的内容是什么,你应该是所需要的。

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

也许

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

会更好。

+0

这应该是Java,String.Concate看起来像C#。 – user219882 2012-02-19 21:54:31

+0

你明白我的意思吗? – 2012-02-20 09:49:05

1

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

我个人认为如果一个功能正好打破了一次测试就会失败。

0

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

这就是说,有可维护性问题。每次进行彻底更改时,使用n次测试维护一个大型测试套件可能会花费O(n)个编程器时间。如果一些测试是多余的并且难以维护,那么您可以通过消除它们来简化开发流程。

如果额外的测试不会增加很多维护开销,那么只需添加它。

如果旧的测试是一个维护头痛,请在评论中说,测试的一部分是多余的,所以维护者可以摆脱重叠部分而不是维护整个事情。