Как тестируешь модели с разными типами данных?

«Как тестируешь модели с разными типами данных?» — вопрос из категории Техники тест-дизайна, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для тестирования обработки разных типов данных я применяю комбинацию техник тест-дизайна, в первую очередь эквивалентное разбиение и анализ граничных значений.

1. Планирование тестовых данных:

  • Эквивалентные классы: Группирую входные данные по ожидаемой реакции системы.
    • Валидные данные: Корректные строки, числа, даты, булевы значения.
    • Невалидные данные: null/undefined, пустые строки, строки с неверным форматом (например, буквы в числовом поле).
  • Граничные значения: Для числовых полей и строк проверяю значения на границах допустимых диапазонов.
    • Минимальное и максимальное допустимое значение.
    • Значения min-1 и max+1 (должны вызывать ошибку).
    • Максимальная и максимальная+1 длина строки.

2. Практический пример (тестирование поля 'Возраст'): Допустим, поле принимает целое число от 18 до 120.

  • Валидные значения (ожидается успех): 18, 25, 120.
  • Невалидные значения (ожидается ошибка):
    • Граничные: 17, 121.
    • Некорректный тип: "двадцать пять", null, "" (пустая строка), 25.5 (дробное).
    • Специальные случаи: 0, отрицательные числа, очень большие числа.

3. Реализация в автотестах (на примере API):

import pytest
import requests

@pytest.mark.parametrize("age_input, expected_status", [
    (25, 200),           # Валидное значение из середины диапазона
    (18, 200),           # Нижняя граница
    (120, 200),          # Верхняя граница
    (17, 400),           # Ниже нижней границы
    (121, 400),          # Выше верхней границы
    (None, 400),         # Null значение
    ("", 400),           # Пустая строка
    ("twenty", 400),     # Строка вместо числа
])
def test_age_validation(api_url, age_input, expected_status):
    payload = {"age": age_input}
    response = requests.post(f"{api_url}/user", json=payload)
    assert response.status_code == expected_status, f"Failed for input: {age_input}"

4. Комбинаторное тестирование: Для форм с несколькими полями разных типов использую попарное тестирование (Pairwise), чтобы покрыть основные взаимодействия типов данных без взрывного роста числа тестов.