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
Создание Первой Коллекции
- Создать Новую Коллекцию: File → New Collection
- Выбрать Расположение: Выбери папку в своём Git репозитории
- Добавить Environment: Создай файлы окружения для разных конфигураций
- Создать 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
- Коммитить изменения API вместе с изменениями кода
- Создавать pull requests для модификаций API
- Просматривать изменения используя стандартные Git diff инструменты
- Конфликты слияния разрешаются текстовым редактором
Пример 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 делает переход бесшовным:
- Экспорт из Postman: Collection → Export → Collection v2.1
- Импорт в Bruno: Collection → Import → Select Postman JSON
- Проверка сопоставления: Проверь переменные окружения и скрипты
- Корректировка различий: Измени скрипты при необходимости
Ключевые Различия для Понимания
| Функция | Postman | Bruno |
|---|---|---|
| Хранилище | Облако | Файловая система |
| Формат | 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 Конкуренты
| Функция | Bruno | Postman | Insomnia | Thunder Client |
|---|---|---|---|---|
| Стоимость | Бесплатно | Freemium | Freemium | Бесплатно + 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
Смотрите также
- Мастерство тестирования API - Основы и лучшие практики тестирования API
- Postman: от ручного к автоматизации - Изучи тестирование API с Postman перед переходом на Bruno
- Оптимизация CI/CD для QA команд - Интегрируй Bruno CLI в автоматизированные пайплайны
- Непрерывное тестирование в DevOps - Реализуй непрерывное тестирование API
- Insomnia REST Client - Ещё одна популярная альтернатива Postman
