У чому полягає актуальність модульного тестування в середовищі "Часто вивільняйте"?


10

Протягом останнього року або близько того я привів свою команду до режиму розвитку, який часто випускається на ранньому рівні (AKA: Швидкий розвиток додатків, а не Agile). Для отримання додаткової інформації про спосіб закриття збірки див. Мою відповідь тут: Прості способи покращити якість випуску в середовищі RAD

Коли ми прийняли RAD, люди були цілком незалежними і спочатку робили тестування. інтегровані тести траплялися значно пізніше в процесі. Це був природний процес для них без особливого формального примусового виконання. Зараз ситуація зовсім інша:

  1. Вся платформа добре інтегрована з усталеними побудови / випуски працюючих на стороні клієнта без будь-яких гарячих точок.

  2. Нові вимоги до функціональності продовжують надходити, і ми поступово формуємо їх у міру розвитку.

  3. Загальна динаміка системи є дуже важливою, оскільки, хоча незалежні групи розвитку можуть правильно слідкувати за процесами, основні збої виникли через складні, не очевидні обставини.

  4. У багатьох частинах системи задіяні нові алгоритми та результати досліджень, тому завдання (і, отже, механізм тестування) не завжди передбачені правильно, як тестування функцій у чітко визначеному програмному забезпеченні.

Нещодавно я намагався покращити загальну картину, щоб побачити, чи потрібно вдосконалення процесу. Коли я сіла зі своєю командою, багато з них виступили з голосом: "Ми більше не робимо тестування!" а інші вважали, що не варто починати зараз, тому що це ніколи не буде ефективним.

Чи корисні одиничні тести у відносно зрілій системі? Чи потрібно нам принаймні зважувати обсяг тесту залежно від зрілості одиниць? Чи уповільнить тестування одиниці темпи розвитку? Чи потрібно оцінювати одиничне тестування по-іншому?

Які найкращі практики тестування для зрілої платформи в середовищі, що часто випускається на початку-випуску?


Я думаю, що ідея полягає у тому, щоб випустити напівробочий код рано і часто, але "напівробоча" частина неявна. У цьому допомагають одиничні тести. Але одиничних тестів може бути недостатньо. Ви також можете скористатися тестами інтеграції.
ccoakley

Відповіді:


15

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

Звичайно, якщо у вас є система з деякими незалежними частинами, і ви працювали між двома випусками лише на невеликій частині системи, ви, ймовірно, можете опустити деякі тести одиниць, які є для інших частин системи. Але ви обов'язково повинні використовувати (і розширити) одиничні тести для частин, де ви працюєте.

Інша справа, що коли система зростає, все більше і більше буде необхідність у додаткових тестах інтеграції - але це не означає, що вам буде потрібно менше одиничних тестів.

Справжнє питання, що стоїть за вашим, може бути іншим. Чи стало важче писати одиничні тести, оскільки ваша система стала все більшою і більшою? Чи справді ваші "одиничні" тести є одиничними тестами, чи вони вже не перевіряють речі ізольовано? Це може бути тому, що вони покладаються на частини нижчого рівня системи, які стабілізувалися з часом.

Такі речі трапляються тому, що розробники прагнуть повторно використовувати існуючі бібліотеки та код, безпосередньо посилаючись на них. Часто це призводить до того, що писати тестові одиниці стає складніше, оскільки їм часто доводиться надавати більш складне середовище та більше даних тесту. Якщо це ваша проблема, то вам слід дізнатися про ключові поняття Принцип введення залежностей та інтерфейсу інтерфейсу , який може допомогти вам зробити код більш одиничним для перевірки.


"Це часто призводить до того, що написання одиничних тестів стає складніше, оскільки їм часто доводиться надавати більш складне середовище та більше даних тесту". <- Тест одиниці повинен бути таким же простим для простої системи, як і складний. Вам не потрібно більше півдюжини налаштувань для кожного класу. Інакше це просто означає, що ваш клас виріс занадто великий. Крім того, пристрій тесту не повинен прив'язуватися до будь-якого середовища. (Але ви це вже знаєте, просто кажучи ...)
Спіт Сміт

@SleeperSmith: так, і щоб можна було писати такі прості одиничні тести, можливо, буде хорошою ідеєю застосувати DI та ISP - саме так я писав вище. Вибачте, якщо я був недостатньо зрозумілий з цього приводу.
Doc Brown

4

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

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

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


3

Як пропонують Док Браун та Торбйорн Равн Андерсен , навколишнє середовище з раннім випуском часто може отримати вигоду навіть від хорошого тестування одиниць та тестової розробки, ніж одна з тривалими циклами випуску.

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

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