Un’introduzione ai test in Go
Il test è estremamente importante in tutti i software. Essere in grado di garantire la correttezza del tuo codice e garantire che tutte le modifiche apportate non finiscano per distruggere qualsiasi altra cosa in diverse parti della tua base di codice è estremamente importante.
Prendendo il tempo per testare adeguatamente i tuoi programmi go ti permetti di sviluppare più velocemente con un maggiore senso di fiducia che ciò che stai sviluppando continuerà a funzionare quando lo rilasci alla produzione.
Obiettivi
Entro la fine di questo tutorial, si avrà una buona conoscenza di test di base functionsand metodi in Go utilizzando lo standard "testing"
pacchetto.
Avrai avuto esperienza nella scrittura di test basati su tabelle e vedrai anche come generare un output più dettagliato dai tuoi test usando i vari flagsavailable.
Video Tutorial
Questo tutorial può essere trovato in formato video, se si preferisce:
Introduzione
In questo tutorial vedremo come è possibile sviluppare ed eseguire test per il codice go utilizzando il comando go test
.
File di test Go
Se hai già visto progetti go, potresti aver notato che la maggior parte, se non tutti i file all’interno del progetto, presentano una controparte FILE_test.go
all’interno della stessa directory.
Questo non è un incidente. Questi sono i file che contengono tutti i test unitari per il progetto e testano tutto il codice all’interno delle loro controparti.
myproject/- calc.go- calc_test.go- main.go- main_test.go
Un semplice file di test
Immagina di avere un programma go molto semplice composto da un file e dotato di una funzione calculate()
. Questa funzione calculate()
prende semplicemente 1number e ne aggiunge 2. Bello e semplice per farci installato e funzionante:
Se volessimo testarlo potremmo creare un file main_test.go
all’interno di samedirectory e scrivere il seguente test:
package mainimport ( "testing")func TestCalculate(t *testing.T) { if Calculate(2) != 4 { t.Error("Expected 2 + 2 to equal 4") }}
Esecuzione dei nostri test
Ora che abbiamo creato il nostro primo test go, è il momento di eseguirlo e vedere se il nostro codice si comporta come ci aspettiamo. Possiamo eseguire i nostri test eseguendo:
$ go test
Questo dovrebbe quindi produrre qualcosa di simile al seguente:
PASSok _/Users/elliot/Documents/Projects/tutorials/golang/go-testing-tutorial 0.007s
Test guidati da tabelle
Ora che siamo felici che un calcolo funzioni, dovremmo cercare di migliorare la fiducia aggiungendo alcuni casi di test aggiuntivi nel nostro codice. Se vogliamo costruire gradualmente una serie di casi di test che vengono sempre testati, possiamo calcolare un array
di test in questo modo:
Qui dichiariamo una struttura che contiene sia un input che il valore atteso. Quindi scorrere l’elenco dei test con la nostra chiamata for _, test := range tests
e verificare che la nostra funzione restituisca sempre i risultati attesi,indipendentemente dall’input.
Quando eseguiamo la nostra suite di test ora, dovremmo vedere lo stesso output di prima:
PASSok _/Users/elliot/Documents/Projects/tutorials/golang/go-testing-tutorial 0.007s
Output test dettagliato
A volte potresti voler vedere esattamente quali test sono in esecuzione e per quanto tempo hanno preso. Per fortuna, questo è disponibile se usi il flag -v
quando esegui i tuoi test in questo modo:
Puoi vedere che sia il nostro test normale che il nostro test della tabella sono stati eseguiti e passati e non sono stati eseguiti da 0.00s
.
Verifica della copertura dei test
La copertura dei test è una metrica che ho visto abusata a volte dalle aziende. Queste aziende fissano obiettivi su tutti i loro sistemi come “la base di codice deve essere coperta almeno dal 75% da test”.
Ma questo tipo di obiettivi può portare a scarso comportamento e team di sviluppo “gioco”il sistema al fine di cercare di colpire questi obiettivi. Ho visto persone in alcuni giorni di teamsspend scrivere test unitari che testano getter e setter di base in languagessuch come Java.
Il test è estremamente importante, ma devi essere pragmatico su come testare i tuoi sistemi in modo che i test che scrivi ti forniscano il massimo valore.
I giorni trascorsi a scrivere test per coprire parti non importanti della tua base di codice potrebbero essere stati spesi meglio a scrivere casi di test intorno al logiccaptured business critico all’interno dei vostri sistemi e garantire più casi limite sono coperti.
Utilizzando il flag-cover
Con la parte importante fuori strada, diamo un’occhiata a come è possibile controllare la copertura thetest del sistema utilizzando il comando go test
:
All’interno della stessa directory come il tuo main.go
e il tuo main_test.go
file, eseguire il seguente:
PASScoverage: 66.7% of statementsok github.com/TutorialEdge/an-intro-to-testing-in-go 0.006s
Vedrai che hai 66.7%
del tuo codice Go totale coperto da testcases.
Visualizzazione della copertura
Mentre questo valore 66.7%
può dirci quanto del nostro codice abbiamo testato,non ci mostra esattamente quali percorsi di codice abbiamo o non abbiamo testato.
È qui che entrano in gioco go test
e go tool cover
per aiutarci a risolvere questo particolare problema.
Possiamo usare lo strumento go test
per generare un coverprofile
che può poi essere convertito in una visualizzazione HTML usando il comando go tool cover
:
PASScoverage: 66.7% of statementsok github.com/TutorialEdge/an-intro-to-testing-in-go 0.008s
quindi, Si può prendere questo generato coverage.out
file e generatea pagina HTML che mostra esattamente quali sono le linee sono state trattate come:
$ go tool cover -html=coverage.out
si aprirà una pagina nel browser di scelta che avrà un aspetto un littlesomething come questo:
Come si può vedere, la maggior parte del codice all’interno del nostro Calculate
funzione di test di andfeatures Green
copertura. Mentre l’istruzione print nella funzione main
è Red
in quanto non è stata coperta dai test.
Conclusione
Speriamo che tu abbia trovato questo tutorial utile! Se avete bisogno di ulteriore assistenza thenplease sentitevi liberi di farmi sapere nella sezione commenti qui sotto.