Python — Mock Patch

Di dalam software programming, kita (seharusnya) mengenal atau minimal pernah mendengar tentang unit test, dan kalaupun masih ada yang tidak tahu tentang apa itu unit test, silahkan googling sendiri.

Sebelumnya saya coba kutip tentang apa itu unit test dari Wikipedia :

Unit testing is a software development process in which the smallest testable parts of an application, called units, are individually and independently scrutinized for proper operation.

Proses untuk melakukan test terhadap bagian terkecil (dan berdiri sendiri) dari sistem aplikasi kita. Contoh, kita memiliki sebuah library yaitu MyClassA, yang perlu kita lakukan adalah membuat automate test terhadap class tersebut.

Dan unit test yang ideal adalah walaupun class yang ingin kita test tersebut memiliki dependensi dengan bagian lain misal class lain atau mungkin dengan internal standard library dari sebuah bahasa, apa yang harus kita lakukan ?


Kalau dependensi dengan class lain atau mungkin interface lain, mungkin kita bisa melakukan test dengan menerapkan dependency injection pattern, tapi fokus tulisan ini bukan tentang DI, melainkan alternatif kedua yaitu mocking dan khususnya menggunakan bahasa pemrograman python.

Contoh kasus menggunakan class contoh di atas yaitu MyClassA. Class ini memiliki dependensi dengan module yaml, yang artinya di salah satu proses internal class ini memiliki proses untuk melakukan loading data yang berupa objek yaml. Contoh source codenya mungkin seperti ini :

Kondisi source code di atas, module yaml tidak diinject tapi langsung dikonsumsi di dalam internal class, yang artinya tidak ada dependency injection di sini, lalu bagaimana kita melakukan test ?

Ada dua cara, pertama kita tetap melakukan test seperti biasanya dan benar-benar membuat file yaml di dalam environment test, dan kemudian file yaml ini bisa diakses oleh script test untuk dibaca isinya. Kelemahan metode ini adalah ketika melakukan proses unit test, script test kita benar-benar melakukan proses IO karena benar-benar mengload file yaml dari hardisk.

Cara kedua adalah yang menjadi fokus tulisan ini, yaitu menggunakan fitur patch dari library mock nya python. Contoh kode testnya adalah :

Dengan menggunakan fitur patch, kita bisa otomatis meng-replace seluruh objek / fungsi yang ada di dalam sebuah module. Dengan cara ini, kita tidak perlu melakukan proses IO ketika automate test kita berjalan tapi tetap bisa memastikan bahwa behavior dari class / module kita tested.

Tapi proses test kita belum selesai, di contoh snippet code di atas, saya juga menggunakan fungsi internal python, yaitu open. Bagaimana caranya untuk membuat mock objek untuk fungsi internal seperti ini ?

Contoh final kode testnya akan seperti ini :

Dari library mock milik python, ada helper mock_open. Helper ini berfungsi khusus untuk membuat mock object untuk fungsi internal open dari python. Dengan cara ini kita bisa membuat automate test kita lebih mudah.

Happy mocking!