Menguji API dengan httptest
Memahami httptest.NewRequest, NewRecorder, dan ServeHTTP, lalu menulis pengujian otomatis untuk handler.
Kenapa perlu menguji?
Setiap kali kamu mengubah kode, bagaimana memastikan endpoint lama tidak rusak? Mengetik curl berulang kali melelahkan. Dengan pengujian otomatis, satu perintah go test mengecek semuanya dalam hitungan detik.
Tiga alat dari net/http/httptest
Selama ini kamu sudah memakai ketiganya lewat fungsi call. Sekarang kita bedah:
| Alat | Fungsi |
|---|---|
httptest.NewRequest(method, path, body) | Membuat request palsu (tanpa jaringan) |
httptest.NewRecorder() | Membuat penampung jawaban yang menyimpan status, header, dan body |
handler.ServeHTTP(rec, req) | Menjalankan handler dengan request itu, hasilnya masuk ke rec |
Setelah dijalankan: rec.Code berisi status code, rec.Body.String() berisi isi jawaban, rec.Header() berisi header.
Bentuk file pengujian sungguhan
Di komputermu, simpan sebagai main_test.go (akhiran _test.go wajib) lalu jalankan go test:
func TestPing(t *testing.T) {
req := httptest.NewRequest("GET", "/ping", nil)
rec := httptest.NewRecorder()
Ping(rec, req)
if rec.Code != http.StatusOK {
t.Errorf("status = %d, mau %d", rec.Code, http.StatusOK)
}
if rec.Body.String() != "pong" {
t.Errorf("body = %q, mau %q", rec.Body.String(), "pong")
}
}
- Nama fungsi diawali
Testdan menerimat *testing.T. t.Errorfmenandai pengujian gagal dengan pesan, tetapi pengujian tetap berlanjut.
Di kotak latihan
Kotak latihan menjalankan program biasa (bukan go test), jadi kita membuat fungsi bantu doRequest dan mencetak PASS/FAIL sendiri. Intinya sama: kirim request palsu, bandingkan hasil dengan harapan.