Автоматизация 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");