Lompati ke konten utama
Modul 9 · Pelajaran 1 dari 541/50 dalam kursus~12 min
Pelajaran modul (1/5)

Paket `pengujian`

Di Go, pengujian adalah bagian dari stdlib: tidak ada pustaka eksternal, tidak ada kerangka kerja yang perlu dikonfigurasi. Yang Anda perlukan hanyalah file *_test.go di samping kode, beberapa fungsi TestXxx, dan perintah go test.

Konvensi dasar

  • File pengujian diberi nama <something>_test.go dan berada dalam paket yang sama dengan kode yang diuji (atau dalam paket <name>_test untuk "pengujian kotak hitam").
  • Fungsi pengujian memiliki tanda tangan tepat: func TestXxx(t *testing.T) dengan Xxx dimulai dengan huruf besar.
  • Anda mengimpor testing dari stdlib.
  • Tidak assertEquals: Anda menggunakan if got != want { t.Errorf(...) } dengan kata kerja fmt.
Go
// math.go
package math

func Sum(a, b int) int { return a + b }

// math_test.go
package math

import "testing"

func TestSum(t *testing.T) {
    got := Sum(2, 3)
    if got != 5 {
        t.Errorf("Sum(2,3) = %d; voglio %d", got, 5)
    }
}

Jalankan dengan:

Bash
go test ./...        # all packages in the module
go test -v ./pkg     # verbose: prints test names
go test -run TestSum  # only tests matching the regex

t.Error vs t.Fatal

Ini adalah dua kata kerja dasar yang menandakan kegagalan:

MetodeEfek
t.Log(args...)Log tetapi tidak gagal (hanya terlihat dengan -v atau jika gagal).
t.Error(args...)Mencatat, menandai GAGAL, ​​melanjutkan fungsi pengujian.
t.Errorf(fmt, ...)Seperti Error dengan format.
t.Fatal(args...)Mencatat, menandai GAGAL, ​​menghentikan pengujian (memanggil runtime.Goexit).
t.Fatalf(fmt, ...)Seperti Fatal dengan format.

Aturan praktisnya: gunakan Fatal ketika melanjutkan tidak masuk akal (misalnya, penyiapan gagal, dereferensi penunjuk nihil akan segera terjadi); jika tidak Error, yang memungkinkan Anda melihat semua kegagalan dalam sekali proses.

Go
func TestOpen(t *testing.T) {
    f, err := os.Open("fixtures/sample.txt")
    if err != nil {
        t.Fatal(err) // if it doesn't open, the next steps would fail on nil
    }
    defer f.Close()
    // ... assert on content with t.Errorf
}

Penyiapan dan pembongkaran dengan t.Cleanup

Untuk melepaskan sumber daya di akhir pengujian (atau subtes), gunakan t.Cleanup alih-alih defer:

Go
func TestDB(t *testing.T) {
    db := newTestDB(t)
    t.Cleanup(func() { db.Close() })
    // ... test
}

Keuntungan dibandingkan defer: helper yang membuat db dapat mendaftarkan pembersihan secara internal, sehingga penelepon tidak perlu mengingatnya.

Tes pembantu

Metode t.Helper() menandai suatu fungsi sebagai "pembantu": ketika pengujian gagal, pelacakan tumpukan melewati fungsi pembantu dan menunjuk langsung ke pemanggil:

Go
func mustParseInt(t *testing.T, s string) int {
    t.Helper()
    n, err := strconv.Atoi(s)
    if err != nil {
        t.Fatalf("parse %q: %v", s, err)
    }
    return n
}

Latihan

Latihan#go.m9.l1.e1
Upaya: 0Memuat…

Tentukan fungsi TestSum yang memverifikasi Sum(2,3) == 5 menggunakan t.Errorf dengan pesan yang diformat.

Memuat editor…

Solusi tersedia setelah 3 upaya

Latihan#go.m9.l1.e2
Upaya: 0Memuat…

Di TestDiv, gunakan t.Fatal untuk segera menghentikan pengujian jika Div mengembalikan nilai yang tidak diharapkan.

Memuat editor…

Solusi tersedia setelah 3 upaya

Quiz#go.m9.l1.e3
Siap

Apa perbedaan mendasar antara t.Error dan t.Fatal?

Go
if err != nil {
  t.???(err)
}
Pilihan jawaban