Belajar Golang Unit Testing
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
- Unit Test Golang by Testify
- Unit Test Menggunakan Mock
- Unit Test Menggunakan Suite ⏳
- Unit Test Coverage Result ⏳
- Tips: Menggunakan Monkey Patch ⏳
- Tips: Fast Implement w/ Interface ⏳
- Tips: Gunakan once jika memanggil fungsi 2x dengan expect yg berbeda ⏳
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)
}
Comments