Go:
Tests Schrijven
Hoe te:
In Go worden tests doorgaans geschreven in hetzelfde pakket als de code die ze testen. Bestanden met tests krijgen de _test.go
suffix. Tests zijn functies die een pointer naar het testing.T object (uit het testing
pakket) als argument nemen, en ze signaleren falen door methoden aan te roepen zoals t.Fail()
, t.Errorf()
, enz.
Voorbeeld van een eenvoudige test voor een functie Add
gedefinieerd in math.go
:
// math.go
package math
func Add(x, y int) int {
return x + y
}
Testbestand math_test.go
:
package math
import "testing"
func TestAdd(t *testing.T) {
resultaat := Add(1, 2)
verwacht := 3
if resultaat != verwacht {
t.Errorf("Add(1, 2) = %d; wil %d", resultaat, verwacht)
}
}
Voer je tests uit met het commando go test
in dezelfde directory als je testbestanden. Voorbeelduitvoer die aangeeft dat een test slaagt, zou er als volgt uitzien:
PASS
ok example.com/my/math 0.002s
Voor tabelgestuurde tests, die je in staat stellen om efficiënt verschillende invoer- en uitvoercombinaties te testen, definieer je een slice van structs die testgevallen vertegenwoordigen:
func TestAddTableDriven(t *testing.T) {
var tests = []struct {
x int
y int
verwacht int
}{
{1, 2, 3},
{2, 3, 5},
{-1, -2, -3},
}
for _, tt := range tests {
testnaam := fmt.Sprintf("%d+%d", tt.x, tt.y)
t.Run(testnaam, functie(t *testing.T) {
antw := Add(tt.x, tt.y)
if antw != tt.verwacht {
t.Errorf("kreeg %d, wil %d", antw, tt.verwacht)
}
})
}
}
Diepgaand
Het Go-testframework, geïntroduceerd in Go 1 samen met de taal zelf, was ontworpen om naadloos te integreren met de Go toolchain, wat Go’s nadruk op eenvoud en efficiëntie in de softwareontwikkeling weerspiegelt. In tegenstelling tot sommige testframeworks in andere talen die afhankelijk zijn van externe bibliotheken of complexe opstellingen, biedt Go’s ingebouwde testing
pakket een eenvoudige manier om tests te schrijven en uit te voeren.
Een interessant aspect van Go’s benadering van testen is het principe van conventie boven configuratie dat het aanneemt, zoals het bestandsbenamingspatroon (_test.go
) en het gebruik van standaardbibliotheekfunctionaliteiten boven externe afhankelijkheden. Deze minimalistische aanpak moedigt ontwikkelaars aan om tests te schrijven, aangezien de instapdrempel laag is.
Hoewel Go’s ingebouwde testfaciliteiten veel dekken, zijn er scenario’s waarin externe tools of frameworks meer functionaliteiten kunnen bieden, zoals mock-generatie, fuzz testing, of behavior-driven development (BDD) stijltests. Populaire bibliotheken zoals Testify of GoMock vullen de standaardtestmogelijkheden van Go aan, en bieden meer expressieve beweringen of mogelijkheden voor mock-generatie, die met name nuttig kunnen zijn in complexe applicaties met veel afhankelijkheden.
Ondanks het bestaan van deze alternatieven blijft het standaard Go-testpakket de hoeksteen voor testen in Go vanwege de eenvoud, prestaties, en strakke integratie met de taal en toolchain. Of ontwikkelaars het nu aanvullen met externe tools of niet, het Go-testframework biedt een solide basis voor het waarborgen van codekwaliteit en betrouwbaarheid.