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