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