Java / JUnit - AssertTrue против AssertFalse - PullRequest
50 голосов
/ 14 июля 2010

Я довольно новичок в Java и следую Учебникам по Eclipse Total Beginner .Все они очень полезны, но в уроке 12 он использует assertTrue для одного теста и assertFalse для другого.Вот код:

// Check the book out to p1 (Thomas)
// Check to see that the book was successfully checked out to p1 (Thomas)
assertTrue("Book did not check out correctly", ml.checkOut(b1, p1));    // If checkOut fails, display message
assertEquals("Thomas", b1.getPerson().getName());

assertFalse("Book was already checked out", ml.checkOut(b1,p2));        // If checkOut fails, display message
assertEquals("Book was already checked out", m1.checkOut(b1,p2));

Я искал хорошую документацию по этим методам, но ничего не нашел.Если мое понимание верно, assertTrue, а также assertFalse отображают строку, когда второй параметр оценивается как false.Если да, то какой смысл иметь их обоих?

Редактировать: Думаю, я вижу, что меня смущает.Автор, возможно, поместил их обоих просто, чтобы показать их функциональность (в конце концов, это учебник).И он установил тот, который потерпел бы неудачу, чтобы сообщение распечатывалось и сообщало мне, ПОЧЕМУ оно не удалось.Начинаю придавать больше смысла ... Я думаю, что это объяснение, но я не уверен.

Ответы [ 7 ]

105 голосов
/ 14 июля 2010

assertTrue потерпит неудачу, если второй параметр оценивается как false (другими словами, он гарантирует, что значение истинно).assertFalse делает наоборот.

assertTrue("This will succeed.", true);
assertTrue("This will fail!", false);

assertFalse("This will succeed.", false);
assertFalse("This will fail!", true);

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

29 голосов
/ 14 июля 2010

Ваше понимание неверно, в подобных случаях всегда обращайтесь к JavaDoc .

assertFalse

public static void assertFalse(java.lang.String message,
                               boolean condition)

Утверждает, что условие ложно. Если это не так, он генерирует ошибку AssertionError с данным сообщением.

Параметры:

  • message - идентифицирующее сообщение для ошибки AssertionEll (все в порядке)
  • condition - проверяемое состояние
9 голосов
/ 14 июля 2010

Я думаю, что это только для вашего удобства (и читателей вашего кода)

Ваш код и ваши модульные тесты должны в идеале самодокументироваться, с чем помогает этот API,

Подумайте, что более понятно для чтения:

AssertTrue(!(a > 3));

или

AssertFalse(a > 3);

Когда вы открываете свои тесты через xx месяцев, когда ваши тесты внезапно не проходят, вам потребуется гораздо меньше времени, чтобы понять, что пошло не так во втором случае (мое мнение). Если вы не согласны, вы всегда можете придерживаться AssertTrue для всех случаев:)

9 голосов
/ 14 июля 2010

Дело в семантике.В assertTrue вы утверждаете, что выражение истинно.Если это не так, то он будет отображать сообщение и утверждение не будет выполнено.В assertFalse вы утверждаете, что выражение оценивается как ложное.Если это не так, то отображается сообщение и утверждение не выполняется.

assertTrue (message, value == false) == assertFalse (message, value);

Они функционально одинаковы, но если вы ожидаете, что значение будет false , используйте assertFalse.Если вы ожидаете, что значение будет true , используйте assertTrue.

7 голосов
/ 15 июля 2010

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

assertThat(thisOrThat, is(false));

он гораздо более читабелен и выводит лучшее сообщение об ошибке.

2 голосов
/ 30 декабря 2012

Курс содержит логическую ошибку:

    assertTrue("Book check in failed", ml.checkIn(b1));

    assertFalse("Book was aleready checked in", ml.checkIn(b1));

В первом утверждении мы ожидаем, что checkIn вернет True (потому что регистрация прошла успешно). Если это не удастся, мы напечатаем сообщение типа «Ошибка регистрации книги. Теперь во втором утверждении мы ожидаем, что checkIn потерпит неудачу, потому что книга была проверена уже в первой строке. Поэтому мы ожидаем, что checkIn вернет False. Если по какой-либо причине checkin возвращает True (чего мы не ожидаем), то сообщение никогда не должно быть «Книга уже была проверена», потому что регистрация прошла успешно.

2 голосов
/ 14 июля 2010

assertTrue потерпит неудачу, если проверенное значение равно false, а assertFalse сделает противоположное: потерпит неудачу, если проверенное значение равно true.

Другое дело, что ваш последний assertEquals, скорее всего, потерпит неудачу, так как он будет сравнивать строку «Книга уже извлечена» с выводом m1.checkOut (b1, p2). Требуется третий параметр (второе значение для проверки на равенство).

...