Ответ
Качественный автотест соответствует принципам 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