У мене є відповідний анекдот від чого - то , що відбувається прямо зараз для мене. Я над проектом, який не використовує TDD. Наші QA люди рухають нас у цьому напрямку, але ми невелике спорядження, і це був тривалий, затятий процес.
У будь-якому разі , я нещодавно використовував сторонні бібліотеки для виконання конкретного завдання. Виникла проблема щодо використання цієї бібліотеки, тож я поклав на себе, щоб по суті писати версію цієї самої бібліотеки. Загалом це було приблизно 5000 рядків виконуваного коду і приблизно 2 місяці мого часу. Я знаю, що рядки коду - це поганий показник, але я вважаю, що це гідний показник масштабу.
Була потрібна одна конкретна структура даних, яка дозволила б мені відстежувати довільну кількість біт. Оскільки проект знаходиться в Java, я вибрав Java BitSet
і трохи змінив її (мені потрібна була можливість відстежувати і провідні 0
s, що чомусь не робить BitSet Java .....). Досягнувши ~ 93% покриття, я почав писати кілька тестів, які б насправді наголосили на системі, яку я написав. Мені потрібно було порівняти певні аспекти функціональності, щоб гарантувати, що вони будуть досить швидкими для моїх кінцевих вимог. Не дивно, що одна з функцій, яку я перекрив з BitSet
інтерфейсу, була абсурдно повільною при роботі з великими наборами бітів (в цьому випадку сотні мільйонів біт). Інші перекриті функції покладалися на цю одну функцію, тому це була величезна шийка пляшки.
Те, що я в кінцевому підсумку робив, - це переходити до креслярської дошки і з'ясовувати спосіб маніпулювання базовою структурою BitSet
, яка є long[]
. Я розробив алгоритм, попросив колег про їх введення, а потім почав писати код. Потім я провів одиничні тести. Деякі з них зламалися, а ті, що зробили, вказали мені саме туди, куди мені потрібно заглянути в своєму алгоритмі, щоб виправити це. Виправивши всі помилки в одиничних тестах, я зміг сказати, що функція працює як слід. Принаймні, я можу бути таким же впевненим, що цей новий алгоритм спрацював так само, як і попередній алгоритм.
Звичайно, це не кулезахисні. Якщо в моєму коді є помилка, яку не перевіряють одиничні тести, я цього не знаю. Але звичайно, саме така помилка могла бути і в моєму повільному алгоритмі. Однак я можу з високим ступенем впевненості сказати, що мені не потрібно турбуватися про неправильний вихід з цієї конкретної функції. Попередні тести блоку врятували мені години, можливо, дні, щоб спробувати перевірити новий алгоритм, щоб переконатися, що він правильний.
Це сенс проводити одиничні тести незалежно від TDD - тобто модульні тести зроблять це для вас в TDD і поза TDD все одно, коли ви закінчите рефакторинг / підтримку коду. Звичайно, це слід поєднувати з регулярними тестами регресії, тестуванням диму, нечітким тестуванням і т. Д., Але одиничне тестування, як зазначено в назві, тестує речі на найменшому, атомному рівні, що дає вам змогу вказувати, де виникли помилки.
У моєму випадку, без існуючих тестових одиниць, я хотів би якось придумати метод забезпечення алгоритму, який працює весь час. Зрештою, це дуже схоже на тестування , чи не так?