🚀 Розуміння Тестових Дублікатів: Мок, Шпигун, Підставка та Фейк 🤖

pic

Коли мова заходить про тестування в розробці програмного забезпечення, ви, ймовірно, чули терміни як Моки, Шпигуни, Шаблони та Фейки. Це все Тестові подвійники (Test Doubles), тобто об'єкти, які імітують поведінку реальних об'єктів у ваших тестах, допомагаючи ізолювати функціональність, контролювати сценарії тестування та робити тести більш передбачуваними.

Але що ж насправді ці тестові подвійники, і чим вони відрізняються?

Давайте розберемось! 🧑‍💻

1️⃣ Мок — Імітація та перевірка взаємодій

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

Приклад з Jest (Node.js):

const fetchData = (api, url) => api.get(url);
test('fetchData викликає api.get з правильним URL', () => {  
 const apiMock = { get: jest.fn() };  
 fetchData(apiMock, 'https://api.example.com'); 
 expect(apiMock.get).toHaveBeenCalledWith('https://api.example.com');  
});

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

2️⃣ Шпигун — Запис і спостереження за поведінкою

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

Приклад з Jest:

const myFunction = (a, b) => a + b;
test('myFunction викликається з правильними аргументами', () => {  
 const spy = jest.spyOn(global, 'myFunction');  
 myFunction(2, 3); 
 expect(spy).toHaveBeenCalledWith(2, 3);  
 spy.mockRestore();  
});

🛠 Використання: Відстеження викликів існуючих функцій без зміни їх реалізації.

3️⃣ Шаблон — Контроль поведінки методу

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

Приклад з Jest:

const fetchData = (url) => {  
 return fetch(url).then(res => res.json());  
};
test('fetchData повертає підроблені дані', () => {  
 const stub = jest.fn().mockResolvedValue({ data: 'Mocked Data' });  
 global.fetch = stub; 
 fetchData('https://api.example.com').then(data => {  
 expect(data).toEqual({ data: 'Mocked Data' });  
 });  
});

🛠 Використання: Ізоляція вашого коду від зовнішніх залежностей (як бази даних чи API) для більш контрольованих та надійних тестів.

4️⃣ Фейк — Імітована версія складної функціональності

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

Чому використовувати тестові подвійники? 🤔

  • Ізоляція: Ви тестуєте одну частину функціональності без залежності від інших компонентів (наприклад, зовнішніх сервісів, API, баз даних).
  • Швидкість: Тести можуть виконуватись швидше, коли залежності замінені шаблонами або моками.
  • Надійність: Це робить тести більш передбачуваними і усуває зовнішні фактори, які можуть спричинити нестабільні тести.

🎯 Підсумок:

  • Моки: Перевірка взаємодій.
  • Шпигуни: Спостереження за взаємодіями.
  • Шаблони: Заміна функціональності з контрольованою поведінкою.
  • Фейки: Надання спрощеної реалізації системи.

Тестувальні фреймворки, як-от Jest, значно полегшують роботу з цими тестовими подвійниками, роблячи ваші тести більш ефективними, легкими для написання, швидшими в виконанні, зрозумілими для підтримки та більш надійними! 💡

Перекладено з: 🚀 Understanding Test Doubles: Mock, Spy, Stub and Fake 🤖

Leave a Reply

Your email address will not be published. Required fields are marked *