pemrograman

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.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.

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
comments powered by Disqus