Документация API-автоматизация в CI/CD

Автоматизация Mockarty в CI/CD

Используйте эти примеры, когда пайплайн должен подготовить моки или запустить проверки. Замените адреса сервера, проверяемого API и значения токенов на свои. Описание эндпоинтов — в «Справочнике API».

Для этих примеров нужен API-токен с правами в проверяемом пространстве. Перед запуском cURL-команд запишите его в MOCKARTY_API_KEY; для чтения JSON-ответов понадобится jq. Настройка клиентов SDK описана в руководстве по SDK.

Примеры

Запуск API-тестов из CI

cURL

TOKEN="${MOCKARTY_API_KEY:?Сначала задайте MOCKARTY_API_KEY}"
BASE="${MOCKARTY_URL:-http://127.0.0.1:5770}/api/v1"

# 1. Создание коллекции
COLLECTION_ID=$(curl -s -X POST "$BASE/api-tester/collections" \
  -H "X-API-Key: $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name": "CI Tests", "description": "Automated test suite"}' | jq -r '.id')

# 2. Добавление запроса с тестовым скриптом
curl -X POST "$BASE/api-tester/collections/$COLLECTION_ID/requests" \
  -H "X-API-Key: $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Get Users",
    "requestData": {"method": "GET", "url": "http://127.0.0.1:5770/stubs/sandbox/api/users"},
    "testScript": "mk.test(\"Status is 200\", function() { mk.response.to.have.status(200); });"
  }'

# 3. Выполнение коллекции (запускает все запросы + тестовые скрипты)
RUN_ID=$(curl -s -X POST "$BASE/api-tester/collections/$COLLECTION_ID/execute" \
  -H "X-API-Key: $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{}' | jq -r '.testRunId')

# 4. Проверка результатов
curl -s "$BASE/api-tester/test-runs/$RUN_ID" \
  -H "X-API-Key: $TOKEN" | jq '.status, .summary'

CLI

# Запуск коллекции, сохранённой в Mockarty, по имени
mockarty-cli run collection "CI Tests"

# Либо коллекции из файла, с экспортом JUnit-отчёта для CI
mockarty-cli run -f ci-tests.json --reporter junit:results.xml

Go

// Создание коллекции и выполнение
col, err := client.Collections().Create(context.Background(), &mockarty.Collection{
    Name:        "CI Tests",
    Description: "Automated test suite",
})

// Выполнение коллекции
run, err := client.Collections().Execute(context.Background(), col.ID)
fmt.Printf("Run ID: %s, Status: %s\n", run.ID, run.Status)

Python

# Создание коллекции и выполнение
col = client.collections.create({
    "name": "CI Tests",
    "description": "Automated test suite",
})

# Выполнение коллекции
run = client.collections.execute(col.id)
print(f"Run ID: {run.id}, Status: {run.status}")

Java

// Создание коллекции и выполнение
Map<String, Object> col = client.collections().create(Map.of(
    "name", "CI Tests",
    "description", "Automated test suite"
));

String collectionId = (String) col.get("id");
Map<String, Object> run = client.collections().execute(collectionId);
System.out.println("Run ID: " + run.get("testRunId"));

Запуск нагрузочных тестов из CI

Примеры cURL и SDK отправляют тест в Mockarty, поэтому сначала подключите раннер. Примеры CLI выполняются локально, если вы не выбрали запуск на сервере. Если сервер Mockarty запущен не локально, замените адрес стаба в скрипте.

cURL

TOKEN="${MOCKARTY_API_KEY:?Сначала задайте MOCKARTY_API_KEY}"
BASE="${MOCKARTY_URL:-http://127.0.0.1:5770}/api/v1"

# Запуск нагрузочного теста с инлайн-скриптом
curl -X POST "$BASE/perf/run" \
  -H "X-API-Key: $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "script": "import http from \"k6/http\"; export default function() { http.get(\"http://localhost:5770/stubs/sandbox/api/users\"); }",
    "options": {"vus": 10, "duration": "30s"}
  }'

# Проверка результатов
curl -s "$BASE/perf-results" -H "X-API-Key: $TOKEN" | jq '.[0]'

CLI

# Запуск нагрузочного теста из сохранённого perf-config файла
mockarty-cli perf run --from-config load-test.json

# Запуск скрипта с инлайн-параметрами нагрузки
mockarty-cli perf run ./load-test.js --vus 10 --duration 30s

Go

// Запуск нагрузочного теста
task, err := client.Perf().Run(context.Background(), &mockarty.PerfConfig{
    Script:  `import http from "k6/http"; export default function() { http.get("http://localhost:5770/stubs/sandbox/api/users"); }`,
    Options: &mockarty.PerfOptions{VUs: 10, Duration: "30s"},
})
fmt.Println("Task ID:", task.ID)

// Список результатов
results, err := client.Perf().ListResults(context.Background())

Python

