Unit Testing: як тестувати кожен модуль та запускатися швидше

14 травня 2025

4 хв.

Unit Testing: як тестувати кожен модуль та запускатися швидше

Про що:

Як тестувати код так, щоб не упустити жодної помилки? Як автоматизувати процеси та зменшити витрати? У матеріалі ми відповідаємо на ці питання та ділимося досвідом розробника Kyivstar.Tech.

Зміст

Модульне тестування: що, як, для чого

Хто пише Unit Testing та як це зробити

Недоліки модульного тестування

Unit Testing на практиці: досвід Kyivstar.Tech

Модульне тестування: що, як, для чого

Unit Testing (юніт тест, модульне тестування) — це вид тестів програмного забезпечення, під час якого невеликі частини коду перевіряють окремо.

Термінологія модульного тестування:

  • Юніт або модуль (Unit) — найменша частина програми, яку можна перевірити. Це може бути функція або група функцій, клас або метод;
  • Тестовий випадок (Test Case) — вхідні дані, умови та очікувані результати тесту;
  • Тестовий набір (Test Suite)  — група тестових випадків, які разом тестують групу юнітів;
  • Твердження або асертація (Assertion) — перевірка в тесті, чи однакові фактичний та очікуваний результати;
  • Тестовий фреймворк — інструмент, який дозволяє створювати та запускати тести вибраною мовою програмування;
  • Мокування (Mocking) — процес імітації зовнішньої залежності, яка використовується, щоб ізолювати юніт (наприклад, створюється фейкова база даних замість реальної).

Історія модульного тестування сягає понад 70 років — прабатьком фреймворків для Unit Testing вважається SUnit, створений Кентом Беком та описаний ним у книзі «Мистецтво тестування програмного забезпечення».

Модульні тести допомагають:

  • Виявити помилки та випадкові зміни в коді до запуску системи;
  • Виправити їх на початкових етапах та уникнути зайвих витрат;
  • Прискорити розробку — провести автоматизований юніт тест швидше та легше, ніж ручний;
  • Робити релізи частіше — завдяки регулярним тестам зменшуються ризики;
  • Документувати роботу системи — тести показують, як мають працювати окремі ділянки коду, які вхідні дані очікуються.

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

Хто пише Unit Testing та як це зробити

Unit Testing пишуть розробники програмного забезпечення — ті, які працюють над кодом. У більшості випадків вони роблять це паралельно з процесом написання основного коду, іноді (як в підході Test Driven Development) — перед ним.

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

Залежно від мови програмування, використовують різні фреймворки:

  • Python: Pytest, Unittest (PyUnit);
  • Java: JUnit;
  • JavaScript: Jest, Mocha, Jasmine;
  • .NET: NUnit, xUnit.net, MSTest.

Якими мають бути модульні тести:

  • Короткими та читабельними — щоб розробники з інших команд могли легко зрозуміти, для чого призначений тест та що пішло не так, якщо він не вдався;

Порада: пишіть суть у назвах тестів. 

Наприклад: Номер тесту_Що тестується_Який має бути результат 

Поганий приклад: test1_01012025

  • Тестувати лише одну функцію/властивість за раз — іноді здається, що можна об’єднати кілька тестових випадків, але в разі помилки ви не зрозумієте, де вона;

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

  • Незалежними один від одного, щоб їх можна було проводити паралельно у будь-якому порядку;
  • Повністю автоматизованими, аби їх можна було запускати якомога частіше;
  • Інтегрованими в конвеєри CI/CD.

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

Щоб розгорнути IT-інфраструктуру з будь-якої точки світу швидко та безпечно, використовуйте хмарні сервіси Microsoft Azure. Адмініструйте вебдодатки, бази даних, віртуальні мережі та сервери, сховища та окремі проєкти. Зберігайте та обробляйте дані у понад 100 дата-центрах у 60+ країнах світу. Київстар є офіційним стратегічним партнером Microsoft в Україні.

Microsoft Azure від Київстар

Хмари та зберігання даних

Microsoft Azure від Київстар

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

Недоліки модульного тестування

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

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

Unit Testing на практиці: досвід Kyivstar.Tech

Сергій Щербак

Розповідає Сергій Щербак,

Java Developer вебдодатка JET., Kyivstar.Tech:

Unit тестування — основа розробки у сучасному світі. Будь-які продуктові рішення постійно змінюються, їхню якість треба перевіряти. Найшвидший та найпростіший спосіб переконатися, що код працює, як треба — написати юніт тест.

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

Ми використовуємо різні методики для того, щоб покращити роботу з тестами. Передусім тест має бути простим та підтримувати певну структуру (arrange, act, assert). Якщо текст складний, варто переглянути дизайн та функціональність (можливо, вона порушує принципи SOLID). Також важливо використовувати фреймворки (особливо, коли мова йде про Mock, Spy, Stub, Captor), параметризовані тести, патерн Mother. 

Для дизайну продукту буде корисним написати тести перед тим, як буде написаний код (Test Driven Development) — це дозволить уникнути прикрих ситуацій, коли будуть допущені помилки дизайну, які не дозволять потім написати тест на функціонал.

Unit тестування — основа розробки у сучасному світі. Будь-які продуктові рішення постійно змінюються, їхню якість треба перевіряти. Найшвидший та найпростіший спосіб переконатися, що код працює, як треба — написати юніт тест.

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

Ми використовуємо різні методики для того, щоб покращити роботу з тестами. Передусім тест має бути простим та підтримувати певну структуру (arrange, act, assert). Якщо текст складний, варто переглянути дизайн та функціональність (можливо, вона порушує принципи SOLID). Також важливо використовувати фреймворки (особливо, коли мова йде про Mock, Spy, Stub, Captor), параметризовані тести, патерн Mother. 

Для дизайну продукту буде корисним написати тести перед тим, як буде написаний код (Test Driven Development) — це дозволить уникнути прикрих ситуацій, коли будуть допущені помилки дизайну, які не дозволять потім написати тест на функціонал.

Додайте коментар

Усі коментарі публікуються після модерації. Будь ласка, пишіть українською, без спаму та нецензурних слів.

Схожі статті