Какими свойствами должен обладать хороший автоматизированный тест?

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

Ответ

Качественный автотест соответствует принципам FIRST и другим best practices:

  • F — Fast (Быстрый) Тесты должны выполняться быстро, чтобы давать быструю обратную связь и не тормозить CI/CD.

  • I — Independent/Isolated (Независимый/Изолированный) Тест не должен зависеть от состояния, оставленного другими тестами, или от внешних сервисов (используйте моки/стабы).

  • R — Repeatable (Повторяемый) Результат теста должен быть детерминированным: при одинаковых входных данных и окружении он всегда дает один и тот же результат.

  • S — Self-Validating (Самопроверяемый) Тест должен однозначно завершаться статусом PASS или FAIL без необходимости ручной интерпретации логов.

  • T — Timely (Своевременный) Тест должен быть написан в нужное время (часто — сразу после реализации фичи).

Дополнительные критически важные свойства:

  • Читаемость и простота (Readable/Simple) Код теста должен быть понятен. Используйте паттерны типа Arrange-Act-Assert (AAA).
  • Поддерживаемость (Maintainable) Тест должен быть устойчив к незначительным изменениям в UI/API. Использование Page Object Model (POM) для UI-тестов помогает в этом.
  • Проверяет одну вещь (Focused) Один тест — одна ответственность. Это упрощает отладку при падении.

Пример хорошего автотеста (Python, pytest):

import pytest

def test_user_can_add_item_to_cart(authenticated_user, clean_cart):
    # Arrange: Подготовка данных и состояния
    item = Item(id=123, name="Test Book", price=29.99)
    catalog_page = CatalogPage()
    cart_page = CartPage()

    # Act: Выполнение тестируемого действия
    catalog_page.open()
    catalog_page.add_item_to_cart(item.id)
    cart_page.open()

    # Assert: Проверка ожидаемого результата
    cart_items = cart_page.get_items()
    assert len(cart_items) == 1
    assert cart_items[0].name == item.name
    assert cart_items[0].price == item.price