En introduktion til test I Go

test er enormt vigtigt i alle programmer. At være i stand til at sikre korrektheden af din kode og sikre, at eventuelle ændringer, du foretager, ikke ender med at bryde noget andet i forskellige dele af din kodebase, er enormt vigtigt.

ved at tage sig tid til tilstrækkeligt at teste dine go-programmer tillader du dig selv at udvikle hurtigere med en større følelse af tillid til, at det, du udvikler, vil fortsætte med at fungere, når du frigiver det til produktion.

mål

ved afslutningen af denne tutorial vil du have en god forståelse af at teste grundlæggende funktionerog metoder I Go ved hjælp af standard "testing" pakke.

du vil have haft erfaring med at skrive borddrevne tests, og du vil også se, hvordan du genererer mere detaljeret output fra dine tests ved hjælp af de forskellige flagsavailable.

Video Tutorial

denne tutorial kan findes i videoformat, hvis du foretrækker det:

introduktion

i denne vejledning skal vi se på, hvordan du kan udvikle og køre test fordin go-kode ved hjælp af kommandoen go test.

Go Test Files

hvis du har set nogen go-projekter før, har du måske bemærket, at de fleste, hvis ikkealle filer i projektet, har en FILE_test.go modstykke inden for samme mappe.

dette er ikke en ulykke. Dette er de filer, der indeholder alle enhedstestene til projektet, og de tester al koden inden for deres kolleger.

projektstruktur eksempel
myproject/- calc.go- calc_test.go- main.go- main_test.go

en simpel testfil

Forestil dig, at vi havde et meget simpelt go-program, der bestod af en fil ogfeatured en calculate() funktion. Denne calculate() funktion tager simpelthen 1number og tilføjer 2 til den. Nice og enkel at få os op at køre:

main.gå

hvis vi ønskede at teste dette, kunne vi oprette enmain_test.gofil i samedirectory og skrive følgende test:

main_test.gå
package mainimport ( "testing")func TestCalculate(t *testing.T) { if Calculate(2) != 4 { t.Error("Expected 2 + 2 to equal 4") }}

kører vores test

nu hvor vi har oprettet vores første go-test, er det tid til at køre dette og se, om ourcode opfører sig som vi forventer det. Vi kan udføre vores test ved at køre:

$ go test

dette skal derefter udsende noget, der ligner følgende:

$ go test
PASSok _/Users/elliot/Documents/Projects/tutorials/golang/go-testing-tutorial 0.007s

Tabeldrevet test

nu hvor vi er glade for, at en beregning fungerer, skal vi se på at forbedre tilliden ved at tilføje et par ekstra testcases i vores kode. Hvis vi vilgradvist opbygge en række testsager, der altid testes, kan viudvikle en array af test som sådan:

her erklærer vi en struktur, der indeholder både et input og den forventede værdi. Vi gentager derefter listen over test med vores for _, test := range tests opkald og kontroller for at se,at vores funktion altid returnerer de forventede resultater, uanset input.

når vi kører vores test suite nu, skal vi se det samme output som før:

$ go test
PASSok _/Users/elliot/Documents/Projects/tutorials/golang/go-testing-tutorial 0.007s

Verbose Test Output

nogle gange kan du ønske at se præcis, hvilke tests der kører, og hvor længe de tog. Heldigvis er dette tilgængeligt, hvis du bruger -v– flaget, når du kører yourtests som sådan:

$ go test-v

du kan se, at både vores normale test og vores tabeltest kørte og bestod og tookless end 0.00s at udføre.

kontrol af testdækning

testdækning er en metrisk, som jeg til tider har set misbrugt af virksomheder. Disse virksomheder sætter mål på alle deres systemer, såsom “kodebasen skal være mindst 75% dækket af test”.

men denne form for mål kan føre til dårlig adfærd og udvikling hold “gaming”systemet for at forsøge at ramme disse mål. Jeg har set folk i nogle holdtilbringe dage med at skrive enhedstest, der tester grundlæggende getters og setters på sprogsåsom Java.

test er enormt vigtigt, men du skal være pragmatisk om, hvordan du tester dine systemer, så de tests, du skriver, giver dig mest værdi.

de dage, der blev brugt på at skrive test til at dække uvæsentlige dele af din kodebase, kunne have været bedre brugt på at skrive testcases omkring den kritiske forretningslogikfangede inden for dine systemer og sikre, at flere kantcases er dækket.

brug af-cover-flag

med den vigtige del ude af vejen, lad os se på, hvordan du kan kontrolleretest dækning af dit system ved hjælp af kommandoen go test:

inden for samme mappe som din main.go og dine main_test.go filer, kørfølgende:

$ go test-cover
PASScoverage: 66.7% of statementsok github.com/TutorialEdge/an-intro-to-testing-in-go 0.006s

du vil se, at du har 66.7% af din samlede Go-kode dækket af testcases.

visualisering af dækning

mens denne 66.7% værdi kan fortælle os,hvor meget af vores kode vi har testet, viser den os ikke nøjagtigt, hvilke kodestier vi har eller ikke har testet.

det er her go test og go tool cover kommer ind for at hjælpe os med at løseDette særlige problem.

vi kan bruge værktøjet go test til at generere en coverprofile, som derefter kan omdannes til en HTML-visualisering ved hjælp af kommandoengo tool cover:

$ go test-coverprofile=dækning.ud
PASScoverage: 66.7% of statementsok github.com/TutorialEdge/an-intro-to-testing-in-go 0.008s

du kan derefter tage denne genererede coverage.out fil og bruge den til at generereen HTML-side, der viser nøjagtigt, hvilke linjer der er dækket som sådan:

$ go tool cover -html=coverage.out

dette åbner en side i din valgte bro. ser, der ser lidt ud som dette:

som du kan se, er det meste af koden inden for vores Calculate funktion test ogfunktioner Green dækning. Mens udskriftsopgørelsen i din main funktioner Red da dette ikke er dækket af tests.

konklusion

forhåbentlig fandt du denne tutorial nyttig! Hvis du har brug for yderligere hjælp, er du velkommen til at fortælle mig det i kommentarfeltet nedenfor.