Pengujian API Anda berhasil di laptop Anda. Pertanyaan sebenarnya adalah apakah pengujian tersebut berjalan pada setiap pull request, setiap penggabungan, setiap build malam hari, tanpa ada campur tangan manusia. Tugas itu milik command-line runner. Runner ini mengambil pengujian yang telah Anda buat dan menjalankannya tanpa GUI di dalam pipeline Anda, keluar dengan kode status yang bersih, dan menulis laporan yang dapat dibaca oleh dashboard CI Anda.
Dua runner sering muncul ketika tim menyiapkan ini: Bruno CLI dan Apidog CLI. Keduanya memecahkan masalah yang sama dari titik awal yang berbeda. Bruno adalah klien API sumber terbuka, offline-first, git-native, dan CLI-nya menjalankan file `.bru` yang ada di repositori Anda. Apidog adalah platform API all-in-one, dan CLI-nya menjalankan skenario pengujian visual yang Anda bangun di aplikasi. Keduanya terhubung ke GitHub Actions, GitLab CI, Jenkins, dan apa pun yang menggunakan Node.js. Keduanya akan menyebabkan build gagal jika pengujian gagal. Perbedaan muncul dalam cara Anda membuat pengujian, cara Anda mengautentikasi, dan cara definisi pengujian masuk ke CI.
Ini adalah perbandingan jujur tingkat perintah dari keduanya. Tanpa strawman. Bruno melakukan beberapa hal dengan sangat baik, dan Anda akan melihat dengan tepat di mana setiap runner cocok sebelum Anda memasukkannya ke dalam pipeline Anda.
TL;DR
- Bruno CLI (
@usebruno/cli, binerbru) menjalankan file.brulangsung dari folder di repositori git Anda. Ini adalah sumber terbuka, offline, dan tidak memerlukan akun atau token. Anda mengarahkannya ke direktori dan akan menjalankan setiap permintaan dan pernyataan yang ditemukan di sana. - Apidog CLI (
apidog-cli, binerapidog) menjalankan skenario pengujian yang Anda rancang di aplikasi Apidog, diambil berdasarkan ID menggunakan token akses. Anda tidak menulis ulang pengujian sebagai kode; skenario visual adalah pengujian, dan CLI menjalankannya tanpa GUI. - Keduanya mengeluarkan laporan JUnit, JSON, dan HTML, dan keduanya akan menyebabkan build gagal pada pengujian yang gagal. JUnit XML adalah yang terhubung ke dashboard CI dalam kedua kasus.
- Pilih Bruno ketika Anda menginginkan semuanya di repositori, nol akun, dan kontrol offline penuh atas file pengujian teks biasa.
- Pilih Apidog ketika Anda menginginkan pembuatan visual, penggabungan skenario, manajemen lingkungan, dan eksekusi berbasis data tanpa perlu memelihara kode pengujian secara manual.
Masalah sebenarnya: pengujian yang ada tetapi tidak pernah dijalankan
Pengujian yang Anda jalankan secara manual adalah pengujian yang akan usang. Seseorang membuatnya, berhasil sekali, dan kemudian dibiarkan tidak tersentuh sementara API berubah. Solusinya bukan lebih banyak pengujian. Ini adalah pengujian yang berjalan secara otomatis pada setiap perubahan, dengan sinyal lulus/gagal yang dapat ditindaklanjuti oleh pipeline.
Runner CLI adalah yang menjembatani celah itu. Runner ini membutuhkan tiga hal agar berguna di CI: harus berjalan tanpa GUI, harus keluar non-nol ketika ada sesuatu yang gagal agar build menjadi merah, dan harus menulis laporan yang dapat dibaca mesin agar peninjau melihat apa yang rusak. Bruno dan Apidog keduanya memenuhi standar itu. Perbedaan mereka terletak di hulu perintah run, dalam cara pengujian ditulis dan di mana ia berada.
Jika Anda menyiapkan CI dari awal, pola yang lebih luas dalam mengotomatisasi pengujian API di CI/CD layak dibaca bersama perbandingan ini. Di sini kami fokus pada dua runner itu sendiri.
Apa yang dilakukan Bruno CLI dengan baik
Seluruh desain Bruno adalah git-native. Setiap permintaan, lingkungan, dan pernyataan adalah file `.bru` teks biasa di disk, di dalam repositori Anda, yang divariasikan seperti file sumber lainnya. Model itu memiliki keunggulan nyata, dan layak untuk dinyatakan dengan jelas sebelum perbandingan apa pun.
Pengujian Anda hidup bersama kode Anda. Sebuah pull request yang mengubah endpoint dapat mengubah pengujian untuk endpoint tersebut dalam diff yang sama, ditinjau oleh orang yang sama. Tidak ada sistem terpisah untuk disinkronkan, tidak ada salinan cloud yang dapat menyimpang dari apa yang ada di repositori. Perbedaan dapat dibaca karena formatnya adalah teks. Anda dapat mencari pengujian Anda, merefaktornya dengan alat yang sama yang Anda gunakan untuk kode, dan menyelesaikan konflik penggabungan di editor.
Ini juga sumber terbuka dan offline. CLI berjalan sepenuhnya di mesin Anda atau runner CI Anda tanpa akun, tanpa login, dan tanpa token. Untuk tim dengan aturan penanganan data yang ketat atau lingkungan yang terisolasi, itu penting. Tingkat berbayar Bruno, Bruno Ultimate, menambahkan fitur tim termasuk SSO dan SCIM, integrasi pengelola rahasia, dan kemampuan audit, sehingga proyek ini bukan hanya alat hobi. Tetapi klien inti dan CLI gratis dan mandiri, dan itu adalah kekuatan yang sah.
Menginstalnya cukup dengan satu perintah:
npm install -g @usebruno/cli
Biner adalah bru. Anda menjalankan koleksi dengan mengarahkannya ke folder yang berisi file .bru Anda:
bru run --env staging
Jalankan dari dalam direktori koleksi dan bru run mengeksekusi permintaan yang ditemukan di sana. Tambahkan -r untuk mengulang melalui subfolder sehingga mengambil permintaan yang bersarang:
bru run -r --env staging
Itu adalah inti dari alurnya. Tidak ada ID, tidak ada token, tidak ada pengambilan jarak jauh. File-file di folder adalah pengujian, dan CLI menjalankannya.
Kami telah membahas kisah Bruno yang lebih luas dalam apa yang membuat Bruno berbeda sebagai klien API yang git-native dan di mana keterbatasannya muncul untuk tim yang lebih besar. Khusus untuk CI, kekuatan di atas adalah yang terpenting.
Apa yang dilakukan Apidog CLI dengan baik
Apidog mengambil jalur yang berbeda ke pipeline yang sama. Anda membuat pengujian secara visual di aplikasi Apidog: rangkai permintaan menjadi sebuah skenario, tambahkan pernyataan (assertion), ambil nilai dari satu respons ke permintaan berikutnya, dan ulangi seluruhnya melalui file data. CLI adalah eksekutor tanpa GUI untuk skenario tersebut. Ini tidak memiliki format file sendiri. Ini mengambil skenario yang Anda beri nama berdasarkan ID dari proyek Apidog Anda dan menjalankannya persis seperti yang akan dilakukan aplikasi.
Keuntungannya adalah tidak ada yang memelihara dua representasi dari pengujian yang sama. Skenario dalam proyek adalah pengujian. Anda membuatnya dalam pembuat visual yang menangani perangkaian permintaan, ekstraksi variabel, dan pernyataan tanpa Anda menulis dan men-debug file skrip. Kemudian CLI menjalankan skenario yang sama di CI. Lingkaran pembuatan yang cepat dan lingkaran otomatisasi menggunakan satu sumber kebenaran.
Instalasi adalah satu perintah npm:
npm install -g apidog-cli
Biner adalah apidog. Sebuah eksekusi tipikal menamai sebuah skenario berdasarkan ID, memilih sebuah lingkungan, dan mengautentikasi dengan token akses:
apidog run --access-token $APIDOG_ACCESS_TOKEN -t 605067 -e 1629989 -n 1 -r html,junit
Anda tidak mengetik ID tersebut secara manual. Buka skenario pengujian, beralih ke tab CI/CD-nya, buat token akses, dan Apidog akan membuat perintah lengkap untuk Anda dengan ID skenario dan ID lingkungan sudah terisi. Anda menyalinnya sekali, lalu memindahkan token ke rahasia CI dan mereferensikannya sebagai $APIDOG_ACCESS_TOKEN. Referensi flag lengkap ada di panduan lengkap Apidog CLI jika Anda menginginkan setiap opsi di satu tempat.
Model berbasis token adalah perbedaan paling jelas dari Bruno. Apidog menjalankan pengujian yang disimpan dalam sebuah proyek yang diakses CLI melalui jaringan, terautentikasi. Bruno menjalankan pengujian yang disimpan sebagai file yang dibaca CLI dari disk. Keduanya tidak salah; mereka cocok untuk pengaturan tim yang berbeda.
Perbandingan berdampingan
| Dimensi | Bruno CLI (bru) |
Apidog CLI (apidog) |
|---|---|---|
| Paket | @usebruno/cli |
apidog-cli |
| Perintah Jalankan | bru run |
apidog run |
| Sumber Pengujian | File .bru di repo git Anda |
Skenario pengujian di proyek Apidog Anda, diambil berdasarkan ID |
| Pembuatan | Edit manual file teks atau gunakan aplikasi Bruno | Pembuat skenario visual di aplikasi Apidog |
| Otentikasi di CI | Tidak ada; berjalan offline | Token akses (--access-token) |
| Pilih apa yang dijalankan | Jalur folder, -r rekursif, --tags |
-t skenario, -f folder, --test-suite |
| Lingkungan | --env <nama> |
-e <environmentId> |
| Berbasis data | --csv-file-path, --json-file-path |
-d <jalur> (CSV atau JSON) |
| Iterasi | --iteration-count <n> |
-n <n> |
| Reporter | JSON, JUnit, HTML | cli, html, json, junit |
| Gagal cepat | --bail |
--on-error end (default gagal pada kesalahan pertama) |
| Sumber terbuka | Ya | Tidak (CLI npm gratis; menjalankan skenario dari paket Anda) |
| Lisensi/akun | Tidak ada untuk CLI | Akun Apidog untuk proyek |
Dua hal yang menonjol. Pertama, kedua runner mencakup esensi CI yang sama: pemilihan lingkungan, iterasi berbasis data, tiga format laporan yang penting, dan keluar non-nol saat gagal. Kedua, perpecahan adalah tentang di mana pengujian berada dan bagaimana Anda menulisnya, bukan tentang kemampuan mentah. Bruno menyimpan pengujian di repositori sebagai teks. Apidog menyimpannya di proyek sebagai skenario visual dan menjalankannya dengan referensi.
Pelapor dan kode keluar: bagian yang sebenarnya dibaca oleh CI
Seorang runner mendapatkan tempatnya di pipeline melalui dua perilaku: laporan yang ditulisnya dan kode keluar yang dikembalikannya. Jika ini benar, sisanya hanyalah pengaturan.
Bruno menulis laporan dengan flag per-format. Anda melewati jalur untuk setiap format yang Anda inginkan:
bru run -r --env staging \
--reporter-junit ./results/junit.xml \
--reporter-html ./results/report.html \
--reporter-json ./results/report.json
JUnit XML adalah apa yang diurai oleh dashboard CI Anda menjadi pohon lulus/gagal. Laporan HTML adalah artefak yang dapat dijelajahi. --bail Bruno menghentikan eksekusi setelah permintaan, pengujian, atau pernyataan pertama yang gagal, yang menjaga umpan balik tetap cepat pada pengujian asap. Tanpa --bail, ia menjalankan semuanya dan melaporkan semua kegagalan sekaligus.
Apidog menggunakan satu flag -r dengan daftar yang dipisahkan koma, dan menulis semuanya di bawah satu direktori output:
apidog run --access-token $APIDOG_ACCESS_TOKEN -t 605067 \
-r html,junit --out-dir ./apidog-reports
Flag --on-error-nya membentuk perilaku di tengah skenario: end berhenti pada kegagalan pertama (default), continue menjalankan setiap langkah sehingga Anda mengumpulkan semua kegagalan dalam satu laporan, dan ignore melewati langkah yang diketahui tidak stabil. Bagaimanapun, eksekusi berakhir non-nol jika ada yang gagal.
Kontrak kode keluar sama di kedua sisi dan merupakan bagian yang paling penting. Ketika sebuah pernyataan gagal, runner keluar dengan kode non-nol. CI membaca kode tersebut, menandai langkah tersebut gagal, menggagalkan pekerjaan, dan memblokir penggabungan atau penyebaran. Anda tidak mengonfigurasi apa pun secara ekstra. Satu-satunya jebakan, identik untuk keduanya, adalah menelan kode keluar: jika Anda membungkus eksekusi dalam pipeline shell atau menambahkan || true, keluar non-nol akan tertelan dan gerbang secara diam-diam berhenti berfungsi. Jangan lakukan itu.
Bruno CLI di GitHub Actions
Karena file .bru sudah ada di repo, alurnya singkat. Checkout kode, instal CLI, jalankan koleksi, unggah laporan.
name: API tests
on:
pull_request:
branches: [main]
jobs:
api-tests:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install Bruno CLI
run: npm install -g @usebruno/cli
- name: Run API tests
working-directory: ./api-tests
run: bru run -r --env staging --reporter-junit ./results/junit.xml
- name: Upload report
if: always()
uses: actions/upload-artifact@v4
with:
name: bruno-report
path: ./api-tests/results
working-directory menunjuk ke folder yang berisi koleksi Anda. if: always() menjaga unggahan laporan tetap berjalan bahkan ketika pengujian gagal, yang merupakan saat Anda ingin membacanya. Tidak diperlukan rahasia karena tidak ada yang mengautentikasi ke layanan jarak jauh.
Apidog CLI di GitHub Actions
Alur kerja Apidog secara struktural sama, dengan satu tambahan: token akses berasal dari rahasia repositori, dan Anda memilih skenario berdasarkan ID alih-alih berdasarkan jalur folder.
name: API tests
on:
pull_request:
branches: [main]
jobs:
api-tests:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install Apidog CLI
run: npm install -g apidog-cli
- name: Run API test scenario
run: |
apidog run \
--access-token "$APIDOG_ACCESS_TOKEN" \
-t 605067 \
-e 1629989 \
-r html,junit \
--out-dir ./apidog-reports
env:
APIDOG_ACCESS_TOKEN: ${{ secrets.APIDOG_ACCESS_TOKEN }}
- name: Upload report
if: always()
uses: actions/upload-artifact@v4
with:
name: apidog-report
path: ./apidog-reports
Perhatikan simetrinya. Checkout yang sama, pengaturan Node yang sama, bentuk instal-lalu-jalankan yang sama, selalu unggah yang sama. Satu-satunya perbedaan nyata adalah token yang dihubungkan sebagai rahasia dan skenario yang dipilih berdasarkan ID. Jika Anda ingin ini diperluas dengan varian GitLab CI dan Jenkins juga, panduan lengkap Apidog CLI membawa pola yang sama di seluruh runner.
Cara memilih
Keputusan jarang hanya bergantung pada runner mana yang "lebih baik". Ini bergantung pada bagaimana tim Anda ingin membuat dan menyimpan pengujian.
Pilih Bruno ketika repo adalah sumber kebenaran. Jika Anda menginginkan setiap pengujian sebagai file teks biasa yang hidup di samping kode yang dicakupnya, ditinjau dalam permintaan pull yang sama, tanpa akun dan tanpa panggilan jaringan saat waktu berjalan, Bruno sangat cocok dengan model itu. Ini adalah pilihan alami untuk tim yang memperlakukan pengujian sebagai kode, menghargai alat offline dan sumber terbuka, dan nyaman mengedit file .bru secara langsung. Bruno Ultimate menambahkan SSO, SCIM, integrasi pengelola rahasia, dan fitur audit jika Anda kemudian membutuhkan lapisan tim dan tata kelola, jadi berkembang ke sana adalah pilihan daripada hambatan.
Pilih Apidog ketika kecepatan pembuatan dan alur kerja terintegrasi lebih penting daripada kontrol tingkat file. Jika Anda lebih suka membangun skenario pengujian secara visual, merangkai permintaan, mengekstrak variabel, dan menjalankan skenario yang sama di seluruh lingkungan tanpa menulis dan men-debug kode pengujian secara manual, model Apidog menghilangkan gesekan tersebut. Desain, debug, mock, dan pengujian hidup dalam satu ruang kerja, dan CLI menjalankan skenario persis yang Anda bangun. Untuk tim yang berasal dari pengaturan Postman, model mentalnya cocok dengan bersih, dan jalur migrasi adalah salah satu yang dicakup Apidog sebagai alternatif Postman untuk pengujian API.
Ada juga jawaban kedua-alat. Beberapa tim menyimpan file git-native Bruno untuk pemeriksaan permintaan tingkat rendah dan menggunakan Apidog untuk skenario berantai yang lebih besar dan eksekusi regresi yang banyak lingkungan. Kedua CLI hidup berdampingan dengan baik dalam satu pipeline; mereka adalah langkah-langkah terpisah dengan kode keluar terpisah.
Jika Anda telah memutuskan antara platform secara lebih luas, tidak hanya CLI, perbandingan Apidog vs Bruno mencakup desain, mocking, dan kolaborasi di luar command line. Untuk menyiapkan skenario otomatis pertama Anda dan menjalankannya dari terminal pada sore yang sama, unduh Apidog dan salin perintah yang dihasilkan dari tab CI/CD skenario mana pun.
Pertanyaan yang Sering Diajukan
Apakah Bruno CLI gratis?
Ya. Bruno CLI adalah sumber terbuka dan dikirimkan sebagai paket npm @usebruno/cli. Ini berjalan sepenuhnya di mesin Anda atau runner CI tanpa akun atau token. Bruno Ultimate adalah tingkatan berbayar terpisah yang menambahkan fitur tim dan tata kelola seperti SSO, SCIM, integrasi pengelola rahasia, dan audit, tetapi CLI itu sendiri gratis.
Apakah Apidog CLI gratis?
CLI adalah paket npm gratis, apidog-cli. Ini menjalankan skenario pengujian dari proyek Apidog Anda, jadi apa yang dapat Anda jalankan bergantung pada paket Apidog Anda, tetapi command-line runner bukanlah produk berbayar terpisah.
Apakah saya harus menulis pengujian sebagai kode untuk salah satu runner?
Untuk Bruno, pengujian Anda adalah file .bru yang dapat Anda edit secara manual atau buat di aplikasi Bruno, jadi ada format teks yang akan Anda sentuh secara langsung. Untuk Apidog, Anda membangun skenario secara visual di aplikasi dan CLI menjalankannya berdasarkan ID, jadi Anda tidak memelihara kode pengujian secara manual. Itulah perbedaan pembuatan inti antara keduanya.
Apakah kedua runner menyebabkan build gagal ketika pengujian gagal?
Ya. Keduanya keluar dengan kode non-nol ketika suatu pernyataan gagal, yang dibaca oleh CI untuk menandai langkah tersebut gagal dan memblokir penggabungan atau penyebaran. --bail Bruno berhenti pada kegagalan pertama; --on-error end Apidog melakukan hal yang sama dan merupakan default. Hindari membungkus salah satu eksekusi dalam || true, yang menelan kode keluar dan merusak gerbang.
Format laporan mana yang harus saya gunakan di CI?
Gunakan JUnit XML untuk hasil yang dapat dibaca mesin yang diurai oleh dasbor CI Anda menjadi pohon lulus/gagal, dan tambahkan HTML jika Anda menginginkan artefak yang dapat dijelajahi. Bruno menuliskannya dengan --reporter-junit dan --reporter-html; Apidog menggunakan -r html,junit. Keduanya juga mendukung JSON untuk pemrosesan pasca-kustom.
Apakah Bruno CLI memerlukan koneksi internet atau akun untuk berjalan?
Tidak. Bruno menjalankan file .bru di repositori Anda secara lokal, tanpa login dan tanpa pengambilan jarak jauh, yang membuatnya cocok untuk CI offline atau terisolasi. CLI Apidog mengautentikasi dengan token akses dan mengambil skenario dari proyek Anda, jadi memerlukan akses jaringan ke layanan Apidog pada saat eksekusi.
Bisakah saya menjalankan salah satu CLI tanpa instalasi global?
Ya, untuk keduanya. Gunakan npx @usebruno/cli run ... atau npx apidog-cli run ... untuk mengeksekusi tanpa instalasi global yang persisten, yang nyaman pada runner CI sementara. Jalankan bru run --help atau apidog run --help untuk mengonfirmasi opsi yang tersedia di versi yang Anda instal.
