Какой общий алгоритм проверки входного параметра?

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

Ответ

Проверка параметра следует принципам тест-дизайна и направлена на выявление дефектов. Базовый алгоритм:

  1. Тип данных: Соответствует ли значение ожидаемому типу (integer, string, boolean, array)?
  2. Допустимый диапазон (граничные значения):
    • Минимальное и максимальное значение.
    • Длина строки или массива.
  3. Формат и паттерн: Соответствует ли шаблону (email, телефон, дата, регулярное выражение)?
  4. Обязательность: Как обрабатываются null, undefined или пустая строка ""?
  5. Безопасность: Есть ли проверка на инъекции (SQL, XSS, командные)?
  6. Бизнес-логика: Корректно ли значение в контексте приложения (например, age не может быть отрицательным)?

Практический пример на Python:

def validate_user_input(username, age):
    """Валидация параметров username и age."""
    errors = []

    # 1. Проверка типа
    if not isinstance(username, str):
        errors.append("Username must be a string.")
    if not isinstance(age, int):
        errors.append("Age must be an integer.")
        return errors  # Дальнейшая проверка age бессмысленна

    # 2. Проверка длины/диапазона (граничные значения)
    if not (3 <= len(username) <= 20):
        errors.append("Username must be 3-20 characters long.")
    if not (0 <= age <= 120):
        errors.append("Age must be between 0 and 120.")

    # 3. Проверка формата (паттерн)
    import re
    if not re.match(r'^[a-zA-Z0-9_]+$', username):
        errors.append("Username can only contain letters, numbers, and underscore.")

    # 4. Проверка на SQL-инъекцию (упрощенный пример)
    forbidden_sql_keywords = ['UNION', 'SELECT', 'DROP', '--']
    if any(keyword in username.upper() for keyword in forbidden_sql_keywords):
        errors.append("Invalid username format.")

    return errors if errors else None