Чи варто використовувати спробу лову в своїх методах тестування?


18

Я роблю одиничне тестування.

Я намагаюся перевірити одну функцію.

Я називаю це зі свого тестового компонента. Але якщо віддалена функція не може впоратися з винятком, то мій компонент тестера також отримає виняток, я думаю.

Тож чи варто хвилюватися за те, щоб отримати виключення в своєму компоненті тестера?

Спасибі.

Редагувати:

PS:

Викинути помилку добре, але тільки для інших функцій, не для кінцевих користувачів, поки не буде останній варіант!

OMG Я написав цитату програмування !!


Я новачок у тестуванні, і чи варто лише перевіряти поведінку функції. Я думаю, це називається тестуванням blackbox та whitebox. О, я це пам'ятаю. Я вчився це в коледжі!
Вікас

Яку мову та рамки xUnit ви конкретно використовуєте? Я б заперечував так у деяких випадках.
Грег К

Я використовую MXUnit з MockBox та ColdBox для мови ColdFusion.
Вікас

Відповіді:


23

Коротка відповідь: НІ.

Не виймайте винятки в одиничних тестах. Ви проводите тестування, щоб знайти помилки та ситуації, коли виникають винятки.

Тестова рамка блоку повинна обробляти винятки здоровим чином. Більшість (якщо не всі) фреймворки xUnit мають конструкцію, яка очікує певних винятків, які ви використовуєте, коли хочете викликати певну умову винятку в тестованій системі, і мають тестовий пропуск, якщо очікуване виняток підвищено, але не вдасться, якщо цього немає.


Я думаю, що вдосконалена система тестування може дуже добре впоратися з винятками, навіть я вважаю, що в Visual studio ми можемо перевірити винятки, як ви сказали, "очікуване виняток". Тож його добре знати і ділитися. Дякую ..
Вікас

Колись ви хочете перевірити, чи не викинуто Виняток, оскільки хороший тестування не перевіряє лише випадки, коли справи спрацьовують, але й випадки, коли вони не спрацьовують.
deadalnix

1
Ви НЕ хочете ловити винятки, як Ви хочете перевірити ситуації, у яких трапляються винятки (особливо Ваші власні винятки). Якщо ви пишете код, призначений для відмови за винятком за певних умов, ці умови повинні бути частиною вашого тестового набору, і, таким чином, слід перевірити. Відповідно до цих тестів, ці винятки повинні бути вилучені та проаналізовані.
jwenting

1
@Jwenting Прочитайте другий абзац - Рамки тестування блоків фіксують винятки і дозволяють проходити тести, якщо певні винятки підняті та невдалі, якщо їх немає
mcottle

5

(На відміну від відповіді mcottle) Довга відповідь: НІ ... більшість часу

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

Це не зовсім те саме, що знати, що тестований метод кидає виняток.

Якщо ваш тест передбачає налаштування об'єкта чи контексту (у межах тесту, а не у версії вашої рамки SetUp), можливо, вам буде краще загортати єдиний рядок, який ви насправді хочете перевірити, у спробі / лові, можливо, за допомогою помічника.

Наприклад,

public static class AssertHelper {
    public delegate void Thunk();

    public static void DoesNotThrow<T>(Thunk thunk, string message = "")
        where T: Exception {
        try {
            thunk.Invoke();
        } catch(T) {
            Assert.Fail(message);
        }
    }
}

і потім

[TestMethod]
public void assertHelperInAction() {
    // Random setup stuff here that's too annoying to put in my SetUp
    // method.
    AssertHelper.DoesNotThrow<IllegalArgumentException>(() =>
        {/* My random method under test */})
}

Якщо цей тест виявляється невдалим, я знаю, що мій тестовий метод викинув виняток, а не щось із випадкових налаштувань.

(Ви повинні намагатися уникати випадкових налаштувань. Іноді простіше мати код тестування в тесті.)


Гарний приклад! Я намагаюся бути дуже обережним щодо обмеження фази "тестування" лише точним тестом, але я запам'ятаю цей трюк, коли я просто не можу знайти спосіб зняти це (наприклад, при тестуванні на стан гонки і знадобиться "налаштування" близько до "тесту", щоб досягти стану).
Етел Еванс

1

Загалом, ви повинні просто випустити виняток, і тестова основа дасть вам приємний звіт із усією необхідною інформацією.


Але в методології TDD ми очікуємо дотримання цих кроків:

  1. Напишіть тест
  2. Слідкуйте за тим, як вона не виходить , і зробіть помилку зрозумілою
  3. Виправте код
  4. Refactor код і тест

Коли ви виключаєте виняток, якщо помилка ясна, то це добре. Але іноді виняток становлять незрозумілі, а то й неправильні. Як ви могли дозволити це бути у своєму коді (для вас пізніше, коли ви забудете, або для члена команди, який втратить великий час, розбираючи проблему)? Тож моя політика така: " Якщо потрібно зробити явний збій, вам потрібно вилучити виняток ".

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