Что такое двухуровневая архитектура (клиент-сервер)?

Ответ

Двухуровневая архитектура (2-tier, клиент-сервер) — это модель, в которой приложение четко разделено на два логических компонента:

  1. Клиент (Frontend / Presentation Tier): Отвечает за пользовательский интерфейс и представление данных. Это может быть десктопное приложение, браузер или мобильное приложение.
  2. Сервер (Backend / Data Tier): Отвечает за бизнес-логику, обработку запросов, работу с базой данных и предоставление данных клиенту.

Подход к тестированию такой архитектуры:

  • Раздельное тестирование компонентов:

    • Клиент: Юзабилити-тестирование, кросс-браузерное/кросс-платформенное тестирование, проверка корректности отображения данных, полученных с сервера.
    • Сервер: Модульное и интеграционное тестирование API, тестирование бизнес-логики, нагрузочное тестирование эндпоинтов.
  • Интеграционное тестирование связи:

    • Проверка корректности обмена данными (форматы JSON/XML, коды ответов HTTP).
    • Тестирование обработки ошибок на стороне сервера и их адекватного отображения на клиенте.
    • Проверка безопасности: аутентификация, авторизация, валидация входящих данных на сервере.

Пример тест-кейса для проверки интеграции:

Сценарий: Пользователь создает заказ через UI.
Шаги:
1. На клиенте заполняем форму заказа и нажимаем "Отправить".
2. Клиент отправляет POST-запрос на серверный эндпоинт `/api/orders`.
Ожидаемый результат:
- Сервер отвечает статусом 201 Created и JSON с ID нового заказа.
- Клиент корректно отображает сообщение об успехе и ID заказа.
- Данные заказа появляются в базе данных.

Варианты негативного тестирования:
- Отправка пустого тела запроса -> сервер возвращает 400 Bad Request -> клиент показывает понятную ошибку.
- Потеря сетевого соединения -> клиент показывает уведомление о попытке повторной отправки.

Преимущества для тестирования: Четкое разделение позволяет эффективно использовать автоматизацию для API-тестирования сервера независимо от клиента.

Ответ 18+ 🔞

Ну слушай, вот есть у нас эта классика жанра — двухуровневая архитектура, или как её ещё обзывают, клиент-сервер. Представь себе, блядь, обычную столовую: есть раздача (это сервер), а есть ты с подносом (это клиент). Всё, больше никого. Никаких промежуточных шеф-поваров, которые тебе салат перекладывают. Просто и понятно, как два пальца обоссать.

Клиент (Фронтенд) — это твоя рожа, уткнувшаяся в экран. Всё, что ты видишь: кнопочки, поля, анимации, когда что-то грузится. Может быть браузер, мобильное приложение или какая-нибудь десктопная программа. Его задача — красиво нарисовать данные и принять твои клики.

Сервер (Бэкенд) — это, ёпта, та самая кухня, скрытая от глаз. Там вся магия: логика, расчёты, работа с базой данных. Клиент стучится к нему: «Эй, дай мне список товаров!», а сервер в ответ: «На, жри, только в JSON-е, как договаривались».

А теперь как это всё тестировать, чтобы не обосраться в итоге?

  • Тестируем по отдельности, как будто они незнакомы.

    • Клиента гоняем по полной: удобно ли, не разъезжается ли вёрстка в разных браузерах, правильно ли отображает то, что ему сервер плюнул в ответ. Чисто внешний вид и реакции.
    • Сервер долбим отдельно, без всяких интерфейсов. Пишем автотесты на его API: правильно ли считает бизнес-логику, не падает ли от кривых данных, выдержит ли овердохуища запросов. Это как проверять двигатель машины, не садясь в салон.
  • А потом сводим их и смотрим, не подерутся ли.
    Вот это самое важное — интеграция. Тут мы проверяем, как они общаются.
    — Клиент отправил запрос в неправильном формате? Сервер должен ему вежливо, но твёрдо послать нахуй (то есть статус 400), а клиент — не сгореть, а показать человеку внятную ошибку. Доверия ебать ноль между ними быть не должно, всё должно быть чётко по протоколу.
    — Проверяем безопасность: чтобы без пароля никто в систему не влез, а если и влез, то увидел только то, что положено. Подозрение ебать чувствую ко всем входящим запросам на сервере должно быть.

Вот тебе пример, как это выглядит в жизни:

Сценарий: Юзер создаёт заказ.
Шаги:
1. На клиенте тыкает кнопки, заполняет поля и жмёт «Купить».
2. Клиент, недолго думая, шлёт POST-запрос на `/api/orders` с данными заказа.
Ожидаемый результат:
- Сервер, если всё ок, отвечает: «201 Created» и скидывает ID заказа.
- Клиент радостно пишет: «Заказ №12345 оформлен!».
- В базе данных этот заказ реально появляется, а не хуй в пальто.

А если что-то пошло не так:
- Отправили пустой запрос -> сервер ругается (400), клиент показывает: «Братан, заполни поля».
- Пропал интернет -> клиент не тупо впадает в кому, а пишет: «Сеть сдохла, пробуем отправить ещё раз».

В чём, блядь, кайф для тестировщика?
Да в том, что серверную часть можно насиловать автотестами в полной изоляции, не завися от того, готов ли интерфейс. Пока дизайнеры и фронтендеры спорят про тени кнопок, ты уже можешь проверить всю логику и API. Это, сука, очень удобно.