Bruno — это полностью open-source API клиент, построенный на Git-native философии: коллекции хранятся как обычные .bru текстовые файлы в файловой системе, а не в облаке. Запущенный в 2022 году, он набрал более 40 000 звёзд на GitHub за два года — один из самых быстро растущих API инструментов в open-source экосистеме. В отличие от Postman или Insomnia, Bruno не требует аккаунта, логина и интернета — всё работает локально. Формат .bru читаем человеком и удобен для diff-просмотра в PR, что позволяет хранить всю коллекцию API рядом с кодом. Для QA команд, уставших от vendor lock-in и растущих SaaS цен, офлайн-first подход Bruno — это принципиально новый взгляд на то, как должны работать API инструменты.

“Bruno решил проблему, которую я не замечал, пока не потерял доступ к облачной синхронизации в середине тест-сессии. Коллекции как реальные файлы в Git-репозитории изменили то, как наша команда ревьюит API изменения — теперь это просто diff в PR.” — Юрий Кан, Senior QA Lead

Если ты изучаешь тестирование API, Bruno предлагает убедительную альтернативу облачным инструментам. Команды, переходящие с Postman на автоматизацию, оценят Git-native рабочий процесс Bruno. Инструмент хорошо интегрируется с CI/CD пайплайнами и поддерживает непрерывное тестирование через CLI.

TL;DR — Bruno хранит API коллекции как .bru текстовые файлы (100% Git-native), не требует аккаунта или облака, полностью MIT-лицензирован. Более 40 000 звёзд на GitHub. Полная поддержка CI/CD через @usebruno/cli. Прямой импорт Postman коллекций. Встроенные Chai-style assertions.

Введение в Bruno API Client

Запущенный в 2022 году, Bruno быстро завоевал популярность среди разработчиков, разочарованных моделями подписки и зависимостью от облака. Он особенно привлекателен для команд, уже использующих рабочие процессы Git. Согласно официальной документации Bruno, инструмент создан как “Notepad++ для API клиентов” — простой, быстрый и под твоим полным контролем.

Почему Bruno Выделяется

Основная Философия и Преимущества

Архитектура Offline-First Bruno не требует облачной синхронизации или учётных записей. Всё работает локально:

  • Не требуется логин
  • Полная конфиденциальность
  • Работает без подключения к интернету
  • Быстро и отзывчиво

Нативный Git Рабочий Процесс Коллекции — это простые текстовые файлы (формат .bru), которые бесшовно интегрируются с Git:

  • Встроенный контроль версий
  • Лёгкие code review для изменений API
  • Разработка на основе веток
  • Разрешение конфликтов слияния с помощью стандартных Git инструментов

Open Source и Бесплатный Лицензированный под MIT, Bruno действительно бесплатен без искусственных ограничений:

  • Без платных тарифов или премиум функций
  • Разработка, управляемая сообществом
  • Прозрачная дорожная карта
  • Расширяемая архитектура

Коллекции как Код Формат файла .bru читаем человеком и разработан для разработчиков:

meta {
  name: Get User
  type: http
  seq: 1
}

get {
  url: {{base_url}}/api/users/{{user_id}}
}

headers {
  Authorization: Bearer {{token}}
  Content-Type: application/json
}

vars:pre-request {
  user_id: 123
}

tests {
  test("Status code is 200", function() {
    expect(res.status).to.equal(200);
  });

  test("Response has user data", function() {
    expect(res.body).to.have.property('id');
    expect(res.body).to.have.property('name');
  });
}

Начало Работы с Bruno

Установка

Bruno доступен для всех основных платформ:

# macOS (Homebrew)
brew install bruno

# Windows (Chocolatey)
choco install bruno

# Linux (Snap)
snap install bruno

# Или скачать из GitHub releases
# https://github.com/usebruno/bruno/releases

Создание Первой Коллекции

  1. Создать Новую Коллекцию: File → New Collection
  2. Выбрать Расположение: Выбери папку в своём Git репозитории
  3. Добавить Environment: Создай файлы окружения для разных конфигураций
  4. Создать Requests: Правый клик на коллекцию → New Request

Структура Директории