# Запуск нагрузочного теста
result = client.perf.run({
    "script": 'import http from "k6/http"; export default function() { http.get("http://localhost:5770/stubs/sandbox/api/users"); }',
    "options": {"vus": 10, "duration": "30s"},
})

# Список результатов
results = client.perf.list_results()

Java

// Запуск нагрузочного теста
Map<String, Object> result = client.perf().run(Map.of(
    "script", "import http from \"k6/http\"; export default function() { http.get(\"http://localhost:5770/stubs/sandbox/api/users\"); }",
    "options", Map.of("vus", 10, "duration", "30s")
));

Запуск фаззинга из CI

Замените https://api.example.com адресом API, который вам разрешено проверять. Примерам cURL и SDK нужен подключённый раннер; пример CLI выполняется локально.

cURL

TOKEN="${MOCKARTY_API_KEY:?Сначала задайте MOCKARTY_API_KEY}"
BASE="${MOCKARTY_URL:-http://127.0.0.1:5770}/api/v1"

# 1. Создание конфигурации фаззинга
CONFIG_ID=$(curl -s -X POST "$BASE/fuzzing/configs" \
  -H "X-API-Key: $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "API Fuzz",
    "targetBaseUrl": "https://api.example.com",
    "sourceType": "manual",
    "strategy": "security",
    "seedRequests": [{"id": "seed-1", "method": "POST", "url": "/api/users"}],
    "payloadCategories": ["sqli", "xss"],
    "options": {"maxRequests": 100, "concurrency": 2}
  }' | jq -r '.id')

# 2. Запуск фаззинга
RUN_ID=$(curl -s -X POST "$BASE/fuzzing/run" \
  -H "X-API-Key: $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"configId": "'$CONFIG_ID'"}' | jq -r '.resultId')

# 3. Просмотр находок этого запуска
curl -s "$BASE/fuzzing/findings?runId=$RUN_ID" \
  -H "X-API-Key: $TOKEN" | jq '.findings'

CLI

# Запуск по спецификации OpenAPI
mockarty-cli fuzz --target https://api.example.com \
  --spec openapi.yaml \
  --categories sqli,xss \
  --duration 1m

Go

// Создание конфигурации и запуск фаззинга
config, err := client.Fuzzing().CreateConfig(context.Background(), &mockarty.FuzzingConfig{
    Name:              "API Fuzz",
    TargetBaseURL:     "https://api.example.com",
    SourceType:        "manual",
    Strategy:          "security",
    SeedRequests:      []map[string]any{{"id": "seed-1", "method": "POST", "url": "/api/users"}},
    PayloadCategories: []string{"sqli", "xss"},
    Options:           map[string]any{"maxRequests": 100, "concurrency": 2},
})

run, err := client.Fuzzing().StartFromConfig(context.Background(), config.ID)

// Проверка найденных уязвимостей
findings, err := client.Fuzzing().ListFindings(context.Background())
for _, finding := range findings {
    if finding.RunID == run.ID { fmt.Println(finding.Title) }
}

Python

# Создание конфигурации и запуск фаззинга
config = client.fuzzing.create_config({
    "name": "API Fuzz",
    "targetBaseUrl": "https://api.example.com",
    "sourceType": "manual",
    "strategy": "security",
    "seedRequests": [{"id": "seed-1", "method": "POST", "url": "/api/users"}],
    "payloadCategories": ["sqli", "xss"],
    "options": {"maxRequests": 100, "concurrency": 2},
})

run = client.fuzzing.start_from_config(config.id)

# Проверка найденных уязвимостей
findings = [f for f in client.fuzzing.list_findings() if f.get("runId") == run.id]

Java

// Создайте конфигурацию примером cURL выше, затем используйте её ID.
String configId = "<config-id>";
FuzzingRun run = client.fuzzing().startFromConfig(configId);
List<FuzzingFinding> findings = client.fuzzing().listFindings().stream()
    .filter(f -> run.getId().equals(f.getRunId()))
    .toList();

Импорт OpenAPI/Postman/HAR

cURL

TOKEN="${MOCKARTY_API_KEY:?Сначала задайте MOCKARTY_API_KEY}"
BASE="${MOCKARTY_URL:-http://127.0.0.1:5770}/api/v1"

# Передаём файл OpenAPI как JSON и создаём моки в пространстве sandbox
jq -Rs --arg ns sandbox '{content: ., namespace: $ns}' < openapi.yaml | curl -X POST "$BASE/generators/openapi" \
  -H "X-API-Key: $TOKEN" \
  -H "Content-Type: application/json" \
  --data-binary @-

# Импорт коллекции Postman в API Tester
# (JSON экспортированного файла передаётся в ключе collectionJson)
curl -X POST "$BASE/api-tester/import/postman" \
  -H "X-API-Key: $TOKEN" \
  -H "Content-Type: application/json" \
  -d "{\"collectionJson\": $(cat collection.json)}"

# Импорт окружения Postman (*.postman_environment.json);
# activate=true сразу делает его активным окружением
curl -X POST "$BASE/api-tester/import/postman-env" \
  -H "X-API-Key: $TOKEN" \
  -H "Content-Type: application/json" \
  -d "{\"environmentJson\": $(cat staging.postman_environment.json), \"activate\": true}"

# Импорт HAR-записи (содержимое файла — в ключе content)
curl -X POST "$BASE/api-tester/import/har" \
  -H "X-API-Key: $TOKEN" \
  -H "Content-Type: application/json" \
  -d "{\"content\": $(jq -Rs . < recording.har)}"

# Импорт WSDL для SOAP-тестирования — по URL или содержимым
curl -X POST "$BASE/api-tester/import/wsdl" \
  -H "X-API-Key: $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://example.com/service?wsdl"}'

