Как вы проверяете соответствие программного обеспечения функциональным требованиям?

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

Ответ

Процесс проверки — это цикл от анализа требований до верификации реализации. Работа строится по следующим этапам:

  1. Анализ требований: Изучаю SRS, пользовательские истории, use case диаграммы. Выявляю неоднозначности и задаю уточняющие вопросы аналитикам/заказчику.
  2. Декомпозиция и проектирование проверок: Разбиваю высокоуровневые требования на проверяемые условия (test conditions). Для каждого определяю:
    • Позитивные сценарии (валидные данные).
    • Негативные сценарии (невалидные данные, ошибочные действия).
    • Граничные значения и классы эквивалентности.
  3. Создание тестовых артефактов: Пишу тест-кейсы, чек-листы или сценарии для автоматизации, которые напрямую ссылаются на ID требования в системе (например, Jira).
  4. Выполнение проверок и анализ результатов: Сравниваю фактический результат работы ПО с ожидаемым, описанным в требовании.

Пример автоматизированной проверки требования "Система должна блокировать учетную запись после 3 неудачных попыток ввода пароля":

import pytest

def test_account_lockout_after_three_failed_attempts(auth_api, test_user):
    """
    Проверка требования: [REQ-AUTH-007]
    """
    # Шаг 1-3: Три неудачные попытки входа
    for attempt in range(3):
        response = auth_api.login(test_user["login"], "WRONG_PASSWORD")
        assert response.status_code == 401  # Unauthorized
        assert response.json()["error"] == "Invalid credentials"

    # Шаг 4: Проверка, что учетная запись заблокирована
    response = auth_api.login(test_user["login"], test_user["correct_password"])
    assert response.status_code == 423  # Locked
    assert "account is locked" in response.json()["message"].lower()

    # Шаг 5 (дополнительный): Проверка, что корректный пароль также не принимается
    response_retry = auth_api.login(test_user["login"], test_user["correct_password"])
    assert response_retry.status_code == 423  # Должен оставаться заблокированным

Фиксация несоответствий: Любое отклонение фиксируется как дефект с четкой связью на требование, шагами воспроизведения, ожидаемым и фактическим результатом, а также уровнем серьезности (Severity).