Scenario generator / gRPC
Categories:
Конфигурация
Вам необходимо использовать генератор и провайдер типа grpc/scenario
pools:
- id: Pool name
gun:
type: grpc/scenario
target: localhost:8888
ammo:
type: grpc/scenario
file: payload.hcl
Генератор
Минимальная конфигурация генератора выглядит так
gun:
type: grpc/scenario
target: localhost:8888
Для сценарного генератора поддерживаются все настройки обычного gRPC генератора
Провайдер
Провайдер принимает всего один параметр - путь до файла с описанием сценария
ammo:
type: http/scenario
file: payload.hcl
Поддерживает файлы расширений
- hcl
- yaml
- json
Описание формата сценариев
Поддерживает форматы
- hcl
- yaml
- json
Общий принцип
В одном файле можно описывать несколько сценариев. У сценария есть имя по которому один сценарий отличается от другого.
Сценарий - это последовательность gRPC вызовов. То есть вам потребуется описать в сценарии какие вызовы в каком порядке должны выполняться.
Вызов - gRPC вызов. Имеет стандартные поля gRPC вызова плюс дополнительные. См Calls.
HCL пример
locals {
common_meta = {
"metadata" = "server.proto"
}
next = "next"
}
locals {
auth_meta = merge(local.common_meta, {
authorization = "{{.request.auth_req.postprocessor.token}}"
})
next = "next"
}
variable_source "users" "file/csv" {
file = "users.csv"
fields = ["user_id", "login", "pass"]
ignore_first_line = true
delimiter = ","
}
variable_source "filter_src" "file/json" {
file = "filter.json"
}
variable_source "variables" "variables" {
variables = {
header = "yandex"
b = "s"
}
}
call "auth_req" {
call = "target.TargetService.Auth"
tag = "auth"
metadata = local.auth_meta
preprocessor "prepare" {
mapping = {
user = "source.users[next]"
}
}
payload = <<EOF
{"login": "{{.request.auth_req.preprocessor.user.login}}", "pass": "{{.request.auth_req.preprocessor.user.pass}}"}
EOF
postprocessor "assert/response" {
payload = ["token"]
status_code = 200
}
}
scenario "scenario_name" {
weight = 1
min_waiting_time = 1000
requests = [
"auth_req",
]
}
Так же пример можно посмотреть в тестах https://github.com/yandex/pandora/blob/dev/tests/grpc_scenario/testdata/grpc_payload.hcl
YAML пример
locals:
my-meta: &global-meta
metadata: "server.proto"
variable_sources:
- type: "file/csv"
name: "users"
ignore_first_line: true
delimiter: ","
file: "file.csv"
fields: ["user_id", "login", "pass"]
- type: "file/json"
name: "filter_src"
calls:
- name: "auth_req"
call: 'target.TargetService.Auth'
tag: auth
method: POST
metadata:
<<: *global-meta
preprocessors:
- type: prepare
mapping:
new_var: source.var_name[next].0
payload: '{"login": "{{.request.auth_req.preprocessor.user.login}}", "pass": "{{.request.auth_req.preprocessor.user.pass}}"}'
postprocessors:
- type: assert/response
payload: ["token"]
status_code: 200
scenarios:
- name: scenario_name
weight: 1
min_waiting_time: 1000
requests: [
auth_req
]
Locals
Про блок locals смотрите в отдельной статье Locals
Возможности
Вызовы
Поля
- call
- tag
- metadata
- preprocessors
- payload
- postprocessors
Шаблонизатор
Поля metadata
, payload
шаблонризируются.
Используется стандартный go template.
Имена переменных в шаблонах
Имена переменных имеют полный путь их определения.
Например
Переменная users
из источника user_file
- {% raw %}{{.source.user_file.users}}{% endraw %}
Переменная item
из препроцессора запроса list_req
- {% raw %}{{.request.list_req.preprocessor.item}}{% endraw %}
Обратите внимание Для сохранения подобия с http сценариями секция ответов от grpc вызова сохраняется в раздел
postprocessor
Переменная token
из вызова list_req
- {% raw %}{{.request.list_req.postprocessor.token}}{% endraw %}
Функции в шаблонах
Так как используется стандартные шаблонизатор Го в нем можно использовать встроенные функции https://pkg.go.dev/text/template#hdr-Functions
А так же некоторые функции
- randInt
- randString
- uuid
Подробнее про функции рандомизации см в документации
Preprocessors
Препроцессор - действия выполняются перед шаблонизацией
prepare
Используется для нового маппинга переменных
У препроцессора есть возможность работать с массивами с помощью модификаторов
- next
- last
- rand
yaml
calls:
- name: req_name
...
preprocessors:
- type: prepare
mapping:
user_id: source.users[next].id
hcl
call "req_name" {
preprocessor "prepare" {
mapping = {
user_id = "source.users[next].id"
}
}
}
Postprocessors
assert/response
Проверяет значения заголовков и тела
Если матчинг не срабатывает, прекращает дальнейшее выполнение сценария
postprocessor "assert/response" {
payload = ["token"]
status_code = 200
}
Scenarios
Данная секция повторяет такую же секцию сценариев в HTTP генераторе
Минимальные поля для сценария - имя и перечень запросов
scenario "scenario_name" {
requests = [
"list_call",
"order_call",
"order_call",
"order_call"
]
}
Подробнее см секцию сценариев в HTTP генераторе
Sources
См документ - Источники переменных