Подтвердить что ты не робот

Java/JUnit - AssertTrue vs AssertFalse

Я новичок в Java и следую Eclipse Total Beginner Tutorials. Все они очень полезны, но в уроке 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. Если да, то в чем смысл их обоих?

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

assertFalse

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

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

Параметры:

  • message - идентификационное сообщение для AssertionError (null okay)
  • condition - условие, подлежащее проверке

Ответ 3

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

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

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

Ответ 4

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

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

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

AssertTrue(!(a > 3));

или

AssertFalse(a > 3);

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

Ответ 5

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

assertThat(thisOrThat, is(false));

он гораздо читабельнее, и он также печатает сообщение об ошибке.

Ответ 6

assertTrue завершится с ошибкой, если проверенное значение будет ложным, а assertFalse выполнит противоположное: сбой, если установленное значение истинно.

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

Ответ 7

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

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

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

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