Как вы находите информацию для тестирования при отсутствии формального технического задания (ТЗ)?

Ответ

В отсутствие ТЗ я действую по следующему алгоритму, чтобы выявить требования и ожидания:

Источники информации и действия:

  1. Анализ продукта и аналогов: Изучение функционала самой системы и похожих продуктов для понимания ожидаемого поведения.
  2. Техническая документация: Поиск спецификаций API (Swagger/OpenAPI), коллекций в Postman, комментариев в коде.
  3. Коммуникация с командой: Уточнение деталей у разработчиков, аналитиков или продакт-менеджера.
  4. Системы управления задачами: Изучение описаний в Jira, Asana, user stories для контекста.
  5. Применение эвристик: Опираюсь на общепринятые стандарты (например, эвристики юзабилити Якоба Нильсена) и best practices.

Почему важен этот подход: Он позволяет систематически восстанавливать контекст и минимизировать риски, связанные с неявными требованиями.

Пример для API-тестирования:

import requests
# Базовые smoke-тесты, основанные на анализе API-эндпоинта
def test_api_basics_without_spec():
    """Проверка базовой работоспособности и структуры ответа эндпоинта /users."""
    url = "https://api.example.com/users"
    response = requests.get(url)

    # 1. Проверка доступности
    assert response.status_code == 200

    # 2. Проверка формата ответа (предполагаем JSON)
    assert "application/json" in response.headers.get("Content-Type", "")
    data = response.json()

    # 3. Проверка базовой структуры (предполагаем список объектов)
    assert isinstance(data, list)
    if data:  # Если список не пуст, проверяем структуру первого элемента
        assert "id" in data[0]
        assert "name" in data[0]

Важно: Все выявленные допущения и неявные требования необходимо явно фиксировать и согласовывать с заинтересованными сторонами.

Ответ 18+ 🔞

Да ты посмотри на эту ситуацию, блядь! Сидишь такой, а тебе говорят: «ТЗ? А ТЗ — хуй! Нету его». Ну и что делать, в рот меня чих-пых? Ждать, пока кто-то с небес спустится и на ушко нашепчет? Не, так не работает.

Вот мой алгоритм, когда от тебя требуют результат, а что конкретно надо — нихуя не ясно. Это как идти в тёмный лес, но с фонариком из жопы.

Откуда я, сука, информацию высасываю:

  1. Ковыряюсь в самом продукте и его клонах. Открываю эту штуку и начинаю тыкать во все кнопки, как обезьяна с гранатой. Смотрю, что делает похожая система у конкурентов — может, они уже додумались, куда эту кнопку «сохранить» прилепить.
  2. Роюсь в техдоках. А там, блядь, обычно или пусто, или написано на языке древних марсиан. Но если повезёт — находишь Swagger, где хоть эндпоинты посмотреть можно, или комменты в коде вроде // TODO: переделать этот костыль, а то всё ебётся.
  3. Иду на поклон к людям. Тыкаю палкой разработчиков: «Слышь, а этот запрос что возвращает-то?». Спрашиваю аналитиков: «А пользователь-то, когда нажимает сюда, он в итоге чего хочет?». Иногда хоть крохи с барского стола падают.
  4. Листаю задачи в Jira. Там, в идеале, должна быть хоть какая-то зацепка. Но чаще всего там написано: «Сделать хорошо». Спасибо, кэп, ёпта.
  5. Включаю режим «А как должно быть по-человечески?». Есть же какие-то общепринятые правила, блядь. Кнопка отмены слева, сохранения — справа. Поле поиска — на видном месте. Пользуюсь этой базовой логикой, когда всё остальное — тёмный лес.

А зачем этот цирк? Да затем, сука, чтобы не получилось как в той басне: сделал ты всё, а тебе говорят — «Нет, мы хотели не это, ты совсем еблан?». Чтобы минимизировать этот пиздец.

Вот, смотри, как я бы API потрогал, если от него только название известно:

import requests
# Дымовые тесты для эндпоинта /users, когда про него нихуя не знаешь
def test_api_basics_without_spec():
    """Проверяю, не развалится ли всё к хуям при первом же запросе."""
    url = "https://api.example.com/users"
    response = requests.get(url)

    # 1. Первое и главное: оно вообще живо?
    assert response.status_code == 200, f"Оно дохлое, блядь! Код {response.status_code}"

    # 2. Оно мне текст в ответ прислало или JSON? Предполагаю, что JSON.
    assert "application/json" in response.headers.get("Content-Type", ""), "Что это за хуйня, а не JSON?"
    data = response.json()

    # 3. Ну и что там внутри? Список пользователей? Проверяю структуру на вшивость.
    assert isinstance(data, list), "Я ждал список, а мне подсунули какую-то хуйню!"
    if data:  # Если список не пустой, смотрю на первого попавшегося юзера
        assert "id" in data[0], "Где, блядь, айдишник?!"
        assert "name" in data[0], "И как его зовут-то, безымянный пидор?"

И самое главное, что ты должен делать после всей этой возни — всё, что ты предположил, все эти «а вдруг оно так работает» — нужно выписать на бумагу и тыкнуть этим всем под нос: «Люди! Я исходил из вот этого! Вы согласны? Или я не туда вообще пошёл?». Иначе потом будет овердохуища боли и переделок.