Где тестировать? Если вы можете изолировать какой-то функциональный элемент, то начните с него и протестируйте его с особой тщательностью. Далее определите, в каких местах системы интегрируются и как. От последнего зависит, насколько тщательно нужно тестировать интеграцию.

Где тестировать? GUI vs API

Вопрос: Есть ли какой-то проверенное правило для того, чтобы определить, где проводить тестирование? Как понять, в каких случаях нужно выбирать уровень GUI, а в каких API?

Ответ: Не думаю, что есть какой-то универсальный совет. Но я постараюсь описать, как я рассуждаю, когда решаю, где проводить тесты.

Чтобы выбрать между GUI и API тестом, я должен понять:

  • Что я собираюсь тестировать?
  • Могу ли я изолировать тестируемую функцию?

Ориентируйтесь на слово «изолировать». На мой взгляд, это и есть то самое правило номер один, про которое вы спрашиваете.

  • Тщательно протестируйте функции, которые можете изолировать
  • Далее тщательно протестируйте интеграцию для уникальной изолированной функции
  • Протестируйте интеграцию настолько тщательно, насколько того требует реализация
  • Протестируйте интеграцию на предмет непредсказуемого поведения
  • Менее подробно протестируйте моменты, в которых системы совпадают при интеграции

Например, в системе есть функция «создать пользователя», причем:

  • В GUI она является элементом интерфейса администратора
  • В API ее можно вызвать с помощью запроса в архитектуре REST

Выходит, мне нужно тестировать эту функцию на обоих уровнях, так как она не изолирована. Теперь я спрашиваю себя: что именно и насколько подробно нужно тестировать на каждом уровне?

Быть может, я решу вообще особо не тестировать в GUI, если GUI вызывает REST API, потому что я могу моделировать эту ситуацию в виде двух (как минимум) взаимодействующих систем. Система GUI и система API.

Далее я тщательно тестирую на уровне API те функции, которые изолированы в API, и менее тщательно – функции, находящиеся на пересечении GUI и API.

Также мне нужно протестировать функции, уникальные для GUI. Например, если GUI позволяет делать ajax-запросы, то тестировать эту возможность следует на уровне GUI.

В зависимости от разработки может оказаться, что ajax-запросы уже проверены с помощью unit-тестов JavaScript. Однако тесты не были интегрированы в страницу браузера или не проводились во всех браузерах и операционных системах, в которых используется GUI. Поэтому, исходя из используемых библиотек, я провожу кроссбраузерное тестирование и тесты в разных ОС.

Если GUI и API используют разные точки входа, придется тестировать оба пути. Здесь нужно проверить серверный код до того момента, когда будет обнаружен общий для двух интерфейсов код. При условии, что у REST API и серверной части GUI есть этот общий код. Также в этот момент нужно понять, насколько unit-тесты покрывают этот общий код.

Итак, мое правило можно записать в виде списка действий:

  • Постройте модель системы так, чтобы вы могли определить точки интеграции и общие «изолированные» функции;
  • Протестируйте изолированную функцию на самых нижних уровнях, которые вам доступны;
  • По очереди переходите к более высоким (или «одноранговым») уровням интеграции и абстракции и рассмотрите систему с точки зрения интеграции систем;
  • Ищите уникальные функции, присущие более высоким (или «одноранговым») уровням абстракции. Их надо тестировать именно здесь:
  • Если вы проверяете некий функционал изолированно, создавая mock-объекты интегрированных систем, то вам может понадобиться оценить технические риски и решить, нужно ли будет использовать эту функцию после интеграции, и если да, то как часто.

По-другому этот процесс можно представить вот так:

  • Создайте несколько пересекающихся моделей системы;
  • Проверьте тестовое покрытие моделей системы;
  • Проверьте тестовое покрытие потоков, идущих через разные модели системы;
  • Рассмотрите технические риски, связанные с реализацией и средой, в которой работает система;

PS. Когда я все это объясняю, люди часто сопоставляют мой способ со своей любимой моделью пирамиды. Я не использую модели пирамид. Предпочитаю создавать модель системы, с которой работаю, а не полагаться на шаблон. Другие люди, впрочем, предпочитают модели пирамид.

Перевод статьи «Should I test at the GUI Level or the API Level?» by Alan Richardson