Vladislav Mukhamatnurov
QA Lead + Python dev
Влад Мухаматнуров
Функциональное тестирование приложения:
1. Тестирование REST-приложения
2. Стабы для тестирования
3. Архитектура сложного сервиса
Сквозное тестирование приложения:
4. Определение сквозного тестирования
5. Способы создания сквозных тестов
6. Примеры тест-кейсов
Инфраструктура сквозного тестирования
7. Подходы к тестированию сборки
8. Тестирование на основе контейнеров
9. Использование docker-compose
Подведение итогов
Сервис 1
Сервис 2
Сервис 3
Сервис
2.1
Сервис
2.2
Сервис
2.3
ЧТО мы хотим протестировать?
Сервис 1
Сервис 2
Сервис 3
Сервис
2.1
Сервис
2.2
Сервис
2.3
КАК мы хотим протестировать?
Входное воздействие
Сервис
Другой
сервис
Сервис
2.1
Сервис
2.2
Сервис
2.3
Результат воздействия
связанные с соседними сервисами:
Входное воздействие
Сервис
Другой
сервис
Сервис
2.1
Сервис
2.2
Сервис
2.3
Результат воздействия
Входное воздействие
Сервис
Стаб
Стаб
Результат воздействия
Стаб
Стаб
Входное воздействие
Сервис
Другой
сервис
Сервис
2.1
Сервис
2.2
Сервис
2.3
Результат воздействия
как набора сервисов
API
Сервис
А
Сервис
B
Очередь
БД
API
Сервис A
Сервис B
API 1
API 2
API N
...
СA 1
СA 2
...
CA M
СB 1
СB 2
...
CB Z
API:
N нод
Сервис А:
M нод
Сервис B:
Z нод
Очередь
БД
API 1
API 2
API N
...
СA 1
СA 2
...
CA M
СB 1
СB 2
...
CB Z
Очередь
API 1
Балансирощвик
API 2
API N
...
СA 1
СA 2
...
CA M
СB 1
СB 2
...
CB Z
БД
Входное воздействие
Другой
сервис
Стаб
Стаб
Сервис
2.3
Результат воздействия
Сервис
Сервис
=
Входное воздействие
Другой
сервис
Стаб
Стаб
Сервис
2.3
Результат воздействия
Фреймворк Tavern, на основе pytest
test_name: Тест API
marks:
- end2end
usefixtures:
- x_trace_id
- host
stages:
- name: Входное воздействие #1
request:
headers:
X-TRACE-ID: '{x_trace_id}'
json:
param1: value1
param2: value2
method: POST
url: '{host}/my_handler1'
response:
status_code: 200
body:
result: 'Success'
Много этапов
test_name: Многоэтапный тест
stages:
- name: Входное воздействие #1
request:
...
response:
...
- name: Входное воздействие #2
request:
...
response:
...
...
- name: Входное воздействие #N
request:
...
response:
...
SetUp / TearDown
from my_utils import (
generate_x_trace_id,
prepare_state,
clear_state,
)
from my_settings import APISettings
@pytest.fixture(scope="session")
def host() -> str:
return APISettings.url
@pytest.fixture(scope="function")
def magic_fixture(host) -> None:
prepare_state(host)
yield
clear_state(host)
test_name: Тест
marks:
- end2end
usefixtures:
- host
- magic_fixture
stages:
- name: Входное воздействие
...
- name: Проверка результата
...
(фреймворк для имплементации шаблонов)
Фреймворк pytest_bdd, на основе pytest
Сценарий: Перевод денег по номеру телефона на Тинькофф
Когда я пишу "переведи деньги Саше"
То бот отвечает текстом "Сколько переводим?"
И бот показывает подсказки $HINTS(100₽; 200₽; 300₽; 500₽; 1000₽; 2000₽; 5000₽)$
Когда я выбираю подсказку 1
То бот показывает виджет $WIDGET(buttons=Отменить;Перевести)$
И бот показывает подсказки $HINTS(Другая сумма; Другому человеку; На Сбербанк)$
Когда я нажимаю кнопку виджета "Перевести"
То бот отвечает текстом "Деньги отправлены"
API
Сервис A
Сервис B
Очередь
БД
ver 1.23
ver 1.23
ver 1.23
Доставка очередной версии приложения
на тестовый контур
Развертывание очередной версии приложения при помощи агента и контейнеров
на тестовый контур
(автоматическая)
до раскатки кода на тестовый контур,
что оно корректно выполняет свои основные бизнес-функции
сборок на подготовленной инфраструктуре:
services:
base:
image: "app/app-base:${CONTENT_HASH}"
build:
context: .
dockerfile: docker/base.dockerfile
network: host
services:
...
base:
image: "app/app-code:${BUILD_NUMBER}"
build:
context: .
dockerfile: docker/code.dockerfile
network: host
args:
BUILD_NUMBER: "${BUILD_NUMBER}"
services:
...
api:
image: "app/app-code:${BUILD_NUMBER}"
command: "/bin/api"
volumes:
- ./volume:/code/folder
environment:
- VAR1=${VAR1:-unset}
- VAR2=${VAR2:-unset}
- VAR3=${VAR3:-unset}
env_file:
- docker/environments/${ENV:-unset}.env
ports:
- 8765:8765
depends_on:
- db
- redis
- kafka
services:
...
service_N:
image: "app/app-code:${BUILD_NUMBER}"
command: "/bin/service_N"
volumes:
- ./volume_N:/code/folder_N
environment:
- VAR_N1=${VAR_N1:-unset}
- VAR_N2=${VAR_N2:-unset}
- VAR_N3=${VAR_N3:-unset}
env_file:
- docker/environments/${ENV:-unset}.env
ports:
- 8760:8760
depends_on:
- api
API
Сервис A
Сервис B
Очередь
БД
ver 1.23
ver 1.23
ver 1.23
services:
...
stub_N:
image: "app/app-stubs:${BUILD_NUMBER}"
command: "/bin/stub_N"
environment:
- VAR_N1=${VAR_N1:-unset}
- VAR_N2=${VAR_N2:-unset}
- VAR_N3=${VAR_N3:-unset}
env_file:
- docker/environments/${ENV:-unset}.env
ports:
- 5005:5005
depends_on:
- api
- service_A
- service_B
API
Сервис A
Сервис B
Очередь
БД
ver 1.23
ver 1.23
ver 1.23
Стабы
services:
test-base:
image: "app/test-base:${CONTENT_HASH}"
build:
context: .
dockerfile: docker/test-base.dockerfile
network: host
services:
...
test-tool:
image: "app/test-tool:${BUILD_NUMBER}"
build:
context: .
dockerfile: docker/test-tool.dockerfile
network: host
args:
BUILD_NUMBER: "${BUILD_NUMBER}"
volumes:
- .${ALLUREDIR:-/allure-results}:${ALLUREDIR:-/allure-results}
env_file:
- docker/environments/${ENV:-unset}.env
depends_on:
- test-base
- stubs
Очередь
БД
ver 1.23
ver 1.23
ver 1.23
Стабы
Сервис A
Сервис B
API
Test
tool
ver 1.23
Другой
сервис
Сервис
2.3
релизу
By Vladislav Mukhamatnurov