Я не могу раскрыть примеры моих репозиториев из-за политики конфиденциальности компании, поэтому постараюсь рассказать абстрактно, насколько это возможно.
Все знают, как писать тест-кейсы (конкретный тест кейс). В интернете достаточно статей на эту тему. Но вот как составлять карту тест-кейсов, особенно в условиях микросервисной архитектуры? Какую стратегию для этого выбрать? На эту тему я до сих пор не встречала хорошей статьи. Поэтому вот вам одна из них ?)
Предпосылки
У меня сейчас несколько доменов: Определения личности пользователя, Санкции, Микрофронтенд, Апп приложение маркет. Я также унаследовала и занималась переносом тест-кейсов из очень множества других проектов: фрод, магазины, банковские карты, кабинет пользователя и прочее.
Когда эти проекты поступали в тестирование, их "нужно было сдать еще вчера". поэтому наа продумывание структуры тест-кейсов не было времени. Делали опираясь на общий подход и здравый смысл. Со временем команда выделила ресурс и я составила стратегию написание и расположения тест-кейсов в репозитории.
С чего начать?
Не будем изобретать велосипед и применим C4-модель (Context, Container, Component, Code) к нашему репозиторию. Эта модель позволяет структурировать сложные системы от контекста до отдельных компонентов.
Первый уровень: Контекст (Context)
“Контекст (Context): показывает систему в окружении пользователей и взаимодействующих с ней внешних систем.”
Первый уровень тест-кейсов содержит следующие папки:
Бекенд
Веб
Мобаил
Интеграции
- Integration cases
- ...
- Back end cases
- ...
- Front end (Web) cases
- ...
- Front end (Mobile) cases
- ...
Бэкенд — это "сердце" системы, обеспечивающее обработку данных, выполнение бизнес-логики, взаимодействие с другими частями системы и внешними сервисами. Бекенд может тестироваться не зависимо от фронта проверяя заложенную бизнес логику. Тест-кейсы в этой категории фокусируются на проверке бизнес логики заложенной в сервисе бекенда.
Веб — это точка взаимодействия конечного пользователя с системой. Это та часть системы, которая "общается" с бэкендом для получения данных. Тест-кейсы этой папки фокусируются на 1) проверки сценарии пользователя, 2) проверке верстки и внешнего вида системы.
Мобайл - это другая точка взаимодействия пользователей с системой. Она функционирует как самостоятельный клиент. Тест-кейсы из этой папки также проверяются сценарии пользователя и внешний вид системы.
-
Интеграции — это папка содержит тест-кейсы которые проверяют взаимодействие нашей системы с внешними системами и микросервисами которых вызываем мы и которые вызывают нас. Точки входа в нашу систему и точки выхода из нашей системы проверяется здесь. В условиях микросервисной (а именно такая архитектура у нас в компании) архитектуры это подход жизненно необходим. Мы отделяем точки входа и точки выхода из системы в отдельный под каталог.
К примеру если наш репозиторий тестирует систему проверки личности то тест-кейсы на внешную систему (например магазин), которая вызывает эту проверку, будет лежать тут.
Почему такое деление:
Разделение зон ответственности: Это деление позволяет четко разграничить области системы, которые должны покрываться тестами. Оно делает тесты более структурированными и упрощает навигацию по проекту. Каждая папка (сьют набор) имеет свой контекст и этот контекст является целью тестирования этого сьюта. К примеру тест-кейсы на веб и на мобиле начинаются с момента когда все внешние условия (пред условия) входа в систему были выполнены (в Pre-conditions) и не важна, как мы попали в систему (через моки или через путь пользователя). Эти тесты сфокусированы на тестирования конкретно нашей системы а не пред условий. Тест-кейсы на интеграции фокусируются на интеграции (вызов нашей системы из магазина например).
-
Физическая граница: Разделение по типам системы (бэкенд, веб, мобайл) соответствует физической границе контекста. Различные части системы часто находятся в разных репозиториях, разрабатываются разными командами. Это создает естественные границы, облегчающие управление тестами и их будущую автоматизацию.
Второй уровень: Контейнеры (Containers) - Integration
Контейнеры (Containers): детализирует основные исполняемые элементы системы и их взаимодействия.
- Integration cases
- User portal
- Shops
...
В разрезе папки интеграционных тестов контейнерами мы считаем интеграции со сторонними сервисами (например, "Shops", "User portal").
Это дает следующие плюсы:
Логическая изоляция и распределение ответственности: Каждое направление (например, Shops, User portal) представляет отдельную область ответственности сторонней системы.
Явное разделение видов интеграции: Деление по видам интеграции позволяет четко выделить границы каждого контейнера.
Пример из проекта Микрофронт
Shops интеграция: Она проверяется точку входа в Microfront KYC flow. Эти тест-кейсы проверяет 1) что для нового пользователя в сервисе Shops есть вход в KYC flow 2) что для старого пользователя входа в вход в KYC flow нет (он прошел ее в прошлом).
Второй уровень: Контейнеры (Containers) - Back end
Для back end проекта я использую следующий подход: я выделяю основные ключевые сущности бекенда, например: session, event, order, cart. После этого создает тест-сью тестирующий эти сущности. В тест-сьюте, связанным с каждой из этих сущностей, будут находиться тест-кейсы, фокус тестирования которых будет направлен на соответствующую сущность.
Это подход позволяет держать фокус тестирования на одном объекте и не пытаться в одном ТК проверить все.
Пример:
В тестах на order происходит создание session и отправка events, но проверка session или event не является часть этих ТКs. Фокус проверки в этих ТКс лежит на order сущности.
Аналогично, основная проверка events осуществляется в разделе тестов, посвященных events. Когда проверяется event на создания (это может быть создание order или другой обект) фокус в этих тестах идет на проверке event логики.
Второй уровень: Контейнеры (Containers) - Front end and Mobile
Переходим к самому интересному разделу — Front end.
Пример №1: Микрофронтенд
Возьмём пример — микрофронтенд и порассуждаем о нём. В этой системе есть проверка личности и провайдеры, которые выполняют эту проверку.
Здесь можно выделить три подхода для определения следующего уровня вложенности:
Бизнес сущность провайдер: Разделить тест-кейсы по провайдерам, а дальше ввести деления на функциональные и UI сценарии. Здесь упор делается на уникальность провайдеров во flow.
Тип тестов: Разделить тест-кейсы на функциональные и UI, а уже внутри делать деление по провайдерам. Здесь упор делается на уникальность провайдера во flow.
Возможно, что-то ещё?
На данный момент у меня нет единого подхода.
1. Разделение тест-кейсов по провайдерам → функциональные и UI сценарии
Плюсы:
Логичная структура, если зависимость от провайдера - это ключевая бизнес зависимость системы (например, различия в законодательстве, локализации).
Легко находить тесты для специфического провайдера, что важно для быстрого обновления локальных функциональностей.
2. Разделение тест-кейсов на функциональные и UI → провайдеры
Плюсы:
Четкое деление по типу тестов позволяет лучше контролировать покрытие (где именно есть пробелы: функциональность или UI).
Удобно для модульного тестирования, если команда или процессы организованы по уровням (например, одна команда отвечает за функциональные тесты, другая — за UI). Проще автоматизировать: тест-кейсы с замоканным бекендам лежат в UI папке. Тест-кейсы для e2e тестов лежат в папке функциональные тест-кейсы.
Минусы:
Дублирование структуры папок: в каждом каталоге будут повторяться одни и те же подкаталоги для каждого провайдера.
Как выбрать оптимальный вариант?
Я считаю здесь могут быть разный подход в зависимости от команды и проекта. Мой подход следующий:
Первый уровень деление на функциональные и UI-тесты.
Внутри них создается вложенность по провайдерам.
- Functional Tests
- [Provider_1]
- Test case 1
- Test case 2
- [Provider:2]
- Test case 1
- Test case 2
- UI Tests
- [Provider_1]
- Test case 1
- Test case 2
Этот подход позволяет мне чётко разграничивать функциональные и UI-тесты (для дальнейшей автоматизации)
Пример №2: Пользовательские проверки
Пользовательские проверки анализируют определённые проверочные данные пользователя. Каждая проверка является атомарной и может выполняться независимо от остальных.
Для этого проекта мы выбрали другое деление:
- Front end (Web)
- Проверка 1
- Functional cases
- UI check cases
- Проверка 2
- Functional cases
- UI check cases
- Front end (Mobile)
- Проверка 1
- Functional cases
- UI check cases
Почему так?
Основное разделение по проверкам связано с их природой как независимых модулей. Проверка 1 может быть вызвана одна (без других проверок). Проверки в интерфейсе атомарные единицы (их набор может быть от 0 до 5).
По сути, каждая проверка это отдельный контейнер внутри микросервиса. Каждая проверка — это самостоятельная область ответственности, и выбранная структура чётко это отображает.
Итог:
Для Микрофронтенд я бы выбрала подход с делением на функциональные и UI-тесты → провайдеры, потому что это позволит в будущем лучше покрывать автотестами эти ТКс.
Для Проверок я бы выбрала деление по модулям (проверкам) так как оно лучше отражает природу системы и её тестируемые области.
Третий уровень: Component (Front/Mobile)
Компоненты (Components): Показывает детализацию одного из контейнеров, разложенного на отдельные части (компоненты), каждая из которых реализует конкретную функциональность.
Для создания и организации тестов внутри контейнера мы придерживаемся принципа разделения ответственности и группировки по компонентам. Обычно этот слой мы примеряем только для Front/Mobile тестов. В других папках такая вложенность избыточна.
Для UI тестов рекомендуется разделять проверки каждого экрана на отдельные тест-кейсы. Такой подход упрощает управление тестами, повышает их поддерживаемость и обеспечивает прозрачность результатов.
Дополнительно, мы выделяем проверки модульного функционала в отдельные тест-кейсы. К примеру:
Проверка поиска,
Проверка восстановления пароля,
Проверка навигации,
Проверка валидации данных.
Основная идея такого подхода заключается в декомпозиции функционала приложения на независимые компоненты. При написании тест-кейсов мы акцентируем внимание на изоляции проверяемых функций, что позволяет минимизировать взаимное влияние компонентов.
Правила которые помогают проверить тест-кейсы на правильную группировку
Для проверки тест-кейсов на правильную архитектуру можно применять следующие правила (опираясь на принципы гранулярности микросервисов):
Принцип единственной ответственности: Каждый тест-кейс должен проверять одну конкретную функциональность или аспект системы. Это способствует ясности и упрощает идентификацию и устранение дефектов.
Ограниченный контекст: Тест-кейсы следует группировать по логическим модулям или компонентам системы, обеспечивая, чтобы каждый тест-сьют охватывал определенный контекст без пересечения с другими областями.
-
Связанность и связность:
Высокая связность: Тесты внутри одного сьюта должны быть тесно связаны по смыслу, проверяя различные аспекты одной и той же функциональности.
Низкая связанность: Минимизируйте зависимости между различными наборами тестов (сьютов), чтобы изменения в одной части системы требовали изменения только соответствующего тест-сьюта.
Принцип общего повторного использования: Объединяйте в один тест-кейс проверки, которые всегда изменяются совместно, чтобы избежать избыточности.
Принцип общего закрытия: Тесты, которые могут изменяться по одним и тем же причинам, следует группировать вместе, чтобы упростить их поддержку и обновление при внесении изменений в систему.
Принцип ацикличности зависимостей: Структурируйте тесты так, чтобы избежать циклических зависимостей, обеспечивая независимость и модульность тестов.
Полезные советы
Полезный совет №1:
Делайте глоссарий в вашем репозитории тест-кейсов - общий глоссарий поможет унифицировать подход к написанию тест-кейсов.
Введите определение основных терминов, чтобы не было путаницы в их интерпретации.
Четко обозначьте, что является системой для тестирования и покрытия тестами данного репозитория (фокус).
Полезный совет №2:
Добавляйте ссылки в описания тест-сьютов. Можно использовать общий подход документирования, где в описание сьюта указываются ссылки на:
Задачу в системе трекинга задач (Jira например).
Notion - Документацию фичи (если она есть).
Miro – ссылка на схему или процесс, разработанный для фичи.
Полезный совет №3:
Разделяйте тест-кейсы по репозиториям. Если вы тестируете большой домен, состоящий из 10 микросервисов, оптимальным решением будет разделить общий репозиторий с тест-кейсами этого домена на подрепозитории. Это позволяет не размазывать фокус тестирования.
win42
Глобально это то, к чему тестировщик приходит и формулирует для себя сам. Это логически правильный и самый удобный способ приведения репозитория в порядок.
Глобально для себя я тоже не нашел правильного ответа на метод разделения тестов. Либо дублирование дерева и несколько более затруднительные поиск и актуализация ТК, либо помойка из большого количества кейсов в каждой папке. Пока побеждает помойка. В такой ситуации обычно все сводится к чрезмерному разделению тестов по папкам и ветвистость дерева папок достигает абсурдных значений. Важно вовремя остановиться и понять, что более 4-5 уровней вложенности уже превращают тестовую модель в лабиринт минотавра, из которого дано выбраться не каждому тестеру
P.S. Совет автору - вычитывайте или давайте на вычитку кому-нибудь свой текст, т.к. в нем очень много опечаток на текущий момент. Статья хорошая и ей есть смысл поделиться как минимум с несколькими тестерами в моей команде, но читать сейчас больновато
velizaryan Автор
Вычитывала текст (даже прогоняла через GPT) но видимо остались косяки. Если не сложно можешь в личну написать где косяки есть самые жирные (завтра еще свежим взглядом гляну)
velizaryan Автор
Про уровень вложенности неистово плюсую. Вообще в итоге мы наши кейсы разбили на 3 репозитория с фокусом на тестирования определенного микросервиса или группы микросервисов. Хотя изночально у нас был репозиторий всего домена