2012-02-19 4 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, что добавилAnswerToQuestion прошло. Возможно, этот тест будет запускаться рядом или параллельно или нет ...

Однако в вашем тесте 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

Чтобы ответить на этот вопрос, у меня есть вопрос к вам. Если происходит регрессия, и ответ больше не добавляется (разрывы утверждений), более ясно, если один тест прерывается или два (или по расширению, 10,20, 30 или что-то еще)?

Я лично думаю, что если функция ломается точно, один тест должен потерпеть неудачу.

0

Резервирование в тестовом покрытии является хорошим, потому что это означает, что ваше покрытие будет оставаться большим при обслуживании. Два теста, которые тестируют один и тот же кодовый путь сегодня, могут завтра тестировать разные кодовые пути.

Тем не менее, есть проблемы ремонтопригодности. Поддержание большого набора тестов с помощью n тестов может стоить времени программиста O (n) каждый раз, когда вы совершаете радикальные изменения. Если некоторые тесты являются излишними и труднодоступными, вы можете оптимизировать разработку, избавившись от них.

Если дополнительный тест не принесет больших затрат на обслуживание, просто добавьте его.

Если старый тест является головной болью для обслуживания, добавьте комментарий, что часть теста является избыточной, поэтому сопровождающий может избавиться от перекрывающейся части, а не поддерживать все это.

Смежные вопросы