Перейти к содержимому

Outry в CI

Те же .outry- (и .http-) файлы, что вы гоняете в приложении, могут запускаться как API-тесты на каждый пуш. Пройдёт ли джоба, решают проверки expect.

.github/workflows/api-tests.yml
name: API tests
on: [push, pull_request]
jobs:
api:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
# Здесь поднимите тестируемый сервис (docker compose, бинарь, …)
- name: Install outry
run: |
curl -fsSL https://raw.githubusercontent.com/1rowvy/outry/master/install.sh | sh
echo "$HOME/.local/bin" >> "$GITHUB_PATH"
- name: Check request files
run: outry check api --format github
- name: Run API tests
run: outry run api --env ci --no-keyring --fail-fast
env:
OUTRY_TOKEN: ${{ secrets.API_TOKEN }}
  • Для воспроизводимых сборок зафиксируйте версию: OUTRY_VERSION=v0.2.0 перед sh.
  • Секреты приходят из переменных OUTRY_<ИМЯ> — см. Секреты.
  • --no-keyring отключает обращение к хранилищу паролей — на раннерах его всё равно нет.
  • Напоминание о новой версии отключается само, когда задана переменная CI.

--json печатает по JSON-объекту на запрос (JSON Lines) вместо отчёта для человека:

Окно терминала
outry run api --json > results.jsonl
{"file":"api/users/get.outry","name":"GetUser","passed":true,"outcome":{"kind":"request","request":{…},"response":{"status":200,…},"asserts":[…],"calls":[…],"saved":{}}}
{"file":"api/users/bad.outry","name":"GetUser","passed":false,"error":"undefined variable(s): id"}

У сценария в outcome — "kind":"flow" с полями checks, calls, saved и error.

outry check проверяет весь проект без отправки запросов — один быстрый шаг линтинга: синтаксис, имена вызываемых запросов, их аргументы, формы и циклы вызовов, каждое окружение (запросы, которым only его запрещает, переменные, которых в нём нет), формат и — если выше проекта есть go.mod — роуты в Go-коде (как outry import go --check):

Окно терминала
outry check # проект, найденный от текущего каталога
outry check api --env ci # одно окружение, секреты из хранилища паролей / OUTRY_*
outry check --format github # аннотации прямо в диффе PR
api/orders/create.outry:1:1: error: not formatted (`outry fmt`)
api/orders/create.outry:7:22: error: variable `api_key` is not defined in staging, prod
api/orders/create.outry:9:13: error: `Seed` is limited to dev and cannot be called in prod
main.go:42:1: error: route DELETE /orders/{id} has no request (`outry import go` creates api/orders/delete.outry)
12 files, 3 environments, 18 Go routes: 4 errors, 0 warnings

Подробности и флаги: outry check.