Unit Test yang melibatkan Third Party Library dalam Go
Dalam pengembangan sebuah software, sering kita menggunakan Third Party Library yang telah dibuat sebelumnya demi mempersingkat waktu yang diperlukan. Sebagai seorang developer yang baik, kita juga diharuskan untuk membuat unit test, seperti yang saya jelaskan di sini Test dalam Software Development. Tetapi, bagaimana cara membuat test bagian code yang menggunakannya?
Sesuai dengan prinsip Isolated dari kaidah F. I. R. S. T dalam pembuatan unit test, tidak boleh terjadi pemanggilan code yang bukan merupakan bagian dari System Under Test (SUT). Untuk mengatasinya dapat membuat mock, seperti yang dijelaskan oleh teman saya pada Test-Driven Development in Go. Tetapi masalahnya, dalam Go tidak mudah untuk membuat mock dari struct yang berasal dari Third Party Library. Maka dari itu, saya akan menjelaskan dua buah trik agar code yang dibuat bisa ditest dengan memenuhi prinsip Isolated.
Misalkan kita membuat fungsi yang bernama Save, yang di dalamnya memanggil sebuah Library ditunjukkan dengan client.Upload.
func Save(f File) error {
...
client := service.NewClient()
err := client.Upload("https://server.up/file", f)
...
return err
}
Salah satu cara untuk mengisolasinya adalah membuat struct yang memiliki komposisi client seperti berikut.
type Storage struct {
client Client
}func (s Storage) Upload(url string, f File) error {
return s.client.Upload(url, f)
}
Setelah strukturnya berubah seperti contoh di atas, pembuatan mock dapat dilakukan seperti apa yang dijelaskan teman saya pada tautan sebelumnya.
Setelah itu, fungsi save yang telah dibuat sebelumnya berubah menjadi seperti berikut.
func Save(f File) error {
...
s := Storage{client: service.NewClient()}
err := s.Upload("https://server.up/file", f)
...
return err
}
Selain dengan membuat struct seperti contoh di atas, salah satu caranya adalah dengan membuat fungsi baru yang parameternya menerima fungsi yang berasal dari Third Party Library.
func Upload(uploader func(string, File)(error), url string, f File) error {
return uploader(url, f)
}
Setelah diubah seperti di atas, fungsi Save berubah menjadi seperti berikut.
func Save(f File) error {
...
err := Upload(client.Upload, "http://server.up", f)
...
return err
}
Begitulah trik agar code yang dibuat dapat ditest dengan memenuhi kaidah Isolated. Semoga penjelasan yang saya berikan dapat Anda pahami.
Terima kasih.