Чому автоматичне тестування не працює в моїй компанії?


178

Ми кілька разів намагалися запровадити автоматичне тестування розробників у моїй компанії. Наша команда QA використовує Selenium для автоматизації тестів на інтерфейс користувача, але я завжди хотів запровадити модульні тести та тести інтеграції. Раніше, кожного разу, коли ми пробували це, всі хвилювалися перший-два місяці. Потім, кілька місяців тому, люди просто перестають це робити.

Кілька спостережень та запитань:

  1. Чи працює насправді автоматичне тестування? Більшість моїх колег, які раніше працювали в інших компаніях, намагалися і не реалізували стратегію автоматизованого тестування. Я досі не бачив програмної компанії в реальному житті, яка фактично її використовує і не просто про це говорить. Так багато розробників розглядають автоматизоване тестування як те, що є теоретично чудовим, але насправді не працює. Наша бізнес-команда хотіла б, щоб розробники це робили навіть за 30% додаткового часу (принаймні так кажуть). Але розробники - скептики.

  2. Ніхто насправді не знає, як правильно робити автоматичне тестування. Так, ми всі прочитали приклади тестування в Інтернеті, але використання їх для великого проекту - це зовсім інше. Основним винуватцем є глузування / заглушення бази даних чи будь-чого іншого, що є нетривіальним. Ви закінчуєте витрачати більше часу на глузування, ніж на написання фактичних тестів. Тоді, коли для написання тестів потрібно більше часу, ніж код, тоді ви здаєтеся.

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

У нас є великий проект, який здійснили 20 досвідчених розробників. Це може бути ідеальним середовищем для впровадження тестування / інтеграції модулів.

Чому це не працює для нас? Як ви змусили це працювати у вашій компанії?


14
Який стек технологій?
Флоріан Маргаїн

7
WebForms майже неможливо правильно встановити. Ви можете використовувати шаблон MVP (Model / View / Presenter) для переміщення логіки презентації на перевіряється компонент.
Піт

12
@MasonWheeler: В обох випадках ви створили приголомшливий аргумент, який спростовує приміщення, які не були прийняті в першу чергу: тобто існують одиничні тести для підтвердження правильності.
Стівен Еверс

10
@ MasonWheeler- Використовуючи цей аргумент, ви не повинні намагатися будь-якої QA ніколи, тому що ви ніколи не доведете, що немає помилок. Це навіть не мета. Хороша автоматизована стратегія тестування користувальницького інтерфейсу та підрозділу - це просто звільнити QA від тестування на підключенні та дати їм змогу сконцентруватися на дослідницьких тестах.
Олексій

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

Відповіді:


89

Найскладнішою частиною тестування одиниць є отримання дисципліни, щоб написати тести спочатку / рано. Більшість розробників звикли просто занурюватися в код. Це також сповільнює процес розробки на початку, коли ви намагаєтесь зрозуміти, як написати тест на код. Однак, коли ви краще вдосконалюєтесь, це прискорюється. А через письмові тести початкова якість коду починає вище.

Починаючи, спробуйте просто написати тести. Не хвилюйтеся настільки сильно знущаючись над / заглушуючи речі. Тримайте тести просто. Тести є кодовими та можуть / мають бути відновлені. Хоча за цими напрямками, якщо щось важко перевірити, це також може бути дизайн. TDD дійсно сприяє використанню більшості моделей дизайну (на мій досвід, особливо заводський зразок).

Переконайтесь, що тести отримують рівень наочності. Інтегруйте їх у процес випуску, під час перегляду коду запитайте про них. Будь-які виявлені помилки повинні пройти тест. Ці речі там, де світить TDD.

Ось пара ресурсів, які я вважаю корисними:

http://misko.hevery.com/attachments/Guide-Writing%20Testable%20Code.pdf

http://www.agitar.com/downloads/TheWayOfTestivus.pdf

Редагувати:

Одне, що потрібно пам’ятати, коли ви пишете тести. Ви не намагаєтесь нічого конкретизувати щодо реалізації коду, лише про поведінку. Коли ви пишете код, ви постійно його тестуєте. Спроба виконати його за допомогою налагоджень і так далі. Написання тестів формалізує це та надає запис про тести, які у вас є. Таким чином ви можете впевнено перевірити свою функціональність, не випадково пропустивши тестовий випадок, який ви запам'ятали на півдорозі процесу розробки.


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

Також уникайте антидіаграми TDD .
Gary Rowe

4
Misko Hevery також має кілька чудових відео на youtube про написання тестового коду, який я вважав безцінним. youtube.com/watch?v=acjvKJiOvXw
Despertar

"Переконайтесь, що тести отримують рівень наочності" - це критично важливо для успіху. Якщо ніхто не може побачити, як виконують ваші тести, вони не побачать значення. Тести повинні запускатися при реєстрації автоматично, як частина постійної інтеграції, а потім повідомлятися. Я працюю в Tesults ( tesults.com ), і причиною її існування є велика видимість, яку забезпечує тест на вплив.
Майстерність M2

77

Багато в чому я згоден з вашою командою.

  1. Більшість одиничних тестів мають сумнівні значення. Оскільки переважна більшість тестів здається занадто простим.

  2. Набагато складніше написати хороший тестовий код, ніж просто робочий код. Існує великий відсоток спільноти розробників, який вірить у те, щоб просто запрацювати, а не від якості / дизайну. І ще більший відсоток, хто навіть не знає, що таке код якості.

  3. Написання одиничного тестового коду може зайняти набагато більше часу, ніж власне сам код.

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

  5. Технічне обслуговування тестів займає занадто багато часу. Невеликі зміни можуть мати великі наслідки пульсації. Основна мета автоматизованих тестових одиниць - з’ясувати, чи зміни порушили код. Однак 99% часу, що закінчується розбиттям, - це тести, а не код.

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

Деякі з перерахованих вище можна певною мірою полегшити, не переходячи за підручником одиничного тестування.

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

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

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


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

5
@Izkata інший підхід, який я бачив успішно, - це написати відносно невелику кількість тестів високого рівня, що викликають Frobinate()метод верхнього рівня (замість десятків менших методів, що називаються під ним) після того, як система була перевірена іншими засобами для обслуговування як тест на дим, що жодна з змін нижчого рівня нічого не порушила. Як правило, ці тести використовували ті самі дані, які були частиною фунта на наданих тестах на клавіатурі користувачів, щоб клієнт міг бачити, що система робить те, що хоче. Після цього інструменти для покриття коду можуть ідентифікувати, де крайові регістри ще не висвітлені.
Dan Neely

3
Я не сказав "повномасштабне автоматизоване тестування", я сказав "повномасштабне автоматизоване тестування UNIT". Велика різниця. Я використовував автоматичне тестування на рівні модулів принаймні протягом десятиліття. Тестування одиниць проводиться на рівні класу. Я вважаю, що я отримую більше грошей на долар під час тестування занять, які повинні працювати разом з іншими, а не як люди. Однак навіть там ми все ще використовуємо прагматичний підхід і вибірково вибираємо, що / де писати автоматизовані тести.
Данк

2
Без хорошого покриття тестовими одиницями, як зробити рефактор? Або без рефакторингу, як запобігти поступовому переродженню коду до незмінності?
кевін клайн

1
@Leonardo Вони цього не зробили - вони надто боялися щось змінити. Або вони заощадили всю цю технічну заборгованість і відклали через кілька тижнів / місяців, щоб вирішити її одним куском.
GraemeF

33

Основним винуватцем є глузування / заглушення Бази даних або що-небудь не просте.

І є ваша проблема.

Кожен зауважує, як інтегрувати тестування одиниць у своє оточення. Як змусити людей зробити це достатньо, щоб вони бачили практичну цінність і воно «прилипало». Але якщо це дуже боляче робити та / або не приносить користі, воно не пристане.

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

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


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

