Pengenalan HTTP Test
HTTP Test pada golang sudah disediakan package khusus untuk membuat unit test terhadap fitur Web. Semua itu ada pada package net/http/httptest
https://golang.org/pkg/net/http/httptest/. Dengan menggunakan package ini, kita bisa melakukan unit test terhadap handler web yang sudah kita buat tanpa harus menjalankan aplikasi web-nya sehingga kita bisa langsung fokus terhadap handler function yang ingin kita test.
Method-method yang ada pada HTTP Test
httptest.NewRequest
merupakan function yang digunakan untuk membuathttp.Request
. Kita bisa menentukan method, url, body yang akan kita kirim sebagai simulasi unit test. Kita juga bisa menambahkan informasi tambahan lainnya pada request yang ingin kita kirim seperti header, cookie dan lain-lain.httptest.NewRecorder()
merupakan fungsi yang digunakan untuk membuatResponseRecorder
yang mana ini merupakan struct bantuan untuk merekam HTTP response dari hasil testing yang kita lakukan.
Cara implementasi HTTP Test
Kita coba untuk membuat handler yang bisa kita testing, pada postingan sebelumnya kita sudah bisa memnbuat HelloHandler
yang mana pada sesi kali ini kita akan tambahkan unit test untuk handler tersebut. Caranya yaitu kita buat file pada projek learn-golang-web
dan buat file http_handler.go
.
package main
import (
"fmt"
"net/http"
)
func HelloHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Hello World")
}
Jika kamu menggunakan vscode maka tinggal buka file yang sudah kita buat lalu hover cursor kita ke fungsi yg sudah kita buat dan klik kanan pilih Go: Generate Unit Tests for function
. Maka akan terbuat file http_handler_test.go
dengan isi seperti ini.
package main
import (
"net/http"
"testing"
)
func TestHelloHandler(t *testing.T) {
type args struct {
w http.ResponseWriter
r *http.Request
}
tests := []struct {
name string
args args
}{
// TODO: Add test cases.
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
HelloHandler(tt.args.w, tt.args.r)
})
}
}
Lalu kita update fungsi tersebut dan kita akan melakukan implementasi httptest
package menjadi seperti ini.
func TestHelloHandler(t *testing.T) {
tests := []struct {
name string
want string
}{
{
name: "mencetak Hello World",
want: "Hello World\n",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
request := httptest.NewRequest(http.MethodGet, "http://localhost/hello", nil)
recorder := httptest.NewRecorder()
HelloHandler(recorder, request)
response := recorder.Result()
body, _ := io.ReadAll(response.Body)
bodyString := string(body)
if !reflect.DeepEqual(bodyString, tt.want) {
t.Errorf("response = %v, want %v", bodyString, tt.want)
}
})
}
}
Ketika kita jalankan unit test tersebut dengan perintah dibawah ini
go test
maka hasilnya jika sudah sesuai akan menghasilkan seperti ini
➜ learn-golang-web git:(main) ✗ go test
PASS
ok github.com/santekno/learn-golang-web 0.984s