Python | Вопросы собесов
Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @sendme_ads
Show more📈 Analytical overview of Telegram channel Python | Вопросы собесов
Channel Python | Вопросы собесов (@python_easy_ru) in the Russian language segment is an active participant. Currently, the community unites 12 635 subscribers, ranking 9 918 in the Technologies & Applications category and 51 142 in the Russia region.
📊 Audience metrics and dynamics
Since its creation on невідомо, the project has demonstrated rapid growth, gathering an audience of 12 635 subscribers.
According to the latest data from 14 October, 2026, the channel demonstrates stable activity. Although there has been a change in the number of participants by -107 over the last 30 days and by 0 over the last 24 hours, overall reach remains high.
- Verification status: Not verified
- Engagement rate (ER): The average audience engagement rate is 6.11%. Within the first 24 hours after publication, content typically collects 4.23% reactions from the total number of subscribers.
- Post reach: On average, each post receives 772 views. Within the first day, a publication typically gains 534 views.
- Reactions and interaction: The audience actively supports content: the average number of reactions per post is 3.
- Thematic interests: Content is focused on key topics such as ставь, модуль, строка, docker, alice.
📝 Description and content policy
The author describes the resource as a platform for expressing subjective opinions:
“Сайт: https://easyoffer.ru/
Все каналы: t.me/+xGeAw6ckJ4liYzQy
Контакт для рекламы: @sendme_ads”
Thanks to the high frequency of updates (latest data received on 15 October, 2026), the channel maintains relevance and a high level of publication reach. Analytics show that the audience actively interacts with content, making it an important point of influence in the Technologies & Applications category.
unittest.mock можно подменить вызовы к внешним сервисам и задать их поведение, включая ошибки и исключения.
2⃣Обработка исключений в тестируемой функции
В тестируемой функции следует предусмотреть обработку возможных ошибок, таких как таймауты и HTTP-статусы (например, 404), чтобы она корректно реагировала на эти ситуации.
Предположим, у нас есть функция, которая запрашивает данные с удаленного сервиса
import requests
def fetch_data_from_api(url):
try:
response = requests.get(url, timeout=5)
response.raise_for_status()
return response.json()
except requests.exceptions.Timeout:
return {"error": "Timeout"}
except requests.exceptions.HTTPError as http_err:
return {"error": f"HTTP error: {http_err.response.status_code}"}
except requests.exceptions.RequestException as err:
return {"error": f"Request error: {err}"}
🚩Тестирование с использованием `unittest.mock`
Установка поведения для mock-объекта
Создадим тесты, которые подменяют вызов requests.get и задают различные сценарии ошибок.
from unittest.mock import patch
import requests
import pytest
def test_fetch_data_timeout():
with patch('requests.get') as mock_get:
mock_get.side_effect = requests.exceptions.Timeout
result = fetch_data_from_api("https://example.com/data")
assert result == {"error": "Timeout"}
def test_fetch_data_404():
with patch('requests.get') as mock_get:
mock_response = mock_get.return_value
mock_response.raise_for_status.side_effect = requests.exceptions.HTTPError(response=mock_response)
mock_response.status_code = 404
result = fetch_data_from_api("https://example.com/data")
assert result == {"error": "HTTP error: 404"}
def test_fetch_data_request_exception():
with patch('requests.get') as mock_get:
mock_get.side_effect = requests.exceptions.RequestException("Connection error")
result = fetch_data_from_api("https://example.com/data")
assert result == {"error": "Request error: Connection error"}
1⃣Тест на таймаут
Используем mock_get.side_effect = requests.exceptions.Timeout для имитации ошибки таймаута. Проверяем, что функция возвращает ожидаемое значение при таймауте.
2⃣Тест на HTTP ошибку 404
Устанавливаем mock_response.raise_for_status.side_effect = requests.exceptions.HTTPError(response=mock_response) для имитации HTTP ошибки. Устанавливаем код статуса mock_response.status_code = 404. Проверяем, что функция возвращает ожидаемое значение при HTTP ошибке 404.
3⃣Тест на общую ошибку запроса
Используем mock_get.side_effect = requests.exceptions.RequestException("Connection error") для имитации общей ошибки запроса. Проверяем, что функция возвращает ожидаемое значение при общей ошибке запроса.
Ставь 👍 и забирай 📚 Базу знанийdef add(a, b):
return a + b
def test_add():
assert add(1, 2) == 3
🟠Интеграционные тесты (Integration Tests)
Расположение: Средний уровень пирамиды.
Цель: Тестирование взаимодействия между различными модулями или компонентами.
Количество: Меньше, чем юнит-тестов, но больше, чем системных тестов.
Особенности: Проверка интерфейсов и взаимодействия между модулями, более сложные и медленные, чем юнит-тесты.
def fetch_data_from_api():
response = requests.get('https://api.example.com/data')
return response.json()
def test_fetch_data_from_api():
data = fetch_data_from_api()
assert 'key' in data
🟠Системные тесты (System Tests)
Расположение: Вершина пирамиды.
Цель: Тестирование всей системы целиком на соответствие требованиям.
Количество: Наименьшее количество тестов.
Особенности: Включают тестирование пользовательских сценариев, проверку функциональных и нефункциональных требований, самые сложные и медленные.
🚩Зачем нужна
🟠Оптимизация затрат на тестирование
Юнит-тесты дешевле в написании и выполнении, чем интеграционные и системные тесты.
🟠Снижение времени выполнения тестов
Большое количество юнит-тестов позволяет быстро находить ошибки на ранних стадиях разработки.
🟠Поддержание качества кода
Юнит-тесты способствуют улучшению дизайна кода и повышают его тестируемость.
🟠Снижение риска регрессий
Хорошее покрытие юнит-тестами позволяет быстро обнаруживать и исправлять ошибки, возникающие после внесения изменений в код.
Ставь 👍 и забирай 📚 Базу знанийdef add(a, b):
return a + b
def test_add():
assert add(1, 2) == 3
🟠Интеграционные тесты (Integration Tests)
Проверка взаимодействия между различными модулями или компонентами системы.
Тестируют комбинации модулей и их взаимодействие.
Более сложные и медленные по сравнению с юнит-тестами.
Могут выявить проблемы в интерфейсах между модулями.
def fetch_data_from_api():
response = requests.get('https://api.example.com/data')
return response.json()
def test_fetch_data_from_api():
data = fetch_data_from_api()
assert 'key' in data
🟠Системные тесты (System Tests)
Проверка всей системы целиком на соответствие требованиям.
Тестируют систему в рабочей среде.
Включают проверку всех функциональных и нефункциональных требований.
Могут включать пользовательские сценарии.
Тестирование веб-приложения на основе реальных пользовательских сценариев, включая проверку интерфейса, баз данных и API.
🟠Приемочные тесты (Acceptance Tests)
Проверка соответствия системы требованиям и ожиданиям заказчика или конечного пользователя.
Часто выполняются вместе с заказчиком или пользователем.
Фокусируются на бизнес-требованиях и пользовательских сценариях.
Успешное прохождение приемочных тестов является критерием готовности системы к выпуску.
Тестирование нового функционала с участием конечных пользователей для проверки его удобства и соответствия их ожиданиям.
🟠Регрессионные тесты (Regression Tests)
Убедиться, что изменения в коде не вызвали новых ошибок в уже работающем функционале.
Выполняются после внесения изменений в код.
Обычно автоматизируются и включают повторное выполнение всех или части существующих тестов.
Повторное выполнение всех юнит-тестов и интеграционных тестов после рефакторинга кода.
🟠Нефункциональные тесты (Non-functional Tests)
Проверка нефункциональных аспектов системы, таких как производительность, безопасность, удобство использования и др.
🚩Основные виды:
🟠Тесты производительности
Измеряют скорость выполнения, пропускную способность и время отклика системы.
🟠Тесты безопасности
Оценивают защищенность системы от угроз и атак.
🟠Тесты удобства использования
Проверяют удобство и интуитивность пользовательского интерфейса.
Ставь 👍 и забирай 📚 Базу знанийimport requests
def get_user_data(user_id):
response = requests.get(f"https://api.example.com/users/{user_id}")
return response.json()
Чтобы протестировать эту функцию без реальных запросов, можно использовать mock:
from unittest.mock import patch
@patch('requests.get')
def test_get_user_data(mock_get):
mock_get.return_value.json.return_value = {"id": 1, "name": "John Doe"}
result = get_user_data(1)
assert result == {"id": 1, "name": "John Doe"}
mock_get.assert_called_once_with("https://api.example.com/users/1")
🚩Основные методы и атрибуты
🟠return_value
Устанавливает возвращаемое значение метода.
🟠side_effect
Устанавливает последовательность возвращаемых значений или исключений.
🟠assert_called_with()
Проверяет, что метод был вызван с определенными аргументами.
🟠assert_called_once_with()
Проверяет, что метод был вызван ровно один раз с определенными аргументами.
🚩Пример с контекстным менеджером
import requests
from unittest.mock import patch
def get_status_code(url):
response = requests.get(url)
return response.status_code
def test_get_status_code():
with patch('requests.get') as mock_get:
mock_get.return_value.status_code = 200
assert get_status_code("https://example.com") == 200
mock_get.assert_called_once_with("https://example.com")
Ставь 👍 и забирай 📚 Базу знанийtest_.
🟠Запуск тестов
Тесты выполняются с помощью команды pytest в командной строке.
🟠Ассерты
Используются стандартные утверждения (assert) для проверки условий.
🚩Основные возможности
🟠Автоматическое обнаружение тестов
pytest автоматически находит тестовые функции, классы и файлы.
🟠Фикстуры: Позволяют определять подготовительный и завершающий код для тестов.
🟠Параметризация
Позволяет запускать один и тот же тест с различными входными данными.
🟠Плагины
Расширяют функциональность фреймворка, например, для генерации отчетов, интеграции с CI/CD системами.
🚩Пример теста с использованием
# test_sample.py
def test_addition():
assert 1 + 1 == 2
def test_subtraction():
assert 2 - 1 == 1
Запуск тестов:
pytest
🟠Фикстуры
Фикстуры позволяют подготовить необходимые данные или состояния для тестов.
import pytest
@pytest.fixture
def sample_data():
return {"key1": "value1", "key2": "value2"}
def test_sample_data(sample_data):
assert sample_data["key1"] == "value1"
🟠Параметризация тестов
Позволяет запускать один тест с разными наборами данных.
import pytest
@pytest.mark.parametrize("a, b, result", [
(1, 2, 3),
(2, 3, 5),
(3, 5, 8)
])
def test_addition(a, b, result):
assert a + b == result
Ставь 👍 и забирай 📚 Базу знанийimport time
# Оригинальная функция
def original_sleep(seconds):
time.sleep(seconds)
print(f"Slept for {seconds} seconds")
# Monkey patching функции sleep
def patched_sleep(seconds):
print(f"Patched! Should have slept for {seconds} seconds")
# Применение monkey patching
time.sleep = patched_sleep
# Примеры использования
time.sleep(3) # Вывод: Patched! Should have slept for 3 seconds
🚩Недостатки
➖Неявные изменения
Изменения могут быть неочевидны другим разработчикам, что может привести к путанице и затруднениям в отладке.
➖Совместимость
Monkey patching может вызвать проблемы совместимости при обновлении библиотек или модулей.
➖Непредсказуемость
Изменения в поведении программы могут быть трудно предсказуемыми и отлаживаемыми.
Ставь 👍 и забирай 📚 Базу знаний