8
@fennec - одиничні тести не існують для тестування бази даних, вони там, щоб перевірити код, який залежить від значень бази даних для функціонування.
Теластин

3
Все добре і добре, поки ви не тестуєте код, який маніпулює базою даних. : P, що для багатьох людей - це багато їхнього коду.

4
@fennec - Це трохи складніше, ніж мертве, просто заглушити інтерфейс, щоб переконатися, що ваші записи пишуть правильний об’єкт. Це стає важко лише тоді, коли ваші заняття намагаються надсилати SQL безпосередньо вниз по вашому інтерфейсу (читайте: у вас жахливий дизайн).
Теластин

5
@Telastyn, можливо, я нерозумію, але в кінцевому підсумку якийсь клас повинен збитися і забруднитись, написати SQL або написати файл або надіслати дані або інтерфейс з GPU. Більшість абстракцій мають неминучі витоки на деякому рівні; вони просто прагматичні і не обов'язково жахливі.
Черга учень

21

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

Щоб добре провести автоматичне тестування, вам потрібен чоловік, який є ресурсом і євангелістом, і хто має придбати у керівників вищого рівня.

Ставіться до розробки автоматизованих тестів, як до будь-якого іншого спритного проекту. Регулярно виробляйте завершені тести.

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

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


17
"Зніміть трохи солодкого, низько висячого фрукта, і ви зможете продати процес.": Я думаю, що вони вже дійшли до цього етапу (вони бачили потенційні переваги в одиничних тестах), і саме тому вони були впевнені, що це дають спробувати. Проблема полягає в тому, як масштабувати плоди з низьким рівнем звисання, щоб систематично проводити тестування. Єдиний проект, над яким я працював, в якому систематично використовувалися одиничні тести, мав більше одиничного коду тестування, ніж фактичний код продукту. Якщо команда не готова витратити більше часу на тестування одиниць кодування, ніж фактичний код програми, підхід IMO, ймовірно, не спрацює.
Джорджіо

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

1
@SkipHuffman ваш коментар слід додати як редагування до поточної відповіді.
radu florescu

15

Дотримуйтесь цих основних правил. Тести:

  1. треба регулярно бігати! Ви можете проводити тести на кожному складі, перед / після кожної реєстрації або просто кожного ранку. Автоматичне спрацьовування вкрай бажано вручну спрацьовувати. Тому що, якщо теоретично, ви можете змусити усіх у команді нести відповідальність за те, щоб вони виконували тести, якщо це не автоматизовано, це, мабуть, не відбувається досить часто! І якщо ви не запускаєте тести досить часто, вони обидва знаходять помилки занадто пізно, заохочуючи багато зламаних тестів, що призводить до пункту 2:

  2. Ви все ще досягнете успіху лише в тому випадку, якщо ті тести, які зараз регулярно проводяться, не заважають . Під якими ми маємо на увазі тести:

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

    б. не повинні бути ненадійними. Уникайте багатопотокових тестів, якщо це можливо. Застосовуйте інженерні практики до своїх тестів так само, як і інший код: зокрема - перегляньте свої тести!

    c. Виправити та підтримувати не повинно бути складніше, ніж перевірений фактичний код. Ваша швидкість кодування дійсно вийде, якщо невелика зміна однієї рядка на вашу кодову базу вимагає виправити 10 різних тестів.

І, нарешті, правило № 3. Тести повинні не тільки не забезпечувати негативного значення, як у правилі 2, вони повинні забезпечувати позитивне значення. Тести ...

  1. має бути на самому справі говорить вам те , що ви дбаєте про те, коли вони зазнають невдачі! (Жодних тестів із незрозумілими повідомленнями про помилки або просто поданням смішних скарг на кшталт "ви забули запустити тест на машині Windows 2008", будь ласка!).

