Моки и фикстуры используются при тестировании программного обеспечения, чтобы гарантировать надежность и правильность кода, но они служат разным целям.
Моки используются для замены зависимости тестируемого кода тестируемым объектом, который ведет себя определенным образом. Например, если функция зависит от подключения к базе данных, фиктивный объект можно использовать для имитации подключения к базе данных без фактического подключения к ней. Это позволяет тестировать функцию изолированно и без необходимости подключения к реальной базе данных.
Фикстуры, с другой стороны, используются для настройки начального состояния тестируемой системы. Фикстуры предоставляют известный набор данных или ресурсов, которые тест может использовать для обеспечения правильного поведения системы в определенных условиях. Например, тест, который проверяет авторизацию, может использовать фикстуру для создания набора тестовых учетных записей пользователей с известными именами пользователей и паролями.
Таким образом, макеты используются для замены зависимостей тестируемыми объектами, а фикстуры используются для предоставления исходных данных и ресурсов для тестирования. Оба являются важными инструментами для эффективного тестирования программного обеспечения.
Пример использования моков в pytest:
Допустим, у вас есть функция get_weather_data(), которая извлекает данные о погоде из внешнего API. Ваш код может выглядеть примерно так:
import requests def get_weather_data(city): url = f"https://api.openweathermap.org/data/2.5/weather?q={city}&appid=your_api_key" response = requests.get(url) return response.json()
Чтобы протестировать эту функцию, вам нужно будет вызвать внешний API, который может быть медленным и ненадежным. Вместо этого вы можете использовать фиктивный объект для имитации ответа API и изолированного тестирования функции.
Чтобы использовать фиктивный объект в Pytest, вы можете использовать библиотеку unittest.mock, входящую в состав Python. Вот пример теста с использованием фиктивного объекта:
from unittest.mock import MagicMock from my_module import get_weather_data def test_get_weather_data(): # Create a mock response object mock_response = MagicMock() mock_response.json.return_value = {"temperature": "20°C", "humidity": "60%"} # Monkeypatch the requests library to return the mock response monkeypatch.setattr("requests.get", lambda url: mock_response) # Call the function with the mock response result = get_weather_data("San Francisco") # Assert that the function returned the expected data
В этом примере мы создаем фиктивный объект ответа в формате JSON, содержащей данные о температуре и влажности. Затем мы используем monkeypatch.setattr(), чтобы заменить функцию request.get() лямбда-функцией, которая возвращает фиктивный ответ. Наконец, мы вызываем get_weather_data() с фиктивным ответом и ожидаем, что функция вернула ожидаемые данные.
Используя фиктивный объект, мы можем протестировать функцию get_weather_data() изолированно, не полагаясь на внешний API, что делает наши тесты быстрее, надежнее и проще в отладке.
Пример использования фикстур в pytest:
Допустим, у вас есть функция calculate_average(), которая вычисляет среднее значение списка чисел. Ваш код может выглядеть примерно так:
def calculate_average(numbers): total = sum(numbers) return 0 else:
Чтобы протестировать эту функцию, вам нужно будет создать тестовые данные для передачи в функцию. Вместо того, чтобы дублировать этот код в каждом тесте, вы можете использовать фикстуру для предоставления известного набора данных для каждого теста.
Чтобы использовать фикстуру в Pytest, вы можете использовать декоратор @pytest.fixture. Вот пример теста с использованием фикстуры:
import pytest from my_module import calculate_average @pytest.fixture def test_data(): return [1, 2, 3, 4, 5] def test_calculate_average(test_data): result = calculate_average(test_data) def test_calculate_average_empty(): result = calculate_average([])
В этом примере мы определяем фикстуру с именем test_data, которая возвращает список чисел для использования в наших тестах. Затем мы передаем эту фикстуру в качестве аргумента нашей тестовой функции test_calculate_average(). Когда Pytest запускает этот тест, он автоматически вызывает фикстуру test_data и передает возвращенные данные тестовой функции.
Используя фикстуру, мы можем предоставить известный набор данных для наших тестов и избежать дублирования кода в нескольких тестах. Это упрощает чтение, написание и поддержку тестов.