28.01.2024
10 хвилин читання

Чим корисні моки в тестуванні ПЗ?

Сьогодні з компанією FoxmindED розглядаємо, що таке моки і в яких випадках вони використовуються…

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

Вони можуть використовуватися в різних ситуаціях, зокрема:

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

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

Навчальний центр Foxminded запрошує тебе на курс менторингу QA Automation!”

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

Типи моків і стабів

Існує два основних типи моків:

  • Моки (англ. mock object) – це повнофункціональні тестові об’єкти, які дають змогу контролювати виклик методів, передачу аргументів і перевірку очікуваної поведінки.
  • Стаби (англ. stub object) – це спрощені моки, які повертають заздалегідь визначені значення на певні вхідні дані.

Розглянемо основні відмінності:

Наведемо приклади і сценарії використання моків і стабів у тестуванні:

  • Моки

Приклад 1. Тестування взаємодії із зовнішнім API

Сценарій: клас, що надсилає HTTP-запити до зовнішнього API. Створення мока для емуляції відповідей від API в різних сценаріях, таких як успішна відповідь, помилка сервера і відсутність з’єднання.

Приклад 2. Тестування взаємодії з базою даних

Сценарій: функція, що виконує SQL-запити до бази даних. Створення мока для емуляції відповідей від бази даних і перевірка коректності обробки даних.

  • Стаби

Приклад 1. Тестування обробки помилок під час роботи з файловою системою

Сценарій: модуль, що читає дані з файлу. Створення стаба для емуляції ситуації, коли файл не знайдено.

Приклад 2. Тестування роботи із зовнішнім пристроєм (наприклад, датчиком)

Сценарій: модуль, що зчитує дані з датчика. Створення стаба для емуляції різних значень сенсора.

Переваги та недоліки мок-тестування

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

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

Створення та використання

Створення моків і стабів може бути реалізовано різними способами: вручну або з використанням спеціальних інструментів чи бібліотек.

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

Моки і стаби також можна створювати з використанням спеціальних інструментів і бібліотек, таких як Mockito, Moq, JMockit, NSubstitute, Sinon.

Після створення мока або стаба його необхідно інтегрувати в тест. Для цього необхідно створити екземпляр мок-об’єкта або стаба-об’єкта і передати його як аргумент тестованої функції або методу.

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

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

Інструменти та бібліотеки 

Перелічимо популярні інструменти та бібліотеки для створення моків:

  • Mockito (Java): потужний інструмент для створення моків і стабів у мові Java. Підтримує різні фреймворки.
  • Moq (C#): бібліотека для мок-тестування в середовищі .NET. Має простий синтаксис і багатий функціонал.
  • JMockit (Java): інструмент із широкими можливостями, що дає змогу створювати моки, стаби і навіть модифікувати код на льоту.
  • NSubstitute (C#): легка та інтуїтивно зрозуміла бібліотека для мок-тестування в мові C#.
  • Sinon (JavaScript): бібліотека для створення моків і стабів у JavaScript. Забезпечує багаті можливості для тестування веб-додатків.

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

Mock Testing

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

Найкращі практики 

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

  • Перед створенням моків чітко визначте цілі тестування.
  • Уникайте зайвої деталізації у створенні моків, фокусуйтеся на істотних аспектах.
  • Підтримуйте актуальність моків зі змінами в коді.

Як уникнути поширених помилок?

  • Регулярно оновлюйте моки відповідно до змін у коді, запобігаючи їхньому застаріванню.
  • Перевіряйте поведінку моків у крайніх сценаріях для виявлення та запобігання потенційним проблемам.
  • Додавайте пояснення до моків і стабів для поліпшення розуміння їхнього призначення та обмежень.
  • Впроваджуйте логування для відстеження взаємодії тестованої системи з моками.
Підпишіться на наш Ютуб-канал! Корисні відео для програмістів чекають на вас! YouTube
Оберіть свій курс програмування! Шлях до кар’єри програміста починається тут! Подивитись

Приклади з реальної практики

Приклад 1: Тестування компонента з базою даних

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

Приклад 2: Тестування залежності від нереалізованого компонента

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

Приклад 3: Тестування в різних умовах

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

Висновок

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

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

FAQ
Що таке моки в контексті програмування?

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

Навіщо використовують моки?

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

Як моки впливають на надійність тестів?

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

Чи можуть моки бути використані для тестування API?

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

Як створюються моки?

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

Чи можуть моки використовуватися в інтеграційному тестуванні?

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

А ти використовував моки в тестуванні? Поділися досвідом у коментарях нижче!

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

Ваш імейл не буде опубліковано. Обов'язкові поля відзначені *

Зберегти моє ім'я, імейл та адресу сайту у цьому браузері для майбутніх коментарів