Один популярний спосіб порушити правило №3 - перевірити неправильну річ . Це буває через те, що тест занадто великий або занадто зосереджений. Але зазвичай це пов'язано з не тестуванням чогось, про який потурбується клієнт, а також з тестуванням нерелевантних деталей реалізації. (Іноді тестування деталей впровадження також є ефективним тестом. ІМО, як правило, вирішує, який саме.)

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

  • якщо випробування не є стійкими, вони втрачають силу і тим самим стають витраченими витратами
  • якщо тести не є стійкими, ви припиняєте робити тести, і ваша команда перестає покращуватися в тестуванні! І, заключний пункт:

Тестування насправді важке. Ви повинні очікувати, що тести вашої команди в основному будуть смоктати, коли ви почнете писати тести . Не відволікайтеся. Не викидайте старі тести, коли ви помітите, що вони смокчуть і є нестійкими.


12

1. Це справді працює?

Так, це - якщо це зроблено правильно. Справа в тому, що тестерам потрібно налаштувати та розширити свої автоматизовані сценарії після того, як інженери впровадять нові функції.

2. Ніхто насправді не досвідчений і не знає, як правильно робити автоматичне тестування.

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

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

Я б не назвав їх "хорошими досвідченими розробниками", якщо вони відмовляться робити тести на одиницю. Існує багато чудових статей про позитивні переваги тестування (як тестування на одиницю, так і інтеграцію), і наприкінці це зводиться до того, скільки коштує помилка вашої компанії . Наприклад, я працюю в компанії, де важлива якість, тому тести на інтеграцію та інтеграцію неминучі. Ви можете легко знайти безліч статей, в яких говориться, що лише одиничні тести зменшують кількість помилок на 30%! (Насправді вона знаходиться в межах 20-90%, в середньому 30%, але це все ще багато.)

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


20
Я мушу зазначити, що практично ВСЕ працює «Якщо робиться правильно». Однак це не дуже допомагає всім, але дуже крихітній меншині будь-якого населення. Щоб процес дійсно міг стверджувати, що він працює, він також повинен працювати, коли це робиться "на зразок".
Данк

11
Я зазначу, що надмірно узагальнена ситуація кожного у вашій власності (тобто я б не називав їх "хорошими досвідченими розробниками" .. питання якості) не лише свідчить про вашу недостатню широту досвіду, але не є дуже продуктивним. Кожна галузь має своє визначення поняття "працює"; і тестування на ступінь, яке потрібно провести на рівні одиниці, інтеграції та системності. Багато "виключно хороших" розробників зрозуміли, що тестові одиниці забезпечують незначний удар за долар порівняно з тестуванням автоматизованої інтеграції. Вони також розуміють, що це, ймовірно, стосується лише їх конкретної галузі.
Данк

11
"Я б не назвав їх" хорошими досвідченими розробниками ", якщо вони відмовляться робити тести на одиницю." Це лише помилка Шотландія. Програмна індустрія десятиліттями ладнала без одиничного тестування, і більшість цієї галузі продовжує обходитися без неї і сьогодні. Це може бути хорошою ідеєю, але вона просто не є обов'язковою.
Noah Yetter

1
"не витрачати час на одиничні тести": я б перефразував це як "не витрачати час на марні одиничні тести". Сліпо тестування все може призвести до величезної трати часу.
Джорджіо

1
@Dunk Я дуже ненавиджу цілий феномен TDD - усе, але я не можу погодитися з вашим першим твердженням. Ти або робиш щось правильно, або ні. Ви можете добре зробити один одиничний тест і, можливо, побачити його достоїнства, але ви ніколи не побачите достоїнств будь-якої речі, зробленої на півроку.
Ерік Реппен

10

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

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

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

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

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

Я сам пережив це, і тепер із задоволенням працюю в компанії, яка успішно впровадила автоматизовані тести. Я б міг написати набагато більше про інші фактори, але я вважаю, що звички кодування та тестування одиниць є найбільш важливими. На щастя, є й інші, які мають більший досвід, ніж я, і наповнюють книги своїм ноу-хау. Однією з таких книг є Brownfield Application Development в .NET, яку я дійсно можу порекомендувати, оскільки ви використовуєте стек технологій Microsoft.


