Автоматизация веб-продуктов на Python (PyTest + Playwright), API-тестирование, CI/CD и тестирование AI/RAG/MCP-флоу в финтехе
Фишка: Фокус на современном стеке (Python, Playwright, PyTest) и тестировании AI/RAG/MCP-флоу в продуктовых командах банка; сильная инженерная культура с публикациями на Habr про LLM-проекты, нагрузочное тестирование core-систем и интеграционные платформы до 150k RPS
| Этап | Длительность | Что проверяют |
|---|---|---|
| HR-скрининг | 30–45 мин | Опыт 4+ лет в QA веб-продуктов, мотивация в финтех, формат работы (гибрид), зарплатные ожидания, готовность к задачам с AI-флоу |
| Техническое интервью | 60–90 мин | PyTest/Playwright, API-тестирование, пирамида тестирования, CI/CD, Git, Docker; разбор реальных кейсов автоматизации и регресса |
| Практика / live-coding | 45–60 мин | Написание API- или UI-автотеста, тест-дизайн для фичи или AI-сценария, анализ баг-репорта или логов |
| Финал с лидом / hiring manager | 30–45 мин | Soft skills, работа с инцидентами, взаимодействие с разработкой, планы развития, вопросы о команде и процессах |
Обязательный минимум
Плюсом будет
Какие есть виды тестирования?
Функциональное vs нефункциональное; smoke/regression/sanity; позитив/негатив; ручное vs автоматизированное; по уровню — unit, integration, system, acceptance
Что такое пирамида тестирования?
Много быстрых unit/integration внизу, меньше медленных E2E наверху. Цель — баланс скорости обратной связи и покрытия рисков
Какие знаешь техники тестирования дизайна?
Эквивалентное разбиение, граничные значения, pairwise, decision table, state transition, use case — назови 3–4 с примером применения
Какими характеристиками должен обладать хороший автотест?
Быстрый, изолированный, детерминированный, читаемый, независимый, с понятным assert и минимумом зависимостей от окружения
Что такое TDD?
Red-Green-Refactor: сначала падающий тест, потом минимальный код, потом рефакторинг. В QA — понимание, как это влияет на качество и регресс
Фишка: В Альфа-Банке ценят системный подход: тест-планы, чек-листы и участие в разборе инцидентов — не только «написать автотесты»
Ловушка: Не своди виды тестирования только к «ручное/авто» — покажи понимание уровней, целей и рисков в финтехе
С какими фреймворками и библиотеками для автоматизации работал?
PyTest как runner, fixtures, parametrize, pytest-xdist для параллели, allure/pytest-html для отчётов, requests/httpx для API
Как организуешь структуру автотестов на PyTest?
tests/ по слоям (api/ui), conftest.py для фикстур, markers (@smoke, @regression), отдельные конфиги для стендов через env
Как борешься с flaky-тестами?
Стабильные локаторы, явные waits, изоляция данных, retry только как временная мера, quarantine + анализ root cause в CI
Какие используешь структуры данных в тестах?
dict/list для payload, dataclass/pydantic для моделей, factory/fixture для генерации тестовых данных
Совет: На собесе часто просят написать фикстуру с setup/teardown или параметризованный тест — потренируйся на API-кейсе с 3–4 наборами данных
Ловушка: time.sleep() в Playwright/PyTest — красный флаг; используй auto-wait и expect
Чем Playwright отличается от Selenium?
Auto-wait, trace/video, параллельные контексты, стабильные локаторы (role/text), нативная поддержка network interception
Как стабилизируешь UI-автотесты?
Page Object, data-testid, изоляция тестовых пользователей, моки API через route, скриншот при падении, trace on first retry
Как тестируешь OAuth/SSO-сценарии в UI?
Тестовый IdP/stub, сохранение storageState, отдельные фикстуры auth, проверка redirect URL и токенов на API-уровне
Фишка: В вакансии явно указан Playwright для UI-автотестов — будь готов показать реальный E2E-сценарий с login → action → assert
Совет: Playwright codegen и trace viewer — хороший аргумент на собесе, если используешь их для ускорения отладки
Расскажи про свой опыт тестирования API
Инструменты (Postman/httpx/PyTest), проверки status/body/headers/schema, негативные кейсы, контрактное тестирование, auth (Bearer/OAuth)
В чём разница между POST, PUT и PATCH?
POST — создание/действие; PUT — полная замена ресурса (идемпотентен); PATCH — частичное обновление
Как выбрать между POST, PUT и PATCH в тестах?
Смотри контракт API: PUT требует полного тела, PATCH — delta; проверяй идемпотентность и side effects
Как тестируешь WebSocket?
Подключение, ping/pong, сообщения по протоколу, reconnect, таймауты, параллельные клиенты; в Playwright — page.on('websocket')
Ловушка: Не ограничивайся проверкой 200 OK — в банке важны коды ошибок, идempotency, валидация полей и безопасность
Совет: Подготовь пример: как бы протестировал endpoint перевода/оплаты — позитив, негатив, границы, авторизация
Что такое CI/CD и как автотесты встроены в пайплайн?
CI — сборка + тесты на каждый PR; CD — деплой после gate. Smoke на merge, full regression nightly, артефакты (allure, logs, traces)
В чём разница между git pull и git fetch?
fetch скачивает изменения без merge; pull = fetch + merge/rebase локальной ветки
В чём разница между git rebase и git merge?
merge сохраняет историю ветвления; rebase переписывает коммиты поверх base — линейная история, но опасен для shared branches
Как используешь Docker в тестировании?
docker-compose для стенда, поднять mock-сервис, docker logs для диагностики, volume для артеfactов
Фишка: Вакансия требует интеграции автотестов с корпоративными системами и CI — расскажи про конкретный пайплайн (GitLab/Jenkins/GitHub Actions)
Ловушка: rebase на main/master в команде — спорная тема; покажи, что понимаешь trade-offs
Как бы тестировал LLM/RAG-пайплайн?
Golden dataset, метрики качества (precision/recall ответа), проверка fallback, детерминированные vs агентные flow, логирование промптов
Что такое MCP и зачем он QA?
Model Context Protocol — стандарт подключения инструментов к LLM; тестируй контракт tools, ошибки, таймауты, безопасность вызовов
Чем отличается детерминированный flow от AI-агента?
Flow — фиксированная цепочка шагов; агент сам выбирает инструменты и порядок. Для QA: разные стратегии тестирования и метрики
Как оцениваешь качество ответов AI-ассистента?
Rule 90%: на проде сложно >90% точности; цепочка RAG умножает вероятности ошибок; нужны eval-наборы и мониторинг
Фишка: Это ключевой differentiator вакансии — даже без глубокого опыта покажи архитектурное понимание и идеи тест-кейсов для AI-флоу
Совет: Почитай статьи Альфы на Habr про LLM-проекты и RAG — на финале можно задать умный вопрос про eval и Langfuse
Как анализируешь логи, метрики и traces при падении теста или инциденте?
Корреляция по trace_id, timeline, метрики latency/error rate, сравнение с baseline, эскалация dev с воспроизводимым кейсом
Какой опыт нагрузочного тестирования?
k6/JMeter: сценарии, RPS, p95/p99 latency, ramp-up, bottlenecks; понимание, что «150k RPS синтетики» ≠ боевая нагрузка
В чём разница между контейнеризацией и виртуализацией?
VM — полная ОС на гипервизоре; контейнер — изоляция процессов, общее ядро. Docker быстрее стартует, меньше overhead
Фишка: Альфа публикует кейсы нагрузочного тестирования core-систем — полезно упомянуть разнообразие RPS, размеров payload и p95
Ловушка: Не путай нагрузочное тестирование с функциональным — разные цели, метрики и инструменты
API-автотест: создание и получение ресурса
Есть REST API: POST /api/v1/documents принимает JSON {"title": str, "type": str}, возвращает 201 и {"id": uuid, "title", "type", "created_at"}. GET /api/v1/documents/{id} возвращает 200 или 404. Напиши PyTest-тесты: успешное создание, получение по id, 404 для несуществующего id, 400 при пустом title.
import pytest
import httpx
BASE = "https://test-api.example.com"
@pytest.fixture
def client():
with httpx.Client(base_url=BASE, timeout=10) as c:
yield c
@pytest.fixture
def created_doc(client):
r = client.post("/api/v1/documents", json={"title": "Test", "type": "report"})
assert r.status_code == 201
return r.json()
def test_create_document(client):
r = client.post("/api/v1/documents", json={"title": "Smoke", "type": "invoice"})
assert r.status_code == 201
body = r.json()
assert body["title"] == "Smoke"
assert "id" in body
def test_get_document(client, created_doc):
doc_id = created_doc["id"]
r = client.get(f"/api/v1/documents/{doc_id}")
assert r.status_code == 200
assert r.json()["id"] == doc_id
def test_get_missing_returns_404(client):
r = client.get("/api/v1/documents/00000000-0000-0000-0000-000000000000")
assert r.status_code == 404
@pytest.mark.parametrize("payload", [{"title": "", "type": "x"}, {"type": "x"}])
def test_create_validation(client, payload):
r = client.post("/api/v1/documents", json=payload)
assert r.status_code == 400Сложность: O(1) на запрос
Playwright: login и проверка дашборда
Веб-приложение: /login (email, password), после успеха редирект на /dashboard с элементом [data-testid="welcome-message"]. Напиши E2E-тест: login тестовым пользователем → assert welcome → logout → assert redirect на /login.
import pytest
from playwright.sync_api import Page, expect
@pytest.fixture
def auth_page(page: Page, base_url):
page.goto(f"{base_url}/login")
page.get_by_label("Email").fill("qa@test.local")
page.get_by_label("Password").fill("secret")
page.get_by_role("button", name="Войти").click()
expect(page).to_have_url(f"{base_url}/dashboard")
return page
def test_dashboard_after_login(auth_page: Page):
expect(auth_page.get_by_test_id("welcome-message")).to_be_visible()
def test_logout(auth_page: Page, base_url):
auth_page.get_by_role("button", name="Выйти").click()
expect(auth_page).to_have_url(f"{base_url}/login")Сложность: O(1)
Тест-дизайн: RAG-чат поддержки
Банковский чат-бот на RAG отвечает на вопросы клиентов по базе знаний (вход в кабинет, блокировка карты и т.д.). Pipeline: rewrite query → RAG search → generate answer. Составь набор тест-кейсов и метрик качества.
Тест-кейсы: 1. Позитив: «Не могу войти в личный кабинет» → релевантная инструкция из KB 2. Out-of-scope: «Курс доллара завтра» → корректный отказ/fallback 3. Ambiguous: «Войти» → уточняющий вопрос или best-effort 4. Adversarial: prompt injection в user input → не выполняет системные команды 5. Regression: стоп-лист известных bad cases после оркестрации Метрики: - Answer relevance (human/LLM-as-judge на golden set) - Groundedness: ответ опирается на найденные chunks - Latency p95 - Fallback rate - End-to-end accuracy ≈ product шагов (например 0.95×0.80×0.99 для 3-шагового pipeline)
Сложность: O(n) по размеру eval-набора
Каркас ответа
3 дня
7 дней
14 дней
| Блок | Готов, если... |
|---|---|
| Тест-дизайн | можешь за 5 минут набросать чек-лист для API или UI-фичи с позитив/негатив/границы |
| PyTest | можешь написать фикстуру, parametrize и тест API без подсказок |
| Playwright | можешь написать login-flow с expect и объяснить auto-wait |
| API | объясняешь POST/PUT/PATCH и типовые проверки REST + auth |
| CI/CD | можешь нарисовать пайплайн: PR → smoke → merge → nightly regression |
| AI/RAG | объясняешь цепочку RAG, риски качества и идеи eval-набора |
| Behavioral | 3 STAR-истории готовы: баг/инцидент, автоматизация, работа с dev |
В день собеседования