my-api/
├── bruno.json          # Metadata коллекции
├── environments/
│   ├── local.bru
│   ├── staging.bru
│   └── production.bru
└── requests/
    ├── auth/
    │   ├── login.bru
    │   └── refresh.bru
    └── users/
        ├── get-user.bru
        ├── create-user.bru
        └── update-user.bru

Понимание Формата .bru

Формат .bru интуитивен и выразителен:

meta {
  name: Create User
  type: http
  seq: 2
}

post {
  url: {{base_url}}/api/users
}

headers {
  Authorization: Bearer {{access_token}}
  Content-Type: application/json
}

body:json {
  {
    "name": "{{user_name}}",
    "email": "{{user_email}}",
    "role": "developer"
  }
}

vars:pre-request {
  user_name: John Doe
  user_email: john@example.com
}

script:pre-request {
  // Генерация timestamp
  bru.setVar("timestamp", Date.now());

  // Установка кастомного заголовка
  req.setHeader("X-Request-ID", bru.getVar("request_id"));
}

script:post-response {
  // Сохранить user ID для последующих запросов
  const userId = res.body.id;
  bru.setEnvVar("created_user_id", userId);

  // Логировать время ответа
  console.log("Response time:", res.responseTime, "ms");
}

tests {
  test("User created successfully", function() {
    expect(res.status).to.equal(201);
    expect(res.body.id).to.be.a('number');
  });
}

Управление Окружениями

Файлы Окружений

Окружения Bruno — это простые файлы .bru:

local.bru

vars {
  base_url: http://localhost:3000
  api_key: local-dev-key
  debug: true
}

production.bru

vars {
  base_url: https://api.production.com
  api_key: {{process.env.PROD_API_KEY}}
  rate_limit: 1000
}

Управление Секретами

Bruno интегрируется с переменными окружения системы для конфиденциальных данных:

vars {
  database_url: {{process.env.DATABASE_URL}}
  stripe_key: {{process.env.STRIPE_SECRET_KEY}}
}

Это предотвращает коммит секретов в Git при сохранении функциональности.

Продвинутые Возможности

Скриптинг и Автоматизация

Bruno поддерживает JavaScript в pre-request и post-response скриптах:

Pre-Request Script

// Генерация HMAC подписи
const crypto = require('crypto');
const message = req.getBody();
const secret = bru.getEnvVar('api_secret');
const signature = crypto
  .createHmac('sha256', secret)
  .update(message)
  .digest('hex');

req.setHeader('X-Signature', signature);

Post-Response Script

// Извлечение и сохранение токена пагинации
if (res.body.next_page_token) {
  bru.setVar('page_token', res.body.next_page_token);
}

// Условная логика
if (res.status === 401) {
  // Токен истёк, запустить обновление
  console.log('Refreshing authentication token...');
}

Встроенный Фреймворк Тестирования

Bruno включает assertions в стиле Chai:

tests {
  // Assertions кода статуса
  test("Request successful", function() {
    expect(res.status).to.be.oneOf([200, 201, 204]);
  });

  // Валидация времени ответа
  test("Response time acceptable", function() {
    expect(res.responseTime).to.be.below(500);
  });

  // Валидация JSON схемы
  test("Valid user object", function() {
    expect(res.body).to.have.all.keys('id', 'name', 'email');
    expect(res.body.id).to.be.a('number');
    expect(res.body.email).to.match(/.+@.+\..+/);
  });

  // Валидация header
  test("Correct content type", function() {
    expect(res.headers['content-type']).to.include('application/json');
  });
}

Совместная Работа над Коллекциями

Рабочий Процесс на Основе Git

  1. Коммитить изменения API вместе с изменениями кода
  2. Создавать pull requests для модификаций API
  3. Просматривать изменения используя стандартные Git diff инструменты
  4. Конфликты слияния разрешаются текстовым редактором

Пример Git Рабочего Процесса

# Создать feature branch
git checkout -b feature/add-user-endpoints

# Внести изменения API в Bruno
# Закоммитить изменения
git add requests/users/
git commit -m "Add user CRUD endpoints"

# Push и создать PR
git push origin feature/add-user-endpoints

Миграция из Postman

Процесс Импорта

