Інтерв’юер: Доброго дня! Розкажіть, будь ласка, про себе та ваш досвід в автоматизації тестування.
Кандидат: Доброго дня! Я QA Automation Engineer з досвідом роботи 2 роки. Переважно спеціалізуюсь на автоматизації тестування вебзастосунків з використанням Python, Selenium та Pytest. У останньому проєкті я розробляв автотести для інтернет-магазину, що дозволило скоротити час на регресійне тестування на 40%. Також працював з CI/CD (Jenkins), API-тестуванням (Requests) та системами керування тестуванням, як-от TestRail.
Інтерв’юер: Розкажіть, які фреймворки автоматизації тестування на Python ви використовували та в чому їхні переваги?
Кандидат: Я використовував Pytest і Selenium. Pytest — мій основний фреймворк, тому що він гнучкий, підтримує фікстури для спрощення підготовки тестів і має потужні плагіни, наприклад, pytest-xdist для паралельного запуску тестів. Selenium я застосовував для тестування вебінтерфейсів — він універсальний і працює з різними браузерами.
Інтерв’юер: Добре. Припустимо, вам потрібно протестувати форму логіну на сайті. Як ви підійдете до автоматизації цього сценарію?
Кандидат: Спочатку я визначу елементи сторінки: поля для введення логіну та пароля, кнопку «Увійти». Потім створю тест-кейс у Pytest, використовуючи Selenium для взаємодії з цими елементами. Наприклад:
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
def test_login(driver):
driver.get(«https://test.com/login»)
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, «username»)))
driver.find_element(By.ID, «username»).send_keys(«test_user»)
driver.find_element(By.ID, «password»).send_keys(«test_pass»)
driver.find_element(By.ID, «login_button»).click()
assert «Welcome» in driver.page_source
Я використовую WebDriverWait для очікування завантаження елементів, щоб тести були стабільними. Також додам перевірки на успішний вхід і обробку помилок (наприклад, неправильний пароль). Для масштабованості застосую Page Object Model, щоб розділити логіку сторінки та тести.
Інтерв’юер: Чудово. А як ви проводите кросбраузерне тестування?
Кандидат: Для кросбраузерного тестування я визначаю цільові браузери (наприклад, Chrome, Firefox, Edge) та їхні версії. Використовую Selenium WebDriver з відповідними драйверами для кожного браузера. Для запуску тестів у різних браузерах можна налаштувати Pytest із параметризацією:
import pytest
from selenium import webdriver
@pytest.mark.parametrize(«browser», [«chrome», «firefox»])
def test_cross_browser_login(browser):
if browser == «chrome»:
driver = webdriver.Chrome()
elif browser == «firefox»:
driver = webdriver.Firefox()
# Логіка тесту
driver.quit()
Для економії часу я можу використовувати хмарні сервіси, такі як BrowserStack або Sauce Labs, щоб тестувати на реальних пристроях і браузерах. Результати відстежую через звіти Pytest або Allure.
Інтерв’юер: Добре. А як ви обробляєте нестабільні тести (flaky tests)?
Кандидат: Нестабільні тести часто виникають через асинхронні операції, мережеві затримки або неправильну синхронізацію. Мій підхід:
Додаю явні очікування (WebDriverWait) для елементів.
Перевіряю, що тести ізольовані й не залежать один від одного.
Використовую повторні запуски за допомогою плагіна pytest-rerunfailures.
Аналізую логи та скріншоти, щоб знайти причину (наприклад, з Allure-звітами).
Якщо тест залежить від зовнішніх факторів (наприклад, API), додаю заглушки за допомогою бібліотеки responses.
Також я регулярно рефакторю код тестів, щоб підвищити їхню надійність.
Інтерв’юер: Перейдемо до Python. Поясніть, що таке декоратори, і наведіть приклад їх використання в тестуванні.
Кандидат: Декоратори в Python — це функції, які обгортають інші функції чи методи, додаючи додаткову функціональність без зміни їхнього коду. Вони корисні для логування, обробки помилок або повторного запуску тестів.
Приклад декоратора для повторного запуску тесту у разі помилки:
import functools
import time
def retry(max_attempts=3, delay=1):
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
attempts = 0
while attempts < max_attempts:
try:
return func(*args, **kwargs)
except AssertionError:
attempts += 1
if attempts == max_attempts:
raise
time.sleep(delay)
return wrapper
return decorator
@retry(max_attempts=3, delay=2)
def test_unstable_api():
# Тест, який може тимчасово падати через мережеві проблеми
assert some_api_call() == «success»
Цей декоратор перезапустить тест до трьох разів із затримкою в 2 секунди, якщо він впаде.
Інтерв’юер: Добре. Розкажіть, як ви працювали з CI/CD для автоматизації тестування?
Кандидат: У моєму останньому проєкті я інтегрував автотести в Jenkins. Налаштував пайплайн, який запускав тести після кожного коміту в репозиторій GitHub. Кроки були такими:
Встановлення залежностей (pip install -r requirements.txt).
Запуск Pytest із параметрами (pytest --alluredir=reports).
Генерація звітів Allure.
Повідомлення команди в Slack про результати.
Також я використовував GitHub Actions для запуску тестів на різних ОС і версіях Python, щоб забезпечити сумісність. Це дозволило виявляти проблеми на ранніх етапах розробки.
Інтерв’юер: Уявіть, що ви знайшли баг, але розробники кажуть, що це не баг, а фіча. Як ви вчините?
Кандидат: Спершу я уточню вимоги в документації або в продуктовому менеджера, щоб зрозуміти, чи відповідає поведінка специфікаціям. Потім організую обговорення з розробниками і, можливо, аналітиком, щоб дійти спільної думки. Якщо це дійсно фіча — я оновлю тест-кейси. Якщо ж баг підтверджується, надам відтворювані кроки, скріншоти й логи, щоб переконати команду. Головне — зберігати професійний підхід і орієнтуватися на якість продукту.