Skip to content
Santekno.com | Level Up Your Engineering Skills
ID
📖 0%
15 Aug 2023 · 3 mnt baca ·Artikel 32 / 119
Go

02 Penggunaan HTTP Test

IH
Ihsan Arif
Penulis di Santekno · Backend Engineer

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 membuat http.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 membuat ResponseRecorder 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.

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.

go
 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}
Lalu kita update fungsi tersebut dan kita akan melakukan implementasi httptest package menjadi seperti ini.
go
 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}
Ketika kita jalankan unit test tersebut dengan perintah dibawah ini
bash
1go test
maka hasilnya jika sudah sesuai akan menghasilkan seperti ini
bash
1➜  learn-golang-web git:(main) ✗ go test                                  
2PASS
3ok      github.com/santekno/learn-golang-web  0.984s

Artikel Terkait

💬 Komentar