сеньорчикОткрыть в Telegram
← все вопросывопросы для собеседований · Тесты в Python

Вопросы по тестированию в Python на собеседовании

Тесты спрашивают, чтобы понять, как вы работаете каждый день. Разговор обычно уходит от «что такое юнит-тест» к практике: как изолировать внешний сервис, что делать с общей фикстурой и почему высокое покрытие не гарантирует качества.

72 вопросов в банке·6 подтем·ниже разбор 9

Из чего состоит тема

Так тема разложена в тренажёре: движок ведёт прогресс по каждой подтеме отдельно и возвращает те, где вы ошибаетесь.

Разборы подтем

Конспект по каждой: что это, как отвечать вслух, на чём валятся, плюс вопросы для самопроверки.

Примеры вопросов с разбором

  1. #async_testing1 / 9
    Обычная тест-функция не умеет await. Как pytest прогнать async-тест?
    A)Плагином pytest-asyncio с маркером @pytest.mark.asyncio на async def тесте
    B)Никак: pytest в принципе не поддерживает асинхронные тесты ни через какие плагины
    C)Обернуть тело теста в asyncio.run вручную внутри обычной синхронной тест-функции
    D)Достаточно объявить тест как async def — pytest сам исполнит корутину без плагинов
    показать ответ и разбор
    +A)Плагином pytest-asyncio с маркером @pytest.mark.asyncio на async def тесте

    // разбор: pytest сам не крутит корутины: async def тест без поддержки просто не выполнится (будет предупреждение о невостребованной корутине). Плагин pytest-asyncio даёт цикл событий и исполняет async-тесты, помеченные @pytest.mark.asyncio (или через режим auto). Альтернатива — anyio-плагин. Так внутри теста можно спокойно делать await.

  2. #fixtures_mocking2 / 9
    Что такое фикстура в pytest?
    A)Функция, готовящая зависимость и отдающая её тесту
    B)Файл с тестовыми данными в формате JSON, лежащий рядом с тестами
    C)Заранее зафиксированный ожидаемый результат теста для сравнения
    D)Специальный тест, который обязательно запускается перед всеми остальными
    показать ответ и разбор
    +A)Функция, готовящая зависимость и отдающая её тесту

    // разбор: Фикстура — функция с @pytest.fixture, которая готовит и отдаёт зависимость (соединение с БД, клиент, временные данные). Тест получает её, просто объявив имя фикстуры в параметрах — pytest подставит результат. Так инъекция зависимостей и переиспользование setup встроены в фреймворк.

  3. #pytest_basics3 / 9
    Как pytest по умолчанию находит тесты в проекте?
    A)Файлы test_*.py и функции/методы, начинающиеся с test_
    B)Ищет только классы, унаследованные от специального базового TestCase
    C)По списку тестов, который надо явно перечислить в конфиге проекта
    D)Запускает вообще все функции во всех модулях подряд без разбора
    показать ответ и разбор
    +A)Файлы test_*.py и функции/методы, начинающиеся с test_

    // разбор: pytest собирает тесты по соглашению: модули test_*.py (или *_test.py), функции test_* и методы test_* в классах Test*. Ни регистрировать, ни наследоваться от базового класса не нужно — в этом отличие от unittest. Пути и шаблоны настраиваются в pytest.ini/pyproject.

  4. #tdd_coverage4 / 9
    Каков цикл TDD?
    A)Refactor — Green — Red: сначала чистим код, потом ломаем тестом
    B)Написать весь код, затем покрыть его тестами и отрефакторить в конце
    C)Red — Green — Refactor: падающий тест, минимум кода, чистка
    D)Написать тесты, прогнать один раз и больше к ним не возвращаться
    показать ответ и разбор
    +C)Red — Green — Refactor: падающий тест, минимум кода, чистка

    // разбор: TDD: сначала пишут падающий тест на желаемое поведение (Red), затем минимальный код, чтобы он позеленел (Green), затем рефакторят реализацию, держа тест зелёным (Refactor) — и повторяют мелкими шагами. Тест ведёт дизайн: сначала контракт, потом реализация.

  5. #test_data_containers5 / 9
    Зачем в тестах factory_boy и faker?
    A)Заменять базу данных на время теста своей реализацией в памяти
    B)Генерировать валидные тестовые объекты без ручного заполнения полей
    C)Ускорять сами тесты за счёт кэширования результатов между прогонами
    D)Автоматически находить баги в коде без написания ассертов вручную
    показать ответ и разбор
    +B)Генерировать валидные тестовые объекты без ручного заполнения полей

    // разбор: factory_boy описывает, как собрать валидный объект (модель) с разумными дефолтами, а faker подставляет правдоподобные значения (имена, email, даты). Вместе они убирают простыни ручного заполнения полей и «магические» константы, оставляя в тесте только то, что для него существенно.

  6. #test_types6 / 9
    Чем юнит-тест отличается от интеграционного в бэкенде на Python?
    A)Интеграционный тест проверяет одну функцию, а юнит — весь сервис целиком
    B)Юнит изолирует логику моками, интеграционный бьёт по реальным зависимостям
    C)Юнит-тесты пишут на pytest, а интеграционные — только на unittest
    D)Юнит-тест обязательно медленнее интеграционного из-за настройки моков
    показать ответ и разбор
    +B)Юнит изолирует логику моками, интеграционный бьёт по реальным зависимостям

    // разбор: Юнит-тест проверяет единицу логики в изоляции, подменяя внешние зависимости (БД, HTTP) моками/фейками — быстро и точечно. Интеграционный проверяет связку с реальными зависимостями (настоящая БД в контейнере, соседний сервис) — медленнее, но ловит то, что моки скрывают: SQL, сериализацию, контракты.

  7. #async_testing7 / 9
    Как протестировать async-эндпоинт FastAPI, дергая приложение без реального сетевого сервера?
    A)httpx.AsyncClient поверх ASGITransport(app=app) — запросы идут прямо в приложение
    B)Использовать синхронный requests, обернув каждый вызов в отдельный event loop вручную
    C)Поднять приложение через uvicorn на реальном порту и ходить к нему по сети из теста
    D)Вызывать функции-обработчики напрямую, минуя маршрутизацию, валидацию и middleware
    показать ответ и разбор
    +A)httpx.AsyncClient поверх ASGITransport(app=app) — запросы идут прямо в приложение

    // разбор: Приложение FastAPI — ASGI-объект, поэтому его тестируют in-process: httpx.AsyncClient с transport=ASGITransport(app=app) шлёт запросы прямо в приложение, проходя маршрутизацию, валидацию и middleware, но без реального TCP-сервера. Это быстро и достоверно. Синхронный аналог — starlette TestClient. Прямой вызов функции-обработчика обходит весь стек и потому менее показателен.

  8. #fixtures_mocking8 / 9
    Фикстура с scope="session" — как часто она создаётся?
    A)Только если тест явно попросит пересоздать её вручную флагом
    B)Один раз на весь прогон и переиспользуется всеми тестами
    C)Заново на каждый тест, как обычная фикстура по умолчанию
    D)По разу на каждый тестовый класс в наборе, но не на модуль
    показать ответ и разбор
    +B)Один раз на весь прогон и переиспользуется всеми тестами

    // разбор: scope задаёт время жизни фикстуры: function (по умолчанию, на каждый тест), class, module, session (один раз на весь прогон). session-фикстура создаётся единожды и переиспользуется — хороша для дорогого setup (поднять контейнер БД). Но общий изменяемый стейт в широком scope легко даёт связанность тестов.

  9. #pytest_basics9 / 9
    Почему в pytest пишут обычный assert x == y, а не специальные assertEqual?
    A)pytest молча глотает обычный assert, поэтому он безопаснее прочих
    B)Обычный assert работает быстрее специальных методов проверки
    C)pytest переписывает assert и показывает разбор значений
    D)Специальные assert-методы в Python вообще запрещены синтаксисом
    показать ответ и разбор
    +C)pytest переписывает assert и показывает разбор значений

    // разбор: pytest на этапе импорта переписывает assert (assertion rewriting): при падении он показывает фактические значения обеих сторон и по каким элементам они разошлись. Поэтому голого assert хватает — не нужны assertEqual/assertTrue из unittest. Понятная диагностика идёт из коробки.

это 9 из 72

Ещё 63 вопросов по теме — в тренажёре, с движком повторения

Прочитать разбор и ответить самому — разные навыки. В Сеньорчике вопросы идут сессиями, а движок возвращает подтемы, где вы ошибаетесь, пока они не начнут отскакивать. Бесплатно, лимит по энергии.

Частые вопросы