Go:
Pisanie testów

Jak to zrobić:

W Go testy są zazwyczaj pisane w tym samym pakiecie co kod, który testują. Pliki zawierające testy nazwane są z sufiksem _test.go. Testy to funkcje, które przyjmują wskaźnik do obiektu testing.T (z pakietu testing) jako argument i sygnalizują niepowodzenie, wywołując metody takie jak t.Fail(), t.Errorf() itp.

Przykład prostego testu dla funkcji Add zdefiniowanej w math.go:

// math.go
package matematyka

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

Plik testowy math_test.go:

package matematyka

import "testing"

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

Uruchom swoje testy poleceniem go test w tym samym katalogu co Twoje pliki testowe. Przykładowe wyjście wskazujące na zdany test wyglądałoby podobnie do:

PASS
ok      example.com/my/math 0.002s

Dla testów sterowanych tabelą, które pozwalają na efektywne testowanie różnych kombinacji danych wejściowych i wyjściowych, zdefiniuj tablicę struktur reprezentujących przypadki testowe:

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

    for _, tt := range tests {
        testname := fmt.Sprintf("%d+%d", tt.x, tt.y)
        t.Run(testname, function(t *testing.T) {
            ans := Add(tt.x, tt.y)
            if ans != tt.expected {
                t.Errorf("otrzymano %d, oczekiwano %d", ans, tt.expected)
            }
        })
    }
}

Dogłębna analiza

Framework testowy Go, wprowadzony w Go 1 razem z samym językiem, został zaprojektowany w celu bezproblemowej integracji z narzędziowiem Go, odzwierciedlając nacisk Go na prostotę i efektywność w rozwoju oprogramowania. W przeciwieństwie do niektórych frameworków testowych w innych językach, które polegają na zewnętrznych bibliotekach lub skomplikowanych konfiguracjach, wbudowany pakiet testing Go zapewnia prosty sposób na pisanie i uruchamianie testów.

Interesującym aspektem podejścia Go do testowania jest zasada konwencji ponad konfiguracją, którą przyjmuje, tak jak wzorzec nazewnictwa plików (_test.go) i używanie funkcjonalności biblioteki standardowej zamiast zewnętrznych zależności. To minimalizujące podejście zachęca programistów do pisania testów, ponieważ bariery wejścia są niskie.

Chociaż wbudowane narzędzia testowe Go pokrywają szeroki zakres, są scenariusze, w których narzędzia lub frameworki stron trzecich mogą oferować więcej funkcjonalności, takie jak generowanie atrap, testowanie fuzzowe czy testy w stylu Behavior-Driven Development (BDD). Popularne biblioteki takie jak Testify czy GoMock uzupełniają standardowe możliwości testowania w Go, oferując bardziej wyraziste asercje czy możliwości generowania atrap, które mogą być szczególnie przydatne w skomplikowanych aplikacjach z wieloma zależnościami.

Pomimo istnienia tych alternatyw, standardowy pakiet testowy Go pozostaje kamieniem węgielnym testowania w Go ze względu na jego prostotę, wydajność i ścisłą integrację z językiem oraz narzędziowiem. Niezależnie od tego, czy programiści zdecydują się na uzupełnienie go narzędziami stron trzecich, czy nie, framework testowy Go zapewnia solidną podstawę do zapewniania jakości i niezawodności kodu.