Bruno
Bruno er eit enkelt open-source verktøy for API-testing (HTTP eller GraphQL), og er eit alternativ til mykje brukte verktøy som Postman, Insomnia og SoapUI.
Nokre av fordelane med Bruno for oss som er utviklarar er:
- Det er eit open-source-alternativ og krev dermed ingen dyre lisensar
- Har lavt ressursforbruk, er raskt og enkelt å bruke
- Primært laga for utviklarar med kodefokus (men har både GUI og CLI)
- Alt lagrast lokalt og kan enkelt versjonerast i feks Git
Dette siste punktet er spesielt viktig for mange der det stillast krav til kvar data lagrast. Typisk når ein testar API så kan ein ende opp med å bruke produksjonsliknande data for å få realistiske testar. For mange er det då viktig å ha kontroll på kvar dataene lagrast, og då er det praktisk at alt i utgangspunktet kun lagrast lokalt. Ein kan så leggje filene inn i eigen Git. Mange API-verktøy lagrar data kun i sky, utan nødvendigvis å tilby ein konkret region for lagring.
Det er også praktisk i forhold til å deling i team at det er Git som vert brukt for versjonskontroll.
GUI og CLI
Ein kan sjølv velgje om ein vil bruke Bruno som ein GUI-applikasjon, eller om ein vil redigere filene manuelt i valfri editor. Ein kan også fritt byte mellom desse, og både editor og Bruno GUI er alltid synkroniserte. Eksempel på begge ser du lenger nede på sida.
Sentrale element
Sentrale element i Bruno er:
- På toppnivå har ein Collections, som i filsystemet vert ein katalog
- Inne i ein Collection så har ein Requestar, som i filsystemet vert ei fil for kvar request
- Ein kan så leggje inn Assertions som er sjekkar på at dataene som vert produsert av APIet er riktige. Desse ligg inne i same fil som requesten sjølv
- Ein kan også leggje inn meir avanserte testar som gjerne då er skrivne i JavaScript. Desse ligg også i same fil som requesten
- Ein kan så definere ulike variablar som varerer mellom ulike miljø (feks test og produksjon). Her har kvart miljø si eiga fil
Import og eksport
Det er mogleg å importere og eksportere data blant anna til og frå Bruno sitt eige format, Postman Collections, eller OpenAPI V3 (Swagger).
Eksempel
Kor mange dagar er det eigentleg igjen til jul? For å ha full kontoll på dette så er det greit å ha eit API som hjelper deg med det. Ein enkel request i Bruno kan sjå slik ut (TimeleftSimple.bru):
meta {
name: TimeleftSimple
type: http
seq: 4
}
get {
url: https://christmascountdown.live/api/timeleft/?language=en&timezone=Europe/Oslo
body: none
auth: none
}
params:query {
language: en
timezone: Europe/Oslo
}
assert {
res.status: eq 200
res.body.days: lte 13
res.body.months: lt 1
}
Ein kan køyre denne fila med Bruno CLI ved å utføre
$ bru run TimeleftSimple.bru
Eksempel med parameterisering
For litt større testar så er det betre å parameterisere requestane litt, og også lagre miljøspesifikke data i eigne filer. Dermed kan ein køyre same request både mot testmiøljø og produksjonsmiljø.
Ein parameterisert versjon av requesten over kan sjå slik ut (Timeleft.bru):
meta {
name: Timeleft
type: http
seq: 3
}
get {
url: {{baseUrl}}/:operation/?language={{lang}}&timezone={{tz}}
body: none
auth: none
}
params:query {
language: {{lang}}
timezone: {{tz}}
}
params:path {
operation: timeleft
}
assert {
res.status: eq 200
res.body.days: lte 13
res.body.months: lt 1
}
tests {
test("should succeed", function() {
const data = res.getBody();
expect(res.getStatus()).to.equal(200);
});
test("should receive month", function() {
const data = res.getBody();
expect(data.months).to.be.a('number');
});
}
Denne versjonen refererer til ein del variablar som er definert i fila Produksjon.bru:
vars {
baseUrl: https://christmascountdown.live/api
lang: en
tz: Europe/Oslo
}
Denne versjonen køyrer ein slik med Bruno CLI:
bru run Timeleft.bru --env Produksjon
I begge tilfeller kan ein få resultat omlag som dette:
Running Request
Timeleft (200 OK) - 462 ms
✓ assert: res.status: eq 200
✓ assert: res.body.days: lte 13
✓ assert: res.body.months: lt 1
✓ should succeed
✓ should receive month
Requests: 1 passed, 1 total
Tests: 2 passed, 2 total
Assertions: 3 passed, 3 total
Ran all requests - 462 ms
Requests: 1 passed, 1 total
Tests: 2 passed, 2 total
Assertions: 3 passed, 3 total
Ein kan også gjere det same frå Bruno GUI:
Meir informasjon om Bruno kan ein finne her:
Meir informasjon om dette dagsaktuelle API-et finn du her: