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.

Esempio di struttura del progetto
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:

principale.go

Se volessimo testarlo potremmo creare un file main_test.go all’interno di samedirectory e scrivere il seguente test:

main_test.vai
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:

go go test
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:

go vai alla prova
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:

go go test-v

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:

go go test-cover
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:

go go test-coverprofile=coverage.out
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.