Bruno vs Postman

Luca Minuti - Jul 30 - - Dev Community

Per chi sviluppa server ReST l’uso di un tool per testare le proprie API è fondamentale. Fino a poco tempo fa lo standard di fatto per questo tipo di applicazioni era Postman. Ultimamente però lo scenario è cambiato e si trovano diverse alternative, una delle più interessanti è Bruno.

Chi conosce Postman non farà fatica ad usare Bruno, infatti, l’interfaccia utente è molto simile e anche alcuni concetti come le Collection, Environment, Script e Test sono praticamente gli stessi. Però ci sono alcune differenze sostanziali. La più interessante è che, mentre Postman richiede la creazione di un account per condividere le collections, Bruno sfrutta Git (o qualunque altro version control). Questa caratteristica è molto interessante perché permette di “versionare” le collections e i vari test insieme alle API.

Bruno UI

Bru Markup Language

In effetti quando viene salvata una collection vengono fisicamente salvati vari file in formato Bru in una cartelle del file system. La prima volta che ho visto il file Bru mi sono chiesto perché usare l’ennesimo formato custom simil JSON invece di JSON, YAML, TOML o qualcosa di già esistente.

Andando a leggere la documentazione e vari forum ho capito che c’era un ottimo motivo per questa scelta. E questo risiede sempre nella volontà di integrarsi con il version control. Infatti bisogna tener presente che nei file Bru ci sono alcune informazioni molto semplici — come metodo HTTP, headers, queryparams — che si prestano molto bene ad essere strutturate in un JSON; ma ci sono anche blocchi di codice JavaScript (per gli script e i test) e documentazione in Markdown o altro che inseriti in un JSON lo renderebbero pressoché illeggibile ostacolando notevolmente operazioni come diff o merge.

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

get {
    url: https://reqres.in/api/users
    body: none
}

assert {
    res.status: 200
}

tests {
    test("status code is 200", function() {
        expect(res.status).equal(200);
    });
}
Enter fullscreen mode Exit fullscreen mode

Bru command line

Una caratteristica interessante di Bruno è la possibilità di automatizzare l’esecuzione delle varie collection dalla linea di comando. Per esempio questo comando lancerà tutte le richieste della collection:

bru run
Enter fullscreen mode Exit fullscreen mode

Ovviamente è anche possibile lanciare una singola collection:

bru run request.bru
Enter fullscreen mode Exit fullscreen mode

specificare un particolare environment:

bru run folder --env Local
Enter fullscreen mode Exit fullscreen mode

e molto altro. Questo è un esempio dell’output del comando precedente:

Output del comando precedente
Nella documentazione ufficiale sono specificati tutti i parametri.

Scripting

Bruno offre la possibilità di scrivere anche del codice JavaScript per automatizzare diverse operazioni per esempio:

  • Recuperare automaticamente il token di autenticazione
  • Generare dati fittizi
  • Validare la risposta
  • Integrare la richiesta con dati provenienti da altre API

Per esempio il codice seguente inserito in uno script “post response” permette di recuperare il token dalla risposta e inserirlo in una variabile in modo da poterlo usare in tutte le chiamate successive:

bru.setEnvVar("jwt_token", res.getBody().access_token);
Enter fullscreen mode Exit fullscreen mode

Invece il codice seguente, inserito in uno script “Pre request” permette di popolare il corpo di una richiesta con dei dati fittizi:

const {faker} = require("@faker-js/faker");
const name = faker.name.fullName();
const email = faker.internet.email();

req.setBody({
    name,
    email
});
Enter fullscreen mode Exit fullscreen mode

Notare che in quest’ultimo caso è stata usata una libreria esterna. Bruno infatti permette di usare una selezione di librerie JavaScript (ajx, axios, node-fetch, lodash, moment, ecc.) semplicemente importandole (require) oppure con un processo un po’ più complicato di usare qualunque libreria.

Link

Home page: https://www.usebruno.com/

Documentazione: https://docs.usebruno.com/introduction/getting-started

Discord: https://discord.com/invite/KgcZUncpjq

. . . . . . . . . . . .