Golang Unit Test
Tags: go, unittest
Published: 2020-02-17 07:05:10

---
title: Golang Unit Test
published: true
date: 2018-01-02 01:00:00 UTC
tags: go, unit-test
canonical_url: https://lumochift.org/posts/golang-unit-test/
---

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

```
// math_test.go
package main

import(
    "testing"
)

func TestKotak(t *testing.T){
    // init kotak
    kotak := NewKotak(4, 8)

    if p.Luas() != 32{
        t.Error("Seharusnya 32")
    }
}

```

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.

```
// SimpleMath.go
package main

type Kotak struct {
    Panjang int
    Lebar int
}

func (p *Kotak) Luas() int {
    return p.Panjang * p.Lebar
}

func (p *Kotak) Keliling() int {
    return 2 * (p.Panjang + p.Lebar)
}

func (p *Kotak) IsPersegi() bool {
    if p.Panjang == p.Lebar {
        return true
    }
    return false
}

func NewKotak(p, l int) *Kotak {
    return &Kotak{p, l}
}

```

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

```
// SimpleMath_test.go
package main

import (
    "testing"

    "github.com/stretchr/testify/assert"
)

func TestKotak(t *testing.T) {
    p := NewKotak(4, 8)

    if p.IsPersegi() == true {
        t.Error("Seharusnya false")
    }

    if p.Luas() != 32 {
        t.Error("Seharusnya 32")
    }

    if p.Keliling() != 24 {
        t.Error("seharusnya 24")
    }

    persegi := NewKotak(4, 4)

    if persegi.IsPersegi() == false {
        t.Error("seharusnya true")
    }
}

func TestKotakPakeAssert(t *testing.T) {
    assert := assert.New(t)
    p := NewKotak(4, 8)

    assert.Equal(p.IsPersegi(), false, "seharusnya false")
    assert.Equal(p.Luas(), 32, "seharusnya 32")
    assert.Equal(p.Keliling(), 24, "seharusnya 24")

    persegi := NewKotak(4, 4)
    assert.Equal(persegi.Luas(), 16, "seharusnya 16")
    assert.Equal(persegi.Keliling(), 16, "seharusnya 16")
    assert.Equal(persegi.IsPersegi(), true, "seharusnya true")
}

```

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.