Bruno поддерживает импорт коллекций Postman. Если ты оцениваешь различные инструменты тестирования API, возможность импорта Bruno делает переход бесшовным:

  1. Экспорт из Postman: Collection → Export → Collection v2.1
  2. Импорт в Bruno: Collection → Import → Select Postman JSON
  3. Проверка сопоставления: Проверь переменные окружения и скрипты
  4. Корректировка различий: Измени скрипты при необходимости

Ключевые Различия для Понимания

ФункцияPostmanBruno
ХранилищеОблакоФайловая система
ФорматJSON.bru (текст)
СинхронизацияАвтоматическаяGit
ЦенаFreemiumБесплатно
Совместная работаВстроеннаяНа основе Git
СкриптыPostman sandboxМодули Node.js
WorkspacesОблачные workspacesПапки

Миграция Скриптов

Скрипт Postman

pm.environment.set("token", pm.response.json().access_token);
pm.test("Status is 200", () => {
  pm.response.to.have.status(200);
});

Эквивалент в Bruno

bru.setEnvVar("token", res.body.access_token);

test("Status is 200", function() {
  expect(res.status).to.equal(200);
});

CLI и Автоматизация

Bruno CLI

Запускай коллекции из командной строки:

# Установить CLI
npm install -g @usebruno/cli

# Запустить всю коллекцию
bru run --collection ./my-api

# Запустить конкретную папку
bru run --collection ./my-api --folder users

# Использовать конкретное окружение
bru run --collection ./my-api --env production

# Форматы вывода
bru run --collection ./my-api --output junit.xml --format junit

Интеграция CI/CD

Пример GitHub Actions

name: API Tests
on: [push, pull_request]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:

      - uses: actions/checkout@v3

      - name: Setup Node.js
        uses: actions/setup-node@v3
        with:
          node-version: '18'

      - name: Install Bruno CLI
        run: npm install -g @usebruno/cli

      - name: Run API Tests
        run: bru run --collection ./api-tests --env ci
        env:
          API_KEY: ${{ secrets.API_KEY }}
          BASE_URL: ${{ secrets.BASE_URL }}

      - name: Upload Results
        uses: actions/upload-artifact@v3
        with:
          name: test-results
          path: test-results.xml

Поддержка GraphQL

Bruno нативно обрабатывает GraphQL запросы. Для команд, работающих с gRPC API, важно отметить, что Bruno фокусируется в первую очередь на REST и GraphQL.

Сравнение: Bruno vs Конкуренты

ФункцияBrunoPostmanInsomniaThunder Client
СтоимостьБесплатноFreemiumFreemiumБесплатно + Pro
OfflineДаОграниченоДаДа
ХранилищеЛокальные файлыОблакоГибридноеWorkspace VS Code
Git-friendlyОтличноПлохоУмеренноХорошо
Совместная работаНа основе GitВстроеннаяПлатноОграниченная

Часто Задаваемые Вопросы

Bruno API Client полностью бесплатный? Да, Bruno полностью open-source под лицензией MIT — никаких платных планов, премиум функций или подписки. Всё бесплатно навсегда.

Чем Bruno отличается от Postman? Bruno хранит коллекции как текстовые .bru файлы в файловой системе (Git-native), а Postman использует облако. Bruno не требует аккаунта, работает полностью оффлайн, без подписки.

Можно ли импортировать коллекции из Postman в Bruno? Да, Bruno поддерживает импорт Postman Collection v2.1 JSON. Перейди в Collection → Import → выбери Postman JSON, затем проверь переменные окружения и скрипты.

Поддерживает ли Bruno CI/CD пайплайны? Да, Bruno предоставляет CLI (@usebruno/cli) для запуска коллекций из командной строки с выводом в JUnit XML. Совместим с GitHub Actions, GitLab CI, Jenkins и другими системами.

Заключение

Bruno API Client представляет собой смену парадигмы в инструментах тестирования API, приоритизируя рабочие процессы разработчиков, владение данными и простоту. Его файловая архитектура идеально согласуется с современными Git-центричными практиками разработки.

Open-source природа обеспечивает прозрачность, инновации, управляемые сообществом, и свободу от vendor lock-in.

Источники: Официальная документация Bruno · GitHub репозиторий Bruno

Смотрите также