- Published on
Golang Unit Test
- Authors
- Name
- Moch Lutfi
- @kaptenupi
Unit test merupakan salah satu cara untuk validasi sebuah unit terkecil dalam suatu aplikasi, misalnya global variable, fungsi, fungsi dalam suatu class (dalam context golang fungsi dalam struct
). Adanya unit test ini juga mempermudah pengujian suatu aplikasi/library yang secara terus menerus/diperlukan repetisi pengujian sehingga tidak perlu membuat aplikasi yang lain untuk menggunakan library kemudian dicek satu-persatu secara manual output program sudah sesuai atau belum.
Golang Unit Test
GOLANG
sudah mempunyai standard library untuk unit testing, jadi tidak perlu menggunakan third-party untuk unit test. Meskipun demikian untuk kenyamanan bisa menggunakan third-party tools misalkan untuk penyederhanaan unit test menggunakan assert bisa menggunakan github.com/stretchhr/testify/assert
.
Untuk demonstrasi penggunaan unit test dan cara penggunaannya, disini menggunakan 2 berkas yaitu SimpleMath.go
dan untuk unit test menggunakan SimpleMath_test.go
. Unit test dalam golang diletakkan dalam package yang sama dan nama yg sama dengan nama berkas yang akan ditest dengan menambahkan _test
pada nama berkas. Berikut adalah contoh sederhana penggunaan unit test.
_15// math_test.go_15package main_15_15import(_15 "testing"_15)_15_15func TestKotak(t *testing.T){_15 // init kotak_15 kotak := NewKotak(4, 8)_15_15 if p.Luas() != 32{_15 t.Error("Seharusnya 32")_15 }_15}
Untuk memastikan apakah unit test berjalan lancar bisa digunakan go test
di console
. Misalkan letak berkas di $GOPATH/src/math
. Maka ~cd $GOPATH/src/math && go test
.
Contoh yang lebih realistis yaitu dengan membuat aplikasi untuk menghitung kotak dengan spesifikasi seperti berikut:
Input merupakan variabel
panjang
danlebar
Menghitung luas dengan mengalikan
panjang
denganlebar
Menghitung keliling kotak dengan
2 * (panjang + lebar)
Mengecek apakah kotak merupakan persegi atau bukan dengan membandingkan panjang dengan lebar, jika sama merupakan persegi.
Spesifikasi sudah ditentukan sekarang saatnya mengubahnya menjadi code seperti dibawah ini.
_26// SimpleMath.go_26package main_26_26type Kotak struct {_26 Panjang int_26 Lebar int_26}_26_26func (p *Kotak) Luas() int {_26 return p.Panjang * p.Lebar_26}_26_26func (p *Kotak) Keliling() int {_26 return 2 * (p.Panjang + p.Lebar)_26}_26_26func (p *Kotak) IsPersegi() bool {_26 if p.Panjang == p.Lebar {_26 return true_26 }_26 return false_26}_26_26func NewKotak(p, l int) *Kotak {_26 return &Kotak{p, l}_26}
Sedangkan untuk unit test lengkapnya seperti dibawah ini. Untuk penamaan fungsi menggunakan prefix Test dan parameter argumen t *testing.T
. Contoh di bawah ini menggunakan standard library dan third-party.
_44// SimpleMath_test.go_44package main_44_44import (_44 "testing"_44_44 "github.com/stretchr/testify/assert"_44)_44_44func TestKotak(t *testing.T) {_44 p := NewKotak(4, 8)_44_44 if p.IsPersegi() == true {_44 t.Error("Seharusnya false")_44 }_44_44 if p.Luas() != 32 {_44 t.Error("Seharusnya 32")_44 }_44_44 if p.Keliling() != 24 {_44 t.Error("seharusnya 24")_44 }_44_44 persegi := NewKotak(4, 4)_44_44 if persegi.IsPersegi() == false {_44 t.Error("seharusnya true")_44 }_44}_44_44func TestKotakPakeAssert(t *testing.T) {_44 assert := assert.New(t)_44 p := NewKotak(4, 8)_44_44 assert.Equal(p.IsPersegi(), false, "seharusnya false")_44 assert.Equal(p.Luas(), 32, "seharusnya 32")_44 assert.Equal(p.Keliling(), 24, "seharusnya 24")_44_44 persegi := NewKotak(4, 4)_44 assert.Equal(persegi.Luas(), 16, "seharusnya 16")_44 assert.Equal(persegi.Keliling(), 16, "seharusnya 16")_44 assert.Equal(persegi.IsPersegi(), true, "seharusnya true")_44}
Untuk menjalankan unit test bisa menggunakan perintah go test
di command line, kalau misalkan perlu verbose bisa ditambahkan flag -v
seperti ini $ go test -v
.
Cukup mudah bukan penggunaan unit test di Golang? Selanjutnya mungkin akan membahas test coverage dan benchmark menggunakan golang. Sampai jumpa lagi di tulisan selanjutnya.