2012-02-19 17 views
1

質問の回答が正しく追加されているかどうかを確認する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

テストでは、1ビットの観察可能な動作のみをアサートする必要があります。テストが偶然に触れる他の動作は、他の場所でテストするため、一般的に正しいと見なされます。

「1ビットの観察可能な振る舞い」は、単一のアサーションしか持たないことを意味するのではなく、物または動作の価値のために、1つの「物」または1つの「行動単位」にアサートする必要があることを意味します。

私はshouldUpdateAnswerInQuestionテストを書いていた場合は、私が最初にアサーションを追加していません。

0

いいえはい。

あなたは、よく、addAnswerToQuestionが合格したことをshouldUpdateAnswerInQuestionに仮定するべきではありませんすることはできません。おそらく、そのテストは次回または並列に実行されるか、まったく実行されません。

ただし、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

+0

あなたは私があなたのことを理解したのですか? –

1

これに答えるために、私はあなたに質問があります。回帰が起こり、答えがもはや追加されない(アサーションが壊れた)場合、1つのテストが破損した場合、または2つの場合(または延長された場合、10,20,30など)、より明確になりますか?

私が個人的に考えると、機能がちょうど壊れると1つのテストが失敗すると思います。それはあなたのカバレッジがメンテナンス中大きいままであることを意味するので、テストカバレッジの

0

冗長性は、良いです。今日、同じコードパスをテストしている2つのテストは、明日、異なるコードパスをテストするかもしれません。

つまり、メンテナンスの問題があります。 n個のテストで大規模なテストスイートを維持すると、変更を行うたびにO(n)プログラマーの時間がかかります。いくつかのテストが重複して維持するのが難しい場合は、それらを取り除くことによって開発を合理化することができます。

追加試験はそれを追加し、メンテナンスのオーバーヘッドに多くを追加するつもりはない場合。

古いテストは、テストの一部が冗長であることをコメントに入れメンテナンス頭痛、ですので、メンテナではなく、全体を維持するとの重複部分を取り除くことができます。

関連する問題