Introduce automated tests on the unit test level and build automated integration tests on a solid foundation of unit tests.+1
c69

10

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

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

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

В одній компанії, над якою я працював, написання одиничних тестів було обов'язковою частиною надання функції. Новий код не був прийнятий, якщо тест одиниці не був частиною фіксації чи новою функцією - були короткі огляди коду для кожної "задачі", яку розробник дав. Можливо, варто застосувати подібну політику на своєму робочому місці.


8

Цікаво, що бізнес є більш протестованим, ніж розробники! Мені здається, що найбільшим завданням буде подолати опір ваших розробників до змін; їм потрібно переосмислити своє розуміння своєї роботи, щоб включити блок тестування.

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

@SkipHuffman торкнувся цього, але я це скажу прямо. Деякі речі набагато більше підходять до автоматизованого тестування, ніж інші. Для першого проходу я б НЕ перевіряв базу даних або інтерфейс користувача. Введення з бази даних може бути надзвичайно складно налаштувати та знищити. Вихідні тести користувальницького інтерфейсу, як правило, швидко порушуються через вигляд і відчуття змін, які абсолютно не мають значення для ваших тестів.

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

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

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


6
"подолайте опір вашим розробникам проти змін": не кожен опір є без підстав, і не слід уникати чесної дискусії, використовуючи аргумент "опір змін".
Джорджіо

7

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

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

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

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

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

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

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

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


підказка: поставте TL; DR: вгорі - мені довелося прочитати всю вашу публікацію, просто щоб дістатися до неї! (яка
ніби

4
  • Чи є у вашій компанії великий досвід роботи з автоматизованим тестуванням?

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

  • Чи є у когось владна влада? Чи здатні вони вимагати змін?

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

  • Ви розробляєте інструменти та процеси, щоб полегшити автоматизоване тестування та інтегрувати його в цикл розробки?

Розробники ледачі. Вам потрібно зробити те, що ви хочете, щоб їх було легко зробити, а те, чого ви не хочете, зробити їх складніше. Ви повинні переконатися, що бібліотеки тестування полегшують виконання завдань, пов’язаних із встановленням тесту та викриттям, особливо налаштуваннями, пов'язаними з оточенням, як-от тестові бази даних тощо. (Змія з базою даних обговорюються в деяких із цих коментарів, але слід використовувати їх обережно. Справжню базу даних слід легко розкручувати і дозволяє перевірити взаємодію компонентів та життєвих циклів процесів, часто важливіших та ефективніших, ніж тестування одиниць. індивідуального доступу до даних.)

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


Я не думаю, що це справедливо, якщо говорити, що розробники ледачі. Можливо, це так у вашому досвіді, але, безумовно, це не універсальна істина.
Сем

4

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

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

Ви хочете цього уникнути.

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

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

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

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


1
Мені подобається код, який я можу прочитати краще, ніж код, який хтось вважав за потрібне перевірити аж до таких деталей.
Ерік Реппен

1
Чудові зелені кліщі, які я відчуваю, - це проблема - це робить тестування на якусь гру.
gbjbaanb

2

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

Я пропоную спробувати додати тести, коли ви додаєте функції / виправляєте помилки. Виправлення помилок є найпростішим. Напишіть тест, який не вдався через вашу помилку, а потім виправте помилку. У той же час ви, мабуть, опинитесь простішими простими тестами, які пройдете. Звичайно, ви дійсно хочете використовувати для цього невеликий і легко перевірений біт коду.

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

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


2

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

У мене виникла ситуація, коли мені вдалося використовувати тестування TDD та модулів для головної функції. Після закінчення фази розвитку протягом 5 років не було зареєстровано жодної помилки. Коли було запропоновано нове - та ризиковане - удосконалення, я зміг його реалізувати і зафіксувати всі регресії в одиничних тестах.


1

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

Часто розробники знаходяться під тиском "зробити все", тому доказ того, що блок коду працює, є достатнім доказом для замовника. Це майже завжди стосується консалтингової компанії та управління якістю, керованої людиною: якщо клієнту не потрібні тестування одиниць і конідери, достатньо живої демонстрації, то клієнт абсолютно не вдається, оскільки він підписує схвалення коду, який може приховати несправності.

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

Але є виняток

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

Натомість, якщо розробник відповідає за розробку високоавтоматизованого модуля даних з великим обсягом даних, він швидше буде писати ретельні одиничні тести та подавати їх у тестові групи. Це тому, що заповнення великої корисної навантаження XML даними, перетвореними із зовнішнього джерела даних (знущається чи ні), не є людиною, схильною до роботи. Деякі розробники тестів зрештою побудують крихітний і кумедний передній край для цього конкретного виду тестів. Коли я працював над магістерською дисертацією, я працював на шині ведення журналу, яка обробляла 6000+ повідомлень системного журналу в секунду, і мені доводилося вимірювати втрати та пошкодження пакетів: я, природно, писав одиничні та стрес-тести майже для всіх компонентів, особливо для парсера Syslog.

Для того щоб зробити розробників більш схильними до тестування

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

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


1

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

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

  • вам потрібно забезпечити, щоб тести продовжували працювати.
  • Вам потрібно переконатися, що тести не будуть видалені, оскільки вони не виконувалися
  • ваші тестові показники повинні показувати, що ви виконували в останній збірці та в цій збірці. Щоб кількість ваших тестових випадків не зменшувалася.
  • тестові випадки потрібно переглядати так само, як розробку для того, щоб люди не заплутувались, начебто розбиваючи 1 тест на 2, щоб збільшити кількість (кілька разів тестування переноситься на аутсорсинг, тому це відстеження важливо)
  • набагато більше "здорового" спілкування між розробником та тестом є важливим
  • тримайте non-functionalтести окремо, і не сподівайтесь, що вони будуть виконуватись щодня, для їх оновлення потрібен час, і це добре. Але не здавайся, переконайся, що вони підтримуються.

Ви не вдається через ці причини

  • ваші інженери-випробувачі - інженери з ручного тестування, що не мають навичок аналітики. вони не знають різницю між ifі в whileпетлі. Оскільки, відверто кажучи, жоден курс не вчить автоматизованому тестуванню, вони викладають лише ручне тестування.
  • ваші інженери-випробувачі надто зайняті ручним тестуванням ваших збірок та реєстрацією помилок, щоб вони втратили сліди автоматизованих тестів
  • ваші менеджери тестів не дбають про показники з автоматизованих тестів, лише тому, що вони показують недійсні дані (коли проект починається), і вони не докладають зусиль чи пріоритету в щоденних складаннях та нарад, щоб підкреслити, як важливо автоматизувати роботу та працювати.
  • ви вирішили автоматизувати тести для мобільних додатків, які мають дуже короткий термін зберігання. до того часу, як ви пишете, стабілізуйте автоматизований тестовий набір, щоб змінилися ваші вимоги до програми, замість цього слід зосередитись на тестуванні веб-служб, які запускають вашу програму
  • Ви не розумієте, що автоматична тестова команда слідує тією ж віхою - це команда розробників, функція завершена, повний код, блокування коду та заморожування коду.
  • Ви не розрізняєте ручне тестування людей та автоматизоване тестування людей.
  • їм обом виплачують однакову зарплату та звітують перед тим самим менеджером, в ідеалі вони повинні звітувати перед менеджером розробників, і їхня зарплата повинна відповідати зарплаті розвитку.
  • ви насправді думаєте і вважаєте, що джуніту недостатньо для розробки автоматизованих тестів :).

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


Що стосується одиничного та інтеграційного тестування, люди, які повинні писати тести, - це розробники, а не окремі "тестові інженери". (Як написано в запитанні, QA, тобто тестові інженери, фактично вже користуються автоматизованими тестами інтерфейсу користувача.)
Paŭlo Ebermann

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