← Java

Після цього уроку ви зможете

Конспект і таймкоди

0:00

Consumer, producer і REST resources

Звична client–server model узагальнюється термінами consumer і producer. Consumer споживає дані або можливість, producer їх надає. Така мова працює не лише для browser і web server, а й для взаємодії між сервісами.

Комунікація має protocol і contract. API-документації може не бути, вона може бути написаною вручну і застарілою або code-generated з анотацій у коді. У REST сутності представлені resources, а операції над ними — endpoints з HTTP-методами GET, POST, PUT, DELETE.

2:28

Ланцюжки сервісів і технічний борг

Один і той самий service може бути producer для одного виклику і consumer для іншого. Тому response, яку отримує frontend, може залежати від кількох внутрішніх викликів.

Чиста теоретична модель не завжди збігається з production: дедлайни змушують команду накопичувати technical debt і порушувати ідеальні межі. Тестувальник має досліджувати фактичні зв’язки, а не покладатися лише на назви сервісів.

4:00

Моноліт, модульний моноліт і мікросервіси

У моноліті business logic, email, SMS, persistence та integrations розгортаються як один application. Це не є автоматично погано: добре структурований моноліт простіший у розробці і не платить network latency за кожен внутрішній виклик.

Модульний моноліт розділяє functionality всередині одного deployment і може зберігати окремі data boundaries. Мікросервісна архітектура виносить ці частини у незалежні services, але додає HTTP, serialization, handshakes, deployment і distributed failure modes.

6:10

Gateway і вкладена архітектура

Gateway може бути зовнішньою обгорткою над одним або кількома services. Тому один квадрат на high-level diagram може приховувати власну базу, декілька внутрішніх services і нові integrations. Кожен із цих components можна «наблизити» і знову побачити нову архітектуру.

На новому проєкті варто попросити lead або developer намалювати таку service map, а потім уточнювати data stores і взаємодії. Це безпосередньо впливає на test design: де готувати state, які контракти перевіряти і де локалізувати падіння.

Практика

Намалювати test-aware service map

  1. Вибрати один user flow і намалювати client, gateway, services, databases і brokers.
  2. Позначити synchronous і asynchronous contracts, state setup і failure boundaries.
  3. Для кожної boundary записати одну contract check і одну end-to-end check.

Результат: Одна діаграма, за якою видно, де готувати data і як локалізувати test failure.

8:55

Event-driven communication і message broker

Сервіс orders може публікувати подію в Kafka або інший broker, а consumer — зчитувати її і оновлювати status. Асинхронна queue допомагає приймати spikes швидше, ніж downstream встигає повністю опрацювати кожен order.

Це не усуває навантаження, а змінює його форму і час. Для тесів з’являються окремі питання: чи опубліковано подію, чи вона була опрацьована, що відбувається з retries, duplicates і відкладеною consistency.

Що змінилося після запису

Kafka — ширше, ніж queue

АктуальноKafka stores events durably in partitioned topics; reading does not itself remove an event. Retention, replay і ordering within a partition мають бути частиною test design.

Що змінилосяЦе уточнення навчального спрощення, а не зміна після запису.

Перевірено 2026-07-31

Термін

Kafka event streaming

Поєднання publish/subscribe, durable event storage і stream processing; producers публікують events, consumers їх читають і опрацьовують.

11:30

Hexagonal architecture як структура коду

Гексагональна архітектура пояснює, як декомпозувати сервіс за відповідальністю та способом взаємодії з довкіллям. Окремі adapters працюють з REST, WebSocket, email, SMS, database, message queue і third-party services, не змішуючи все в одному класі.

Для тестувальника такий поділ дає карту ports і failure seams: можна окремо перевірити domain behavior, adapter contract і повний ланцюжок інтеграції.

13:02

REST, status codes і централізовані errors

Для API automation потрібно окремо вивчити REST semantics: methods, resources, типові status codes і їхню очікувану поведінку. Public endpoints зазвичай оптимізовані для frontend або зовнішніх clients, private endpoints можуть обслуговувати внутрішню service-to-service communication і мати інший контракт.

Самого HTTP status недостатньо. Централізований error handling має повернути consumer стабільний internal error code і зрозуміле пояснення: якого поля бракує або яке значення невалідне. Власні HTTP status codes на кшталт 600 не замінюють нормального error contract.

Термін

HTTP status code

Тризначний code у межах 100–599, який повідомляє result HTTP request; 600 і вище не є valid HTTP status codes.

15:45

Protocols, API Gateway і Backend for Frontend

Окрім REST, системи використовують WebSocket, gRPC і GraphQL. Протокол обирається під задачу, тому перед автоматизацією потрібно зрозуміти не лише endpoint, а й модель комунікації.

Backend for Frontend — це gateway з контрактом, зручним для конкретного client: web frontend, mobile application або окремого screen. Зовні він відкриває потрібні resources, а всередині може агрегувати кілька services з їхніми базами і queues.

Термін

GraphQL resolver

Server-side function для schema field, яка отримує value з application code, database або downstream service. GraphQL не виконує service discovery самостійно.

17:23

GraphQL як агрегатор даних

У GraphQL client зазвичай звертається до одного endpoint і в request описує потрібні fields та зв’язки. Queries читають дані, mutations змінюють їх. Якщо екрану потрібні user і всі його pets, GraphQL layer сам визначає, які downstream services викликати і як звести результат.

Для тесів важливо знати цей internal mapping. Тоді покриття можна розділити за downstream service і полем, а при падінні однієї частини очікувати точний набір failures, а не безадресне падіння всіх API-тесів.

Що змінилося після запису

GraphQL aggregation визначають resolvers

АктуальноGraphQL schema і resolver implementation, а не GraphQL standard сам по собі, визначають, які databases або downstream services викликаються для field.

Що змінилосяЦе уточнення формулювання, а не зміна специфікації.

Перевірено 2026-07-31

Що змінилося після запису

GraphQL-over-HTTP не обмежується POST і status 200

АктуальноCurrent GraphQL-over-HTTP draft requires POST support, permits GET for query operations, forbids GET for mutations and defines non-200 status handling. Тому transport contract треба тестувати за media type і operation, а не очікувати 200 для кожної відповіді.

Що змінилосяТочну транспортну специфікацію відео не називає; перевірено проти current draft 2026-07-31.

Перевірено 2026-07-31

Термін

GraphQL operation

Query є read-only fetch, mutation — write followed by fetch, subscription — long-lived event-driven request. Selection set визначає fields, які client очікує у response.

20:21

Глибина розуміння і жива діаграма

Для складних API-тесів недостатньо знати request syntax. Потрібно «занурюватися» у систему: знаходити природу помилки, відтворювати ланцюжок залежностей і розуміти, де закінчується контракт однієї частини і починається інша.

Автор радить підтримувати живу діаграму у Figma або Miro: ліворуч — архітектура і зв’язки, праворуч — test baselines і шаблони перевірок для окремих components. Така карта покращує онбординг, локалізацію дефектів і планування покриття.

Джерела та додаткові матеріали