Go:
Skrive tester

Hvordan:

I Go skrives tester typisk i samme pakke som koden de tester. Filer som inneholder tester er navngitt med suffikset _test.go. Tester er funksjoner som tar en peker til testing.T-objektet (fra testing-pakken) som et argument, og de signaliserer feil ved å kalle metoder som t.Fail(), t.Errorf(), osv.

Eksempel på en enkel test for en funksjon Add definert i math.go:

// math.go
package math

func Add(x, y int) int {
    return x + y
}

Testfil math_test.go:

package math

import "testing"

func TestAdd(t *testing.T) {
    result := Add(1, 2)
    forventet := 3
    if result != forventet {
        t.Errorf("Add(1, 2) = %d; vil ha %d", result, forventet)
    }
}

Kjør testene dine med kommandoen go test i samme katalog som testfilene dine. Et eksempel på utdata som indikerer en bestått test ville se slik ut:

PASS
ok      example.com/my/math 0.002s

For tabelldrevne tester, som lar deg effektivt teste ulike inngangs- og utgangskombinasjoner, definer en skive med strukturer som representerer testtilfeller:

func TestAddTableDriven(t *testing.T) {
    var tests = []struct {
        x        int
        y        int
        forventet int
    }{
        {1, 2, 3},
        {2, 3, 5},
        {-1, -2, -3},
    }

    for _, tt := range tests {
        testnavn := fmt.Sprintf("%d+%d", tt.x, tt.y)
        t.Run(testnavn, func(t *testing.T) {
            ans := Add(tt.x, tt.y)
            if ans != tt.forventet {
                t.Errorf("fikk %d, vil ha %d", ans, tt.forventet)
            }
        })
    }
}

Dypdykk

Go-testrammeverket, introdusert i Go 1 samtidig som språket selv, ble designet for å integreres sømløst med Go-verktøysettet, noe som reflekterer Go sin vektlegging av enkelhet og effektivitet i programvareutvikling. I motsetning til noen testrammeverk i andre språk som er avhengige av eksterne biblioteker eller komplekse oppsett, gir Go sitt innebygde testing-pakke en enkel måte å skrive og kjøre tester på.

Et interessant aspekt ved Go sin tilnærming til testing er prinsippet om konvensjon over konfigurasjon det vedtar, som filnavnmønsteret (_test.go) og bruk av standardbibliotekfunksjoner over eksterne avhengigheter. Denne minimalistiske tilnærmingen oppmuntrer utviklere til å skrive tester, da barrieren for å starte er lav.

Selv om Go sine innebygde testfasiliteter dekker mye, er det scenarioer hvor tredjepartsverktøy eller rammer kan tilby mer funksjonalitet, som mock-generering, fuzz-testing, eller behavior-driven development (BDD)-stiltester. Populære biblioteker som Testify eller GoMock komplementerer Go’s standard testingsevner, og tilbyr mer uttrykksfulle påstander eller mock-genereringskapabiliteter, noe som kan være spesielt nyttig i komplekse applikasjoner med mange avhengigheter.

På tross av eksistensen av disse alternativene, forblir den standard Go-testpakken hjørnesteinen for testing i Go på grunn av sin enkelhet, ytelse, og tett integrasjon med språket og verktøysettet. Enten utviklere velger å forsterke den med tredjepartsverktøy eller ikke, gir Go-testrammeverket et solid grunnlag for å sikre kodekvalitet og pålitelighet.