Відповіді на ваші запитання
Чи є таке поняття, як занадто багато одиничних тестів?
Звичайно ... Ви можете, наприклад, провести кілька тестів, які на перший погляд здаються різними, але реально перевірити одне і те ж (логічно залежать від одних і тих же рядків "цікавого" коду програми, що перевіряється).
Або ви можете перевірити внутрішній код свого коду, який ніколи не виходить назовні (тобто не є частиною будь-якого договору про інтерфейс), де можна міркувати про те, чи має це сенс взагалі. Наприклад, точне формулювання внутрішніх повідомлень журналу чи будь-чого іншого.
Мені було доручено скласти тестові одиниці для існуючої програми. Після закінчення мого першого файлу у мене 717 рядків тестового коду на 419 рядків оригінального коду.
Це вражає мене цілком нормальним. Ваші тести витрачають велику кількість рядків коду на налаштування та вилучення поверх фактичних тестів. Співвідношення може покращитись, а може і не. Я сам досить важкий, і часто інвестую більше тестів на місце і час, ніж на фактичний код.
Чи стане це співвідношення некерованим, коли ми збільшуємо охоплення коду?
Коефіцієнт не так враховує. Є й інші якості тестів, які, як правило, роблять їх некерованими. Якщо вам регулярно доводиться переробляти цілу купу тестів, виконуючи досить прості зміни у вашому коді, слід уважно ознайомитися з причинами. І це не скільки у вас рядків, а в тому, як ви підходите до кодування тестів.
Моє розуміння одиничного тестування полягало в тестуванні кожного методу в класі, щоб переконатися, що кожен метод працює як слід.
Це правильно для "одиничних" тестів у строгому сенсі. Тут «одиниця» є чимось на зразок методу чи класу. Суть "одиничного" тестування полягає в тестуванні лише однієї конкретної одиниці коду, а не всієї системи. В ідеалі ви видалите всю іншу частину системи (використовуючи подвійні чи щось таке).
Однак у запиті на виклик мій технічний керівник зазначив, що я повинен зосередитися на тестуванні вищого рівня.
Тоді ви потрапили в пастку припускати, що люди насправді мали на увазі одиничні тести, коли вони казали одиничні тести. Я зустрів багатьох програмістів, які говорять "одиничний тест", але означають щось зовсім інше.
Він запропонував протестувати 4-5 випадків використання, які найчастіше використовуються з відповідним класом, а не вичерпно перевіряти кожну функцію.
Звичайно, просто зосередження уваги на 80% важливого коду також зменшує навантаження ... Я ціную, що ви дуже думаєте про свого начальника, але це не вважає мене оптимальним вибором.
Для мене 100-відсоткове охоплення тесту є високою ціллю, але навіть якби ми досягли лише 50%, ми б знали, що 100% з цих 50% було покрито.
Я не знаю, що таке "одиничне покриття тесту". Я припускаю, що ви маєте на увазі "охоплення кодом", тобто що після запуску тестового набору кожен рядок коду (= 100%) був виконаний принаймні один раз.
Це хороша метрика бального парку, але далеко не найкращий стандарт, з якого можна було б знятись. Просто виконання рядків коду - це не вся картина; це не враховує різних шляхів через складні, вкладені гілки, наприклад. Це скоріше метрика, яка вказує пальцем на фрагменти коду, які перевіряються занадто мало (очевидно, якщо клас охоплює 10% або 5% покриття коду, то щось не так); з іншого боку, 100% покриття не скаже вам, чи достатньо ви протестували, чи правильно ви протестували.
Інтеграційне тестування
Мене це дуже дратує, коли люди постійно говорять про тестування одиниць за замовчуванням. На мою думку (та досвід), тестування одиниць чудово підходить для бібліотек / API; у більш орієнтованих на бізнес сферах (де ми говоримо про випадки використання, як у розглянутому питанні), вони не обов'язково є найкращим варіантом.
Що стосується загального коду програми та для середнього бізнесу (де заробляння грошей, досягнення термінів виконання та задоволення потреб клієнтів важливо, і ви головним чином хочете уникати помилок, які знаходяться безпосередньо в обличчі користувача, або які можуть призвести до справжніх лих - ми не тут говорять про запуски ракет NASA), інтеграція чи тести на функції набагато корисніші.
Вони йдуть рука об руку з розвитком, керованим поведінкою або розвитком функцій; вони не працюють із (суворими) одиничними тестами, за визначенням.
Щоб зробити його коротким (ish), тест на інтеграцію / функціональність виконує весь стек програм. У веб-додатку це буде діяти як браузер, натискаючи на додаток (і ні, очевидно, це не повинно бути таким спрощеним, для цього є дуже потужні рамки - перевірити http: // cucumber). io для прикладу).
О, щоб відповісти на ваші останні запитання: ви отримуєте всю команду, яка має високий рівень тестового покриття, переконуючись, що нова функція запрограмована лише після того, як її тест функцій було впроваджено та не вдалося. І так, це означає кожну особливість. Це гарантує вам 100% (позитивне) покриття функції. Це за визначенням гарантує, що функція вашої програми ніколи не «згасне». Це не гарантує 100% покриття коду (наприклад, якщо ви активно не запрограмуєте негативні функції, ви не будете здійснювати обробку помилок / обробку винятків).
Це не гарантує вам безкоштовну програму; звичайно, ви хочете написати тести функцій для очевидних або дуже небезпечних помилок, неправильного введення користувача, злому (наприклад, управління оточуючими сесіями, безпека тощо) тощо; але навіть тільки програмування позитивних тестів має величезну користь і цілком можливо для сучасних потужних рамок.
Тести функціональних / інтеграційних процесів, очевидно, мають власну глистину базу (наприклад, продуктивність; надмірне тестування фреймворків сторонніх сторін; оскільки ви зазвичай не використовуєте парні, вони, як показує мій досвід, також мають складніше написати), але я ' буду приймати 100% тестування додатків, перевірених на 100% програмного забезпечення, не перевіреного кодом (не бібліотека!).