02 Penggunaan HTTP Test
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.NewRequestmerupakan 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 membuatResponseRecorderyang 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.
1package main
2
3import (
4 "fmt"
5 "net/http"
6)
7
8func HelloHandler(w http.ResponseWriter, r *http.Request) {
9 fmt.Fprintln(w, "Hello World")
10}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.
1package main
2
3import (
4 "net/http"
5 "testing"
6)
7
8func TestHelloHandler(t *testing.T) {
9 type args struct {
10 w http.ResponseWriter
11 r *http.Request
12 }
13 tests := []struct {
14 name string
15 args args
16 }{
17 // TODO: Add test cases.
18 }
19 for _, tt := range tests {
20 t.Run(tt.name, func(t *testing.T) {
21 HelloHandler(tt.args.w, tt.args.r)
22 })
23 }
24}httptest package menjadi seperti ini. 1func TestHelloHandler(t *testing.T) {
2 tests := []struct {
3 name string
4 want string
5 }{
6 {
7 name: "mencetak Hello World",
8 want: "Hello World\n",
9 },
10 }
11 for _, tt := range tests {
12 t.Run(tt.name, func(t *testing.T) {
13 request := httptest.NewRequest(http.MethodGet, "http://localhost/hello", nil)
14 recorder := httptest.NewRecorder()
15 HelloHandler(recorder, request)
16
17 response := recorder.Result()
18 body, _ := io.ReadAll(response.Body)
19 bodyString := string(body)
20
21 if !reflect.DeepEqual(bodyString, tt.want) {
22 t.Errorf("response = %v, want %v", bodyString, tt.want)
23 }
24 })
25 }
26}1go test1➜ learn-golang-web git:(main) ✗ go test
2PASS
3ok github.com/santekno/learn-golang-web 0.984s