Я запускаю тесты JUnit на большой базе кода и понимаю, что иногда получаю «Ошибки», а иногда - «Сбои». Какая разница?
Ответы:
Хорошо, я только что заметил закономерность и думаю, что понял ее (поправьте меня, если я ошибаюсь). Мне кажется, что неудачи возникают, когда ваши тестовые примеры терпят неудачу, т.е. ваши утверждения неверны. Ошибки - это непредвиденные ошибки, возникающие при попытке запустить тест - исключения и т. Д.
@Test
помощью expected = SomeException.class
.
Если ваш тест вызывает исключение, которое не всплывает через фреймворк 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 упрощает его только как отказы.
Следующая ссылка предоставляет более интересные материалы:
Из «Прагматического модульного тестирования в Java 8 с JUnit»:
Утверждения (или утверждения) в JUnit - это вызовы статических методов, которые вы добавляете в свои тесты. Каждое утверждение - это возможность проверить выполнение некоторого условия. Если заявленное условие не выполняется, тест сразу же останавливается, и JUnit сообщает об ошибке теста.
(Также возможно, что когда JUnit запускает ваш тест, возникает исключение, а не перехватывается. В этом случае JUnit сообщает об ошибке теста.)
Я прокомментировал строку, которая выдает ошибку теста и провал теста.
@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 показывает ошибку теста всякий раз, когда вы получаете исключение, и провал теста, когда ожидаемое значение результата не соответствует фактическому значению.
Исходный класс: 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) считается ошибкой.
Вы правы в том, что сбои происходят из-за AssertionErrors, вызванных методами утверждения JUnit, или путем выброса AssertionError, или путем выброса исключения, которое вы объявили в своей @Test
аннотации, а ошибки происходят из других, неожиданных исключений. Но между ними есть важное различие:
Ошибка означает, что ваш тест прошел правильно и выявил дефект в вашем коде.
Ошибка может означать ошибку в вашем коде, но такую, которую вы даже не тестировали. Это также может означать, что ошибка находится в самом тесте.
Короче говоря, сбой означает, что вам нужно переписать тестируемый код. Ошибка означает, что это может быть юнит-тест, который нужно переписать. Это может означать это, даже если ошибка была в вашем коде, например NullPointerException
, потому что вы обнаружили недостаток, который вы даже не тестировали, поэтому было бы разумно проверить это.
По иронии судьбы, junit и другие связанные с тестированием фреймворки (testng, hamcrest) предоставляют операции assert, которые проверяют условие, и в случае сбоя «под капотом» выдается ошибка java.lang.AssertionError, которая, кстати, расширяет java.lang.Error.
Но это никоим образом не противоречит приведенным выше ответам, которые, конечно, полностью действительны. Итак, чтобы пометить конкретный поток теста как сбой, можно выбросить AssertionError, однако я не уверен, что это действительно задокументировано в соответствующих руководствах, потому что более целесообразно использовать выделенный API fail (). Другие виды Throwable будут считаться ошибками, а не сбоями.
В основном, ошибки относятся к невыполненным утверждениям, в то время как ошибки возникают из-за ненормального выполнения теста . и я думаю, что в каждой IDE есть символические значки с разными цветами для проверки пройденного , неудачного и с ошибками .
Для получения дополнительной информации проверьте это .
java.lang.AssertionError
это будет показано как провал теста, а не как ошибка теста. Вам следует подумать о том, чтобы принять свой собственный ответ, потому что он правильный.