Ад масштабирования. Цветные кружки — типы экранов
Схема системы
```
// Координатор находит нужный метод через рефлексию
client := h.clients[suite.ClientName]
method := reflect.ValueOf(client).MethodByName(suite.HandlerName)
// Создает входную структуру и заполняет данными из тест-кейса
inValue := reflect.New(method.Type().In(1).Elem())
// ... заполнение полей Input, Output, Interactions
// Вызывает метод
results := method.Call([]reflect.Value{reflect.ValueOf(ctx), inValue})
``````
// Две строки - и клиент к хранилищу подменён
mwFactory := autotestswrapper.ClientMiddlewareFactory(in.Interactions)
storageClient := briefrpc.ClientFor[storage.Server](
mwFactory.Option(storage.Name),
)
```mwFactory := autotestswrapper.ClientMiddlewareFactory(in.Interactions)
storageClient :=
briefrpc.ClientFor[storage.Server](mwFactory.Option(storage.Name))
configClient := briefrpc.ClientFor[config.Server](mwFactory.Option(config.Name))storageAdapter := storage.New(storageClient)
configAdapter := configurator.New(configClient)
orderService := order.New(storageAdapter, configAdapter)
handler := next_page.New(orderService)err := handler.Handle(ctx, req, resp)
if err := assertJSONEqual(in.Output, resp.Data); err != nil {
out.Status = "failed"
out.ErrorMessage = err.Error()
} else {
out.Status = "ok"
}```
{
"clientName": "my-service-api",
"handlerName": "RunNextPageTests",
"testCaseStep": 3,
"testCase": {
"input": "{\"requestType\":\"repair\",\"pageNumber\":1}",
"output": "{\"success\":{\"params\":{\"PageTitle\":\"Где делаете
ремонт\"}}}",
"interactions": {
"geo-service.getLocation": "{\"city\":\"Москва\"}",
"storage-service.isFormOwner": "{\"isOwner\":true}"
}
}
}
```Итоги
Все началось с того, что обычные E2E-тесты перестали работать. Сотни сценариев, множество сервисов, каждый новый конфиг — и непонятно, где возникнет ошибка. Поддерживать такой массив было невозможно.
Система фейков не решила все проблемы, но помогла перестать создавать тысячи тестов вручную. Мы научились генерировать их из описания бизнес-логики, запускать регресс на проде без тестовых пользователей и получать точную информацию о нарушениях после изменений.
Конечно, подход создан под нашу специфику: сложные сценарии, много данных, несколько сервисов в цепочке. Если у вас похожая боль — возможно, это пригодится. Но даже так система сэкономила время, уберегла от нескольких регрессов и дала уверенность.
Координатор и библиотека подмены универсальны. Они не знают о формах, экранах и категориях услуг. Любая команда может подключить свои сервисы и написать свой генератор тест-кейсов поверх готовой инфраструктуры.
Главный вывод для нас: не обязательно жестко делить тесты на «интеграционные» и «сквозные». Можно взять от каждого лучшее и сделать гибрид, который работает именно в вашем случае.