Какой подход к тестированию применить, если у продукта отсутствует документация?

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

Ответ

При отсутствии документации наиболее эффективным подходом является исследовательское тестирование (Exploratory Testing). Это одновременное изучение приложения, проектирование тестов и их выполнение. Тестировщик полагается на свои знания, опыт и креативность для исследования функциональности и выявления дефектов.

Основные техники и сопутствующие методы:

  • Исследовательское тестирование: Систематическое, но не предопределенное изучение продукта. Тестировщик создает ментальную модель приложения «на лету».
  • Ad-hoc тестирование: Неформальное, спонтанное тестирование без какой-либо подготовки или документации. Часто используется для быстрой проверки.
  • Тестирование методом черного ящика: Анализ поведения системы исключительно на основе входных данных и наблюдаемых выходных данных, без знания внутреннего устройства.
  • Тестирование на основе ошибок (Error Guessing): Использование опыта тестировщика для предположения, где в приложении могут скрываться ошибки (например, ввод специальных символов, очень длинных строк, отрицательных чисел).

Пример структуры исследовательского тестового сеанса для поля ввода:

# Эвристики (правила-подсказки) для проверки текстового поля

def explore_input_field(field_name, submit_function):
    """Исследует поведение поля ввода."""
    test_cases = [
        ("", "Пустое значение"),
        (" ", "Пробел"),
        ("123", "Цифры"),
        ("Test@mail.com", "Email"),
        ("<script>alert('xss')</script>", "Попытка XSS"),
        ("A" * 1000, "Очень длинная строка"),
        ("NULL", "Специальное ключевое слово"),
        ("123e4567-e89b-12d3-a456-426614174000", "UUID"),
    ]

    print(f"=== Исследование поля: {field_name} ===")
    for value, description in test_cases:
        result = submit_function(value)
        # Анализ результата: упало ли приложение, корректно ли обработало ввод?
        print(f"Ввод '{description}': {value[:30]}... -> Результат: {result}")
    print("=== Сеанс завершен ===n")

# Предполагаемая функция, которая отправляет значение в систему
# (В реальности это мог бы быть вызов API или клик по кнопке в UI)
def submit_to_system(value):
    # Заглушка для примера. В реальном тесте здесь был бы вызов Selenium или requests.
    if value == "":
        return "Ошибка: поле обязательно"
    elif len(value) > 255:
        return "Ошибка: превышена длина"
    else:
        return "Успех"

# Запуск исследования
 explore_input_field("Имя пользователя", submit_to_system)

Практические шаги:

  1. Разведка: Определить основные модули и потоки приложения.
  2. Формирование гипотез: Предположить, что может сломаться.
  3. Выполнение проверок: Тестировать на основе гипотез и стандартных эвристик (например, CRUD — Create, Read, Update, Delete).
  4. Документирование: Фиксировать найденные баги и уточненную логику работы для будущих тестов.