Unit Test #
Unit Test di Golang #
Unit testing adalah praktik pengujian komponen atau unit terkecil dari aplikasi untuk memastikan bahwa mereka berfungsi seperti yang diharapkan. Golang memiliki dukungan bawaan untuk unit testing melalui paket testing
.
Membuat Unit Test #
Berikut adalah langkah-langkah dasar untuk membuat unit test di Golang:
- Buat file test dengan nama berakhiran
_test.go
. - Import paket
testing
. - Buat fungsi test dengan nama yang diawali dengan
Test
dan menerima parameter*testing.T
.
Contoh Sederhana #
Berikut adalah contoh sederhana dari fungsi yang akan diuji dan unit testnya.
Fungsi yang Akan Diuji #
package main
// Add adalah fungsi yang menjumlahkan dua bilangan
func Add(a, b int) int {
return a + b
}
Unit Test untuk Fungsi Add
#
package main
import "testing"
// TestAdd menguji fungsi Add
func TestAdd(t *testing.T) {
result := Add(2, 3)
expected := 5
if result != expected {
t.Errorf("Add(2, 3) = %d; want %d", result, expected)
}
}
Menjalankan Unit Test #
Untuk menjalankan unit test, Anda bisa menggunakan perintah go test
di dalam direktori yang berisi file test. Contoh:
go test
Contoh Unit Test yang Lebih Kompleks #
Berikut adalah contoh fungsi yang lebih kompleks beserta unit testnya.
Fungsi yang Akan Diuji #
package main
import "errors"
// Divide adalah fungsi yang membagi dua bilangan dan mengembalikan error jika pembagi adalah nol
func Divide(a, b float64) (float64, error) {
if b == 0 {
return 0, errors.New("division by zero")
}
return a / b, nil
}
Unit Test untuk Fungsi Divide
#
package main
import (
"testing"
)
// TestDivide menguji fungsi Divide
func TestDivide(t *testing.T) {
type test struct {
a, b float64
expected float64
err error
}
tests := []test{
{a: 6, b: 3, expected: 2, err: nil},
{a: 6, b: 0, expected: 0, err: errors.New("division by zero")},
}
for _, tc := range tests {
result, err := Divide(tc.a, tc.b)
if result != tc.expected || (err != nil && err.Error() != tc.err.Error()) {
t.Errorf("Divide(%f, %f) = %f, %v; want %f, %v", tc.a, tc.b, result, err, tc.expected, tc.err)
}
}
}
Menggunakan t.Run
untuk Subtests
#
Subtests memungkinkan Anda untuk menjalankan beberapa test case dalam satu fungsi test.
package main
import (
"errors"
"testing"
)
// TestDivideWithSubtests menguji fungsi Divide menggunakan subtests
func TestDivideWithSubtests(t *testing.T) {
type test struct {
name string
a, b float64
expected float64
err error
}
tests := []test{
{name: "normal division", a: 6, b: 3, expected: 2, err: nil},
{name: "division by zero", a: 6, b: 0, expected: 0, err: errors.New("division by zero")},
}
for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) {
result, err := Divide(tc.a, tc.b)
if result != tc.expected || (err != nil && err.Error() != tc.err.Error()) {
t.Errorf("Divide(%f, %f) = %f, %v; want %f, %v", tc.a, tc.b, result, err, tc.expected, tc.err)
}
})
}
}
Benchmark Testing #
Golang juga mendukung benchmark testing untuk mengukur kinerja fungsi. Fungsi benchmark diawali dengan Benchmark
dan menerima parameter *testing.B
.
Contoh Benchmark #
package main
import "testing"
// BenchmarkAdd mengukur kinerja fungsi Add
func BenchmarkAdd(b *testing.B) {
for i := 0; i < b.N; i++ {
Add(2, 3)
}
}
Untuk menjalankan benchmark, gunakan perintah go test -bench .
.
Table-Driven Tests #
Table-driven tests adalah pola umum di Golang untuk menguji fungsi dengan berbagai test case yang ditentukan dalam tabel.
package main
import (
"errors"
"testing"
)
// TestDivideTableDriven menggunakan pendekatan table-driven
func TestDivideTableDriven(t *testing.T) {
var tests = []struct {
a, b float64
expected float64
err error
}{
{6, 3, 2, nil},
{6, 0, 0, errors.New("division by zero")},
}
for _, tt := range tests {
testname := fmt.Sprintf("%f,%f", tt.a, tt.b)
t.Run(testname, func(t *testing.T) {
result, err := Divide(tt.a, tt.b)
if result != tt.expected || (err != nil && err.Error() != tt.err.Error()) {
t.Errorf("Divide(%f, %f) = %f, %v; want %f, %v", tt.a, tt.b, result, err, tt.expected, tt.err)
}
})
}
}
Kesimpulan #
Unit testing di Golang sangat kuat dan fleksibel. Dengan menggunakan paket testing
, Anda dapat dengan mudah membuat dan menjalankan unit test. Praktik terbaik seperti menggunakan subtests, table-driven tests, dan benchmark testing dapat membantu Anda memastikan bahwa kode Anda berfungsi dengan benar dan efisien.