2012-02-19 75 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)個編程器時間。如果一些測試是多餘的並且難以維護,那麼您可以通過消除它們來簡化開發流程。

如果額外的測試不會增加很多維護開銷,那麼只需添加它。

如果舊的測試是一個維護頭痛,請在評論中說,測試的一部分是多餘的,所以維護者可以擺脫重疊部分而不是維護整個事情。