Мокінг і ізоляція тестів
Свайпніть щоб показати меню
Мокінг — це потужна техніка в модульному тестуванні, яка дозволяє замінювати частини системи, що тестується, на мок-об'єкти або функції. Мета полягає в тому, щоб ізолювати одиницю коду, яку ви тестуєте, від її залежностей, таких як бази даних, API або інші складні системи. Використовуючи моки, ви можете контролювати поведінку залежностей і зосередитися на перевірці логіки вашого коду в контрольованому середовищі.
Ізоляція тестів важлива, оскільки гарантує, що тести не впливають один на одного і не залежать від факторів поза їхньою сферою. Ізольовані тести є більш надійними та простішими для налагодження, оскільки їх результати залежать лише від коду, що тестується, і конкретних умов, які ви створюєте, а не від стану чи поведінки зовнішніх систем.
У Python модуль unittest.mock надає інструменти для мокінгу об'єктів і функцій. Використовуючи мокінг, ви можете замінити реальну функцію або об'єкт на мок, який повертає контрольовані значення або фіксує, як його використовували. Це особливо корисно, коли ваш код взаємодіє з ресурсами, які є повільними, непередбачуваними або недоступними під час тестування.
12345678910111213141516171819202122232425import unittest from unittest.mock import patch def check_the_sky(): # Simulate a slow or unreliable API raise ConnectionError("API not available") def get_advice(): if check_the_sky(): return "Take an umbrella." else: return "Enjoy the sunshine!" class TestWeather(unittest.TestCase): @patch('__main__.check_the_sky') def test_advice_when_rainy(self, mock_check): mock_check.return_value = True self.assertEqual(get_advice(), "Take an umbrella.") @patch('__main__.check_the_sky') def test_advice_when_clear(self, mock_check): mock_check.return_value = False self.assertEqual(get_advice(), "Enjoy the sunshine!") unittest.main(argv=[''], exit=False)
У цьому прикладі функція check_the_sky імітує зовнішню залежність, яка є ненадійною або недоступною, наприклад, погодний API, який може бути не завжди доступний. Функція get_advice містить логіку, яку потрібно протестувати — вона викликає check_the_sky і повертає пораду залежно від результату.
Тестовий клас unittest використовує мокінг для заміни реальної функції check_the_sky на мок, який повертає контрольовані значення. Це дозволяє перевірити, як поводиться get_advice у різних сценаріях, наприклад, коли небо ясне або дощове, без залежності від реальної зовнішньої системи.
Декоратор @patch використовується для тимчасової заміни реальної функції check_the_sky на мок-об'єкт під час виконання кожного тестового методу. Мок-об'єкт передається у тестовий метод як параметр mock_check. Ви використовуєте mock_check, щоб встановити потрібне значення, яке повертається у цьому тесті, щоб контролювати поведінку вашого коду та його результати у кожному сценарії.
Функція unittest.main() у цьому уроці містить кілька додаткових параметрів, які потрібні лише для цього навчального середовища. Вони допомагають коректно запускати код на платформі та не є частиною основних концепцій Python, які вам потрібно вивчити зараз.
Використовуючи мокінг, ви ізолюєте свої тести від зовнішніх систем, які можуть бути повільними або ненадійними. Це робить ваші тести швидкими, повторюваними та детермінованими, оскільки ви повністю контролюєте, що повертає залежність у кожному тестовому випадку.
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат