JUnit fail() соглашения

Мне интересно, по соглашению, когда тест выходит из строя, целесообразно ли:

  • Скажите, почему это не удалось (бизнес-логика)
  • Скажите, почему сообщение видно (исключение должно быть брошено, а оно не)

Например,

fail("Accessed the element which does not exist");

или

fail("ArrayIndexOutOfBoundException was expected but something bad happened");

Какой из них обычно предпочтительнее/принято?

Ответ 1

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

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

Еще один вариант, который я бы рассмотрел, скорее, чем указание на то, что произошло исключение, вместо этого дайте подробную информацию о фактическом исключении - почему были созданы стоп-трассы. Это даст более подробную информацию, чем любой из перечисленных способов.

Ответ 2

Во-первых, если вы ожидаете, что API, который вы тестируете, генерирует исключение, вместо выполнения try-catch с fail()...

@Test
public void testMe() {
   try {
      api.testThis();
      fail("should not reach here");
   }
   catch(MyException e) {}
}

... вы должны сделать это: -

@Test(expected=MyException.class)
public void testMe() {
   api.testThis();
}

Тем не менее, я редко использую fail(). Если мне нужно выполнить определенную проверку, и условие завершится неудачно, я, скорее всего, буду использовать утверждения, чем использовать fail()... например: -

... вместо...

@Test
public void testMe() {
   boolean bool = api.testThis();
   if (!bool) {
      fail("should be true because bla bla bla");
   }
}

... сделайте следующее: -

@Test
public void testMe() {
   boolean bool = api.testThis();
   assertTrue("bla bla bla",bool);
}

Однако, если вам действительно нужно использовать fail(), будьте многословными и объясните, почему он терпит неудачу, а не "не должен доходить здесь" или "должен не работать здесь", потому что это не помогает людям, которые читают тестовые файлы.

Конечно, это просто примеры... но я думаю, что получаю свои очки.:)

Ответ 3

Если бы было соглашение об этом, я бы проигнорировал его. Вы должны сказать, что лучше всего будет сообщать кому-то, видя это сообщение в характере проблемы таким образом, чтобы ее можно было разрешить как можно проще. Слишком часто придерживаться конвенции не удается в этом отношении.