Какой у вас опыт в автоматизации тестирования на Python?

«Какой у вас опыт в автоматизации тестирования на Python?» — вопрос из категории Основы программирования, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Опыт включает создание фреймворков и скриптов для автоматизации тестирования на Python с использованием современных библиотек и паттернов.

Ключевые технологии и подходы:

  • UI-автоматизация: Selenium WebDriver с использованием паттерна Page Object Model (POM) для создания поддерживаемых и переиспользуемых тестов.
  • API-тестирование: библиотеки requests и pytest для проверки REST API.
  • Юнит-тестирование и организация: pytest как основной runner, с использованием фикстур (@pytest.fixture), параметризации (@pytest.mark.parametrize) и плагинов.
  • Работа с данными: использование SQLAlchemy или сырых SQL-запросов для валидации данных в БД.
  • Система контроля версий: Git для управления кодом тестов.

Пример API-теста с использованием Pytest:

import pytest
import requests

BASE_URL = "https://api.example.com"

@pytest.mark.api
def test_get_user_by_id():
    """Тест проверяет корректность получения данных пользователя по ID."""
    user_id = 1
    response = requests.get(f"{BASE_URL}/users/{user_id}")

    # Проверка статус-кода
    assert response.status_code == 200, f"Expected 200, got {response.status_code}"

    # Проверка структуры и данных ответа
    user_data = response.json()
    assert user_data["id"] == user_id
    assert "email" in user_data
    assert "@" in user_data["email"]  # Базовая валидация email

# Пример параметризованного теста для проверки граничных случаев
@pytest.mark.parametrize("user_id, expected_status", [
    (0, 404),          # Несуществующий ID
    ("abc", 400),      # Невалидный тип ID
    (999999, 404),     # Несуществующий ID
])
def test_get_user_invalid_ids(user_id, expected_status):
    response = requests.get(f"{BASE_URL}/users/{user_id}")
    assert response.status_code == expected_status

Почему POM и pytest: Паттерн POM отделяет логику теста от локаторов страницы, что упрощает поддержку. pytest предоставляет мощные возможности для структурирования и отчетности, что критично для больших проектов.