Я запускаю тесты JUnit на большой базе кода, и я понимаю, что иногда я получаю "Ошибки", а в других случаях получаю "Неудачи". Какая разница?
Какая разница между ошибкой и ошибкой в JUnit?
Ответ 1
Хорошо, я только что заметил шаблон и думаю, что я понял это (исправьте меня, если я ошибаюсь). Мне кажется, что неудачи - это когда ваши тестовые случаи терпят неудачу - т.е. Ваши утверждения неверны. Ошибки - это непредвиденные ошибки, возникающие при попытке фактически запустить тест - исключения и т.д.
Ответ 2
Если ваш тест выдает исключение, которое не получает пузырьков через структуру Assertion в Junit, оно получает сообщение об ошибке. Например, NullPointer или исключение ClassNotFound сообщают об ошибке:
String s = null;
s.trim();
или,
try {
// your code
} catch(Exception e) {
// log the exception
throw new MyException(e);
}
Сказав это, следующее сообщение сообщит об ошибке:
Assert.fail("Failure here");
или,
Assert.assertEquals(1, 2);
или даже:
throw new AssertionException(e);
Это зависит от версии Junit, которую вы используете. Junit 4 проведет различие между сбоем и ошибкой, но Junit 4 упрощает его только как отказ.
Следующая ссылка содержит более интересные входы:
Ответ 3
Из "Прагматического модульного тестирования в Java 8 с помощью JUnit":
Утверждения (или утверждения) в JUnit - это вызовы статического метода, которые вы ваши тесты. Каждое утверждение дает возможность проверить, что некоторое условие Справедливо. Если утверженное условие не выполняется, тест прекращается там, и JUnit сообщает об ошибке тестирования.
(Также возможно, что, когда JUnit запускает ваш тест, исключение вызывается и не пойман. В этом случае JUnit сообщает тестовую ошибку.)
Ответ 4
Ниже тест объясняет разницу между ошибкой теста и ошибкой теста.
Я прокомментировал строку, которая выдает ошибку теста и провал теста.
@Test
public void testErrorVsTestFailure() {
final String sampleString = null;
assertEquals('j', sampleString.charAt(0) );
//above line throws test error as you are trying to access charAt() method on null reference
assertEquals(sampleString, "jacob");
//above line throws Test failure as the actual value-a null , is not equal to expected value-string "jacob"
}
Таким образом, Junit показывает ошибку теста всякий раз, когда вы получаете исключение, и ошибку теста, когда ожидаемое значение результата не соответствует вашему фактическому значению
Ответ 5
Исходный класс: JUnitReportReporter.java
public void generateReport(List<XmlSuite> xmlSuites, List<ISuite> suites, String defaultOutputDirectory) {
//......
for (ITestResult tr : (Set) entry.getValue()) {
TestTag testTag = new TestTag();
boolean isSuccess = tr.getStatus() == 1;
if (!(isSuccess)) {
if (tr.getThrowable() instanceof AssertionError)
++errors;
else {
++failures;
}
}
}
Как вы можете видеть ниже в приведенном выше методе
tr.getThrowable() instanceof AssertionError
количество ошибок увеличивается, когда это экземпляр AssertionError в противном случае (любой Throwable) считается ошибкой.
Ответ 6
Вы правы в том, что сбои происходят из-за ошибок AssertionErrors, генерируемых методами утверждений JUnit, либо путем генерирования ошибки AssertionError, либо из-за исключения, которое вы объявили в аннотации @Test, а ошибки происходят из других неожиданных исключений. Но есть важное различие между ними:
Сбой означает, что ваш тест был выполнен правильно и обнаружил дефект в вашем коде.
Ошибка может означать ошибку в вашем коде, но такую, которую вы даже не тестировали. Это также может означать, что ошибка находится в самом тесте.
Короче говоря, сбой означает, что вам нужно переписать код, который тестируется. Ошибка означает, что это может быть unit тест, который вам нужно переписать. Это может означать это, даже если ошибка была в вашем коде, например, NullPointerException, потому что вы обнаружили недостаток, который вы даже не тестировали, поэтому может быть целесообразно проверить это.