CLI

# Генерация моков из OpenAPI-спецификации (namespace по умолчанию — "sandbox")
mockarty-cli --namespace sandbox generate openapi openapi.yaml --upload

# Конвертация Postman-коллекции в файлы моков
mockarty-cli generate postman collection.json

# Генерация моков из HAR-записи
mockarty-cli generate har recording.har

Go

// Генерация моков из OpenAPI/Swagger-спецификации
spec, _ := os.ReadFile("openapi.yaml")
result, err := client.Generator().FromOpenAPI(context.Background(), &mockarty.GeneratorRequest{
    Spec:      string(spec),
    Namespace: "sandbox", // необязательно, "sandbox" по умолчанию
})

// Импорт коллекции Postman
data, _ := os.ReadFile("collection.json")
importResult, err := client.Import().Postman(context.Background(), data)

Python

# Генерация моков из OpenAPI/Swagger-спецификации
result = client.generator.from_openapi({
    "content": open("openapi.yaml").read(),
    "namespace": "sandbox",  # необязательно, "sandbox" по умолчанию
})

# Импорт коллекции Postman
import json
import_result = client.imports.postman(json.load(open("collection.json")))

Java

// Генерация моков из OpenAPI/Swagger-спецификации
GeneratorResponse result = client.generator().fromOpenAPI(
    new GeneratorRequest()
        .spec(Files.readString(Path.of("openapi.yaml")))
        .namespace("sandbox"));

// Импорт коллекции Postman
ImportResult importResult = client.imports().postman(
    Files.readString(Path.of("collection.json")), "sandbox");

Настройка моков перед тестами

cURL

# Создание мока в пространстве sandbox
TOKEN="${MOCKARTY_API_KEY:?Сначала задайте MOCKARTY_API_KEY}"
curl -X POST http://localhost:5770/api/v1/mocks \
  -H "X-API-Key: $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "ci-user-service",
    "namespace": "sandbox",
    "http": {"route": "/api/users/list", "httpMethod": "GET"},
    "response": {
      "statusCode": 200,
      "payload": {"id": "$.fake.UUID", "name": "Test User"}
    }
  }'

# Проверка, что мок активен
curl http://localhost:5770/stubs/sandbox/api/users/list
# Возвращает: {"id": "a1b2c3d4-...", "name": "Test User"}

# Очистка после тестов
curl -X DELETE -H "X-API-Key: $TOKEN" \
  http://localhost:5770/api/v1/mocks/ci-user-service

CLI

# Создание мока из JSON-файла
mockarty-cli mock create --file ci-mocks.json

# Проверка, что мок активен
curl http://localhost:5770/stubs/sandbox/api/users/list

# Очистка после тестов
mockarty-cli mock delete ci-user-service

Go

// Создание мока для CI
mock := mockarty.NewMockBuilder().
    ID("ci-user-service").
    Namespace("sandbox").
    HTTP(func(h *mockarty.HTTPBuilder) {
        h.Route("/api/users/list").Method("GET")
    }).
    Response(func(r *mockarty.ResponseBuilder) {
        r.Status(200).JSONBody(map[string]any{
            "id":   "$.fake.UUID",
            "name": "Test User",
        })
    }).
    Build()

_, err := client.Mocks().Create(context.Background(), mock)

// ... запуск тестов ...

// Очистка
err = client.Mocks().Delete(context.Background(), "ci-user-service")

Python

# Создание мока для CI
mock = (
    MockBuilder.http("/api/users/list", "GET")
    .id("ci-user-service")
    .namespace("sandbox")
    .respond(200, body={"id": "$.fake.UUID", "name": "Test User"})
    .build()
)
client.mocks.create(mock)

# ... запуск тестов ...

# Очистка
client.mocks.delete("ci-user-service")

Java

// Создание мока для CI
Mock mock = MockBuilder.http("/api/users/list", "GET")
    .id("ci-user-service")
    .namespace("sandbox")
    .respond(200, Map.of("id", "$.fake.UUID", "name", "Test User"))
    .build();

client.mocks().create(mock);

// ... запуск тестов ...

// Очистка
client.mocks().delete("ci-user-service");