Belajar Golang Unit Testing

Golang Unit Test

Unit testing adalah suatu aktivitas untuk memastikan bahwasannya kode yang sudah dibuat berisi logika yang sudah benar. Selain itu dengan adanya unit testing, kita akan merasa tenang ketika merubah/merefactor kode yg sudah eksis karena kebenaran logika seluruh kode akan di "jaga" oleh unit testing ini. Tentu karena adanya unit testing ini kualitas kode kita akan menjadi berkualitas, robust, dan bugs free (at least meminimalisir).

Biasanya unit testing ini dijalankan otomatis ketika commit atau push ke git (git hook) dengan bantuan package husky, serta pada saat deployment CI/CD biasanya akan di test kembali pada saat CI (Continous Integration) sebelum/setelah proses building dilakukan. Untuk mengetahui CI/CD lebih lanjut bisa dilihat di sini.

Index Content of Golang Unit Test 🔖

Metode-metode dalam unit test ⛷️

Metode yang pernah saya baca di websitenya Bang Martin dalam unit test ada 5 metode yaitu:

  • mock
  • stub
  • spy
  • fake
  • dummy

Unit Test Golang by Testify 📦

  • Sebenarnya ada beberapa third party library yang digunakan sebagai tools
  • Pada tutorial kali ini saya menggunakan Testify
  • Kita akan menggunakan metode mocking/mock
  • Untuk repository nya bisa kalian lihat Disini

Unit Test Menggunakan Mock 🤡

Metode Mock merupakan suatu mekanisme untuk membuat objek tiruan dari objek asli depedency sehingga bisa mengatur test case sesuai dengan ekspektasi kondisi-kondisi yang akan di test.

package something

// testing: golang library/bawaan golang
// github.com/stretchr/testify/mock: library pihak 3 (Testify)
import (
  "testing"
  "github.com/stretchr/testify/mock"
)

type MyMockedObject struct{
  mock.Mock
}

// Fungsi pengontrol balikan kondisi yg diinginkan
func (m *MyMockedObject) DoSomething(number int) (bool, error) {
  args := m.Called(number)
  return args.Bool(0), args.Error(1)
}

// Contoh Fungsi TestCase
func TestSomething(t *testing.T) {
  // buat instansiasi dr test object
  testObj := new(MyMockedObject)

  // setup kondisi balikan yg diinginkan
  testObj.On("DoSomething", 123).Return(true, nil)

  // panggil fungsi yg akan di test
  targetFuncThatDoesSomethingWithObj(testObj)

  // ekspektasi hasil apakah sesuai logika apa tidak
  testObj.AssertExpectations(t)
}

/** TestSomethingWithPlaceholder is a second example of how to use our test object to
* make assertions about some target code we are testing.
* This time using a placeholder. Placeholders might be used when the
* data being passed in is normally dynamically generated and cannot be
* predicted beforehand (eg. containing hashes that are time sensitive)
**/
// Contoh Fungsi TestCase dengan placeholder/parameter dinamis
func TestSomethingWithPlaceholder(t *testing.T) {

  // buat instansiasi dr test object
  testObj := new(MyMockedObject)

  // setup kondisi balikan yg diinginkan dengan parameter dinamis
  testObj.On("DoSomething", mock.Anything).Return(true, nil)

  // panggil fungsi yg akan di test
  targetFuncThatDoesSomethingWithObj(testObj)

  // ekspektasi hasil apakah sesuai logika apa tidak
  testObj.AssertExpectations(t)
}

About the author

Hey, I'm Ubaidillah Hakim Fadly, a software engineer, stock investor, and entrepreneur. I publish articles and tutorials about programming and devOps from my own research.

Get the newsletterBuy me a coffee

Ubaidillah