Test Doubles, agar testing menjadi ringan!

Muhammad Raihan
5 min readJun 6, 2021

--

Dalam proses pengembangan software, sebelum dapat digunakan oleh end-user, biasanya software harus melewati tahap testing. Salah satu jenis testing yang biasa dijalankan pada software adalah unittesting. Dengan adanya unittesting, maka perubahan yang dilakukan developer tidak akan merusak/merubah flow program yang sudah sesuai sebelum dilakukan perubahan.

Salah satu masalah yang dirasakan para software developer adalah untuk memastikan keseluruhan software berjalan sebagaimana mestinya, seringkali dibutuhkan hingga ratusan unittest yang harus dijalankan. Jika unittest dijalankan dengan menjalani seluruh flow bisnis yang dirancang seperti pada environment production, akan memakan banyak resource dan lebih banyak waktu. Disinilah peran Test Doubles, untuk meringankan proses unittesting agar membutuhkan waktu dan resource lebih sedikit.

What is Test Doubles?

Dalam dunia automated testing, seringkali digunakan objek yang “terlihat” dan memiliki sifat serta prosedur seperti objek asli yang ada pada environment production, namun lebih “simple”. Dengan menggunakan objek seperti ini, akan mengurangi resource yang dibutuhkan untuk menjalankan 1 unittest. Selain itu, dengan penggunaan objek seperti ini tetap dapat menguji blok kode dengan pengujian terpisah terhadap seluruh software. Objek yang sering digunakan dalam dunia automated testing ini disebut Test Doubles.

Menurut Gerard Meszaros, Test Doubles dibedakan menjadi 5 jenis, diantaranya :

  • Fake Object
  • Mock Object
  • Test Stub
  • Test Spy — Mirip seperti Test Stub namun dengan fitur recording
  • Dummy Object — Null Object Reference, biasa digunakan untuk parameter

Selanjutnya, kita akan membahas lebih lanjut mengenai Fake Object, Mock Object, dan Test Stub.

Fake Object

Fake Object adalah objek yang memiliki implementasi fungsi sama persis seperti pada environment production, namun bukan objek yang sama. Biasanya, Fake Object berupa implementasi dari sebuah model atau database yang hanya ada di memory. Ini berarti, objek model yang dibuat sebagai Fake Object untuk testing tidak dimasukkan ke dalam database yang digunakan pada flow asli dari software. Hal ini mengurangi resource dan waktu karena tidak perlu melakukan penyimpanan dan pemanggilan ke database secara terus-menerus.

Mock Object

Mock Object adalah objek yang dapat ‘mengingat’ method apa saja yang dipanggil dari objek tersebut saat melakukan suatu skenario test. Dengan menggunakan Mocking, kita dapat mengetahui apakah jika kita melakukan sebuah skenario testing, seluruh prosedur serta method yang dipanggil sudah sesuai. Contohnya, pada saat melakukan skenario untuk menghapus data dalam database, kita dapat memeriksa apakah method remove_row(id) dari sebuah model dipanggil pada pelaksanaan skenario tersebut.

Test Stub

Test Stub adalah objek yang dapat menerima data sebagai parameter dan dapat mengembalikan data atau jawaban yang dikehendaki dalam proses testing. Test Stub biasanya digunakan saat pengujian method yang dapat menghasilkan efek samping pada data asli, contohnya pada saat menghapus sebuah file atau menghapus sebuah row dalam database. Daripada kita memanggil method tersebut dan menghapus data asli, kita dapat melakukan stub dan mendapat respon dari method tersebut tanpa mengubah data yang asli.

Dalam implementasinya, jenis-jenis Test Doubles dapat digunakan bersamaan antara satu dan yang lain. Tidak harus penggunaan 1 jenis dalam 1 unit test saja.

Contoh Implementasi Test Doubles

Dalam pengerjaan proyek pengembangan aplikasi IGRI, saya bersama tim developer menimplementasi Fake Object dalam melakukan automated unittesting demi menjaga perubahan agar tidak merusak aplikasi yang sudah sesuai sebelumnya. Contoh Fake Object yang kami gunakan adalah :

Setup Fake Object untuk unittest

Pada snippet diatas, kami membuat fake object dari User, Pembeli, serta AlamatPengiriman agar selanjutnya bisa kami gunakan dalam melakukan skenario testing. Contoh pemanggilan dari fake object yang kami gunakan adalah :

Contoh unittest menggunakan Fake Object

Dalam contoh pemanggilan diatas, kami melakukan login dengan username dan password dari Fake Object user yang kami buat sebelumnya, namun tidak terdaftar pada database yang digunakan pada environment asli dimana program berjalan. Hal ini dibantu juga oleh prosedur testing django yang secara otomatis menggunakan database yang terisolasi dari database asli.

Untuk melakukan unittesting pada aplikasi IGRI, kami tidak menggunakan Test Stub dan Mock Object, karena kami tidak menggunakan service yang berasal dari luar. Namun, kedua jenis test doubles diatas dapat digunakan secara bersamaan. Sebagai contoh, kita memiliki file contoh.py dengan 1 method sebagai berikut :

contoh.py

Untuk melakukan unittesting terhadap fitur remove_file diatas, kita harus membuat satu file kemudian memeriksa apakah file tersebut terhapus setelah menjalankan method tersebut. Namun, dengan bantuan Test Stub dan Mock Object, kita tidak perlu membuat file setiap kali kita menjalankan unittesting. Berikut adalah contoh unittesting untuk method diatas :

Unittests contoh.py

Pada bahasa pemrograman pyhton, terdapat library unittest.Mock untuk mempermudah para developer melakukan Mocking sekaligus Test Stub. Dapat dilihat diatas melakukan 2 Test Stub pada method isFile() dan melakukan Mocking pada objek untuk mengetahui apakah method remove() terpanggil atau tidak.

Sekian mengenai Test Doubles agar automated testing yang dilakukan untuk aplikasi anda semakin ringan dan cepat. Semoga artikel ini membantu ^_^.

Referensi :

Python Mocking: A Guide to Better Unit Tests | Toptal

Test Doubles — Fakes, Mocks and Stubs. | by Michal Lipski | Pragmatists

TestDouble (martinfowler.com)

Test Double at XUnitPatterns.com

--

--