Одне з питань автоматизованого тестування полягає в тому, що воно вимагає, щоб ви написали код, щоб бути перевіреним. Це само по собі не погано (адже насправді це добре, тому що це відлякує багато практик, яких, як правило, слід уникати), але якщо ви намагаєтесь застосувати тестування одиниць до існуючого коду, швидше за все, це не так були написані перевіреним способом.
Такі речі, як одиночні кнопки, статичні методи, реєстри, локатори обслуговування тощо, вводять залежності, які дуже важко подолати. Порушення Закону Деметра означають, що занадто багато частин вашої кодової бази знають занадто багато про те, як функціонують інші частини вашої кодової бази, вводячи подальші приховані залежності, які важко розбити. Усі ці речі ускладнюють ізоляцію модуля від решти кодової бази, і якщо ви не можете перевірити свої модулі в ізоляції, то одиничні тести втрачають велику цінність. Якщо тест виявляється невдалим, це через несправність у тестованому апараті або через помилку в одній із його залежностей, або, можливо, це тому, що дані, які витягуються через залежне джерело даних, - це не те, чого очікував автор тесту ? Якщо можеш'
Більшість кодових баз, які я бачив, не були побудовані з одиничним тестуванням на увазі, як правило, нестабільно, оскільки кодери, як правило, зосереджуються на тому, щоб код працював так, як вони очікували, а не робити роботу, необхідну для того, щоб зв'язок був вільним і явні залежності . Код, написаний на увазі одиничного тестування, має тенденцію виглядати зовсім інакше.
Багато людей наївно підходять до тестування одиниць, коли вони починають це робити вперше, вони думають, що можуть просто написати безліч тестів для існуючої бази коду, і все буде добре, але це ніколи не виходить із-за цього вищезазначені питання. Вони починають виявляти, що їм потрібно невпорядковувати кількість налаштувань в одиничних тестах, щоб змусити їх працювати взагалі, а результати часто сумнівні, оскільки відсутність ізоляції в коді означає, що ви не можете відстежити, що спричинило збій тесту. Вони також, як правило, починають намагатися писати "розумні" тести, які демонструють деякий дуже абстрактний аспект того, як система повинна працювати. Це, як правило, не вдається, тому що "розумний" блок тесту є потенційним джерелом помилок сам по собі. Чи вийшов тест через помилку в тестованому модулі, чи через помилку в тесті? Тест повинен бути настільки вибагливим простим, що очевидно немає можливості, що в ньому може ховатися помилка. Насправді найкращі тести - це рідко довжина більше 2 рядків, перший рядок інструктує досліджуваний пристрій щось робити, другий стверджуючи, що те, що він робив, було те, що очікувалося.
Якщо ваша команда серйозно ставиться до прийняття тестування, тоді було б нерозумно починати з існуючого проекту. Існуючі проекти вашої команди, ймовірно, не піддаються ретельному виконанню без капітального рефакторингу. Вам краще використовувати новий проект як основу для вивчення тестування одиниць, оскільки у вас є чистий аркуш роботи. Ви можете розробити нову базу коду, щоб сприяти введенню залежності для одиночних клавіш, реєстрів та інших подібних прихованих залежностей, ви можете записати її залежно від інтерфейсів замість реалізацій тощо. Ви також можете (і повинні) писати тести поряд із тестуваним кодом, оскільки написання тестів після цього призводить до одиничних тестів, які гарантують, що перевірений модуль робить те, що, на вашу думку, може бути призначено, а не те, що тестує те, що він робить що кажуть, що це має робити.
Після того, як ви отримаєте певну впевненість у тестуванні одиниць, ваша команда, ймовірно, почне усвідомлювати недоліки в існуючому коді, які будуть перешкодами для одиничних тестів. Це коли ви можете почати працювати над рефактором існуючого коду, щоб зробити його більш тестируемым. Не будьте амбітними і намагайтеся зробити це все одразу або намагайтеся замінити систему, яка працює на абсолютно нову, просто почніть з пошуку бітів бази коду, які можна легко перевірити (тих, у яких немає будь-яких залежностей або там, де залежності очевидні) і пишіть для них тести. Я знаю, що я сказав, що написання тесту поряд із кодом є переважним після написання тестів після, але навіть тест, написаний пізніше, все ще має значення як вихідний. Пишіть тести так, ніби ви нічого не знаєте про те, як працює клас, крім того, що його технічні характеристики кажуть, що він повинен робити. Якщо ви запускаєте тести і отримуєте збої, то або характеристики, або реалізація неправильна. Двічі перевірте обидва, щоб визначити, що неправильно, і оновіть або тест, або код відповідно.
Після того, як ви зібрали низько висячий плід, починається ваша справжня робота. Потрібно розпочати пошук прихованих залежностей у вашій кодовій базі та виправити їх по одній. На даний момент не надмірно амбіційне, просто дотримуйтесь виконання одного модуля за один раз або навіть лише одного випуску в одному модулі, поки перешкоди для тестування не будуть усунені, і ви можете перейти до наступного біту.
TL: DR: Більшість людей вважають, що тестування є простим, і ви можете легко вдосконалити тести до наявного коду. Обидва ці припущення помилкові. Якщо ви взялися за проект, щоб пройти тестування у своїх проектах, маючи на увазі обидва ці факти, ви швидше досягнете успіху.