Яка різниця між помилкою та помилкою в JUnit?


93

Я запускаю тести JUnit на великій базі коду, і я розумів, що іноді я отримую "Помилки", тоді як інколи отримую "Помилки". Яка різниця?

Відповіді:


116

Гаразд, я щойно помітив закономірність і думаю, що зрозумів (виправте мене, якщо помиляюся). Мені здається, що помилки - це коли ваші тестові кейси не вдаються - тобто ваші твердження є неправильними. Помилки - це несподівані помилки, які виникають під час спроби фактичного запуску тесту - винятки тощо.


5
Хоча, якщо щось розширення java.lang.AssertionErrorбуде кинуто, це буде показано як помилку тесту замість помилки тесту. Вам слід подумати про прийняття власної відповіді, оскільки вона є правильною.
ponzao

Так, саме в цьому різниця. І з прагматичної точки зору "ніякої різниці" немає - у тому, що якщо ви отримуєте помилку чи помилку, то вам потрібно це виправити. Тож, мабуть, помилкою було підраховувати "помилки" та "помилки" окремо в JUnit. JUnit 4 поєднує ці два (як пояснено у відповіді нижче).
Джефф Грігг,

І якщо очікується виняток, ви повинні позначити @Testс expected = SomeException.class.
Даунхілскі

@JeffGrigg є прагматична різниця. Якщо в декількох тестових випадках покладаються на одну поведінку, я все ще можу написати лише один тестовий кейс, який стверджує, що ця поведінка, незважаючи на відсутність, імовірно, винятки часу роботи у всіх інших. Це говорить про те, що решта тестових кейсів тестують щось інше, навіть незважаючи на те, що вони все ще залежать від цієї конкретної поведінки для запуску. Коли ця поведінка порушується, лише один тестовий випадок повідомляє про помилку, тоді як решта повідомляє про помилку, і з цього я бачу, що мені потрібно виправити рівно одну помилку, хоча багато тестових випадків не пройшли.
RonJRH,

org.junit.Assert.assertEquals (), якщо не вдається, вважається ПОМИЛКОЮ у звіті JUnit4 HTML. Це суперечить вашому твердженню (про що мені було відомо до цього часу). Чи можете ви, будь ласка, більше роз’яснити це?
Кришном,

15

Якщо ваш тест викидає виняток, який не виходить з бульбашок через 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 спрощує це лише як збої.

Наступне посилання пропонує більш цікаві дані:

http://www.devx.com/Java/Article/31983/1763/page/2


Це не точно. Різниця між помилкою тесту та помилкою тесту не зникла в JUnit 4. Я щойно перевірив її. Пов’язана стаття вводила в оману. У ньому сказано, що "JUnit 4 спрощує лише використання помилок", але слід підкреслити, що JUnit 4 перетворює java.lang.AssertionError у тестові збої, тому вам не доведеться використовувати junit.framework.AssertionFailedError. Перевага полягає в тому, що ви можете почати писати тестові твердження у виробничому коді без посилання проекту на JUnit. Також різницею між помилкою тесту та помилкою тесту є надзвичайно корисним і, якщо видалити, було б кроком назад.
RonJRH

RonJRH, ти можеш побачити помилки у своєму типовому звіті про перехід?
Ніл

Так Ніл. Я просто спробував. Не зовсім впевнений, що саме тут пов’язують зображення, але це показує результат мого тесту: imagebucket.net/abpxucddkvn1/Capture.PNG
RonJRH,

6

З "Прагматичного модульного тестування в Java 8 за допомогою JUnit":

Твердження (або твердження) у JUnit - це статичні виклики методів, які ви опускаєте у свої тести. Кожне твердження - це можливість перевірити, чи виконується якась умова. Якщо заявлена ​​умова не виконується, тест зупиняється тут же, і JUnit повідомляє про помилку тесту.

(Можливо також, що коли JUnit запускає ваш тест, виняток створюється і не перехоплюється. У цьому випадку JUnit повідомляє про помилку тесту.)


5

Нижче тест пояснює різницю між помилкою тесту та помилкою тесту .

Я прокоментував рядок, який видає помилку тесту та помилку тесту.

    @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 показує помилку тестування, коли ви отримуєте виняток, і помилку тесту, коли очікуване значення результату не відповідає вашому фактичному значенню


2

Клас джерела: 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) зараховується як помилки.


1

Ви маєте рацію, що помилки виникають із-за помилок AssertionErrors, викликаних методами твердження JUnit, або шляхом викиду AssertionError, або викидання винятку, про який ви заявили у своїй @Testанотації, а помилки виникають з інших, несподіваних винятків. Але між ними є важлива різниця:

Помилка означає, що ваш тест пройшов правильно і виявив дефект у коді.

Помилка може означати помилку у вашому коді, але таку, на яку ви навіть не тестували. Це також може означати, що помилка знаходиться в самому тесті.

Коротше кажучи, помилка означає, що вам потрібно переписати тестований код. Помилка означає, що це може бути модульний тест, який вам потрібно переписати. Це може означати це, навіть якщо помилка була у вашому коді, наприклад NullPointerException, оскільки ви виявили ваду, на яку навіть не тестували, тому, можливо, було б розумно протестувати її.


0

За іронією долі, junit та інші фреймворки, пов’язані з тестуванням (testng, hamcrest), забезпечують операції затвердження, які перевіряють стан, і якщо він не вдається, то під кришку викидається java.lang.AssertionError, яка btw розширює java.lang.Error.

Але це жодним чином не суперечить наведеним вище відповідям, які, звичайно, цілком справедливі. Отже, щоб позначити конкретний тестовий потік як збій, можна викинути AssertionError, однак я не впевнений, що це дійсно задокументовано у відповідних посібниках, оскільки доцільніше використовувати спеціальний API fail (). Інші види Throwable вважатимуться помилками, а не помилками.


0

В основному, помилки стосуються невиконаних тверджень, тоді як помилки виникають через ненормальне виконання тесту . і я думаю, що кожна IDE має символічні значки з різними кольорами для пройдених , невдалих та з тестами на помилки .

Для отримання додаткової інформації перевірте це .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.