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.
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:
hvis vi ønskede at teste dette, kunne vi oprette enmain_test.go
fil i samedirectory og skrive følgende test:
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:
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:
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:
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:
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
:
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.