Published on

Golang Unit Test

Authors

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
_15
package main
_15
_15
import(
_15
"testing"
_15
)
_15
_15
func 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 dan lebar

  • Menghitung luas dengan mengalikan panjang dengan lebar

  • 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
_26
package main
_26
_26
type Kotak struct {
_26
Panjang int
_26
Lebar int
_26
}
_26
_26
func (p *Kotak) Luas() int {
_26
return p.Panjang * p.Lebar
_26
}
_26
_26
func (p *Kotak) Keliling() int {
_26
return 2 * (p.Panjang + p.Lebar)
_26
}
_26
_26
func (p *Kotak) IsPersegi() bool {
_26
if p.Panjang == p.Lebar {
_26
return true
_26
}
_26
return false
_26
}
_26
_26
func 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
_44
package main
_44
_44
import (
_44
"testing"
_44
_44
"github.com/stretchr/testify/assert"
_44
)
_44
_44
func 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
_44
func 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.