Коли мова заходить про тестування в розробці програмного забезпечення, ви, ймовірно, чули терміни як Моки, Шпигуни, Шаблони та Фейки. Це все Тестові подвійники (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 🤖