Я запускаю тести JUnit на великій базі коду, і я розумів, що іноді я отримую "Помилки", тоді як інколи отримую "Помилки". Яка різниця?
Відповіді:
Гаразд, я щойно помітив закономірність і думаю, що зрозумів (виправте мене, якщо помиляюся). Мені здається, що помилки - це коли ваші тестові кейси не вдаються - тобто ваші твердження є неправильними. Помилки - це несподівані помилки, які виникають під час спроби фактичного запуску тесту - винятки тощо.
@Test
с expected = SomeException.class
.
Якщо ваш тест викидає виняток, який не виходить з бульбашок через Assertion framework в 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 () екземпляр AssertionError
кількість помилок збільшується, коли це екземпляр AssertionError, інакше (будь-яка Throwable) зараховується як помилки.
Ви маєте рацію, що помилки виникають із-за помилок AssertionErrors, викликаних методами твердження JUnit, або шляхом викиду AssertionError, або викидання винятку, про який ви заявили у своїй @Test
анотації, а помилки виникають з інших, несподіваних винятків. Але між ними є важлива різниця:
Помилка означає, що ваш тест пройшов правильно і виявив дефект у коді.
Помилка може означати помилку у вашому коді, але таку, на яку ви навіть не тестували. Це також може означати, що помилка знаходиться в самому тесті.
Коротше кажучи, помилка означає, що вам потрібно переписати тестований код. Помилка означає, що це може бути модульний тест, який вам потрібно переписати. Це може означати це, навіть якщо помилка була у вашому коді, наприклад NullPointerException
, оскільки ви виявили ваду, на яку навіть не тестували, тому, можливо, було б розумно протестувати її.
За іронією долі, junit та інші фреймворки, пов’язані з тестуванням (testng, hamcrest), забезпечують операції затвердження, які перевіряють стан, і якщо він не вдається, то під кришку викидається java.lang.AssertionError, яка btw розширює java.lang.Error.
Але це жодним чином не суперечить наведеним вище відповідям, які, звичайно, цілком справедливі. Отже, щоб позначити конкретний тестовий потік як збій, можна викинути AssertionError, однак я не впевнений, що це дійсно задокументовано у відповідних посібниках, оскільки доцільніше використовувати спеціальний API fail (). Інші види Throwable вважатимуться помилками, а не помилками.
В основному, помилки стосуються невиконаних тверджень, тоді як помилки виникають через ненормальне виконання тесту . і я думаю, що кожна IDE має символічні значки з різними кольорами для пройдених , невдалих та з тестами на помилки .
Для отримання додаткової інформації перевірте це .
java.lang.AssertionError
буде кинуто, це буде показано як помилку тесту замість помилки тесту. Вам слід подумати про прийняття власної відповіді, оскільки вона є правильною.