Part I — Why we need TestRule and how it works ?
Introduction
Dalam implementasi dari Test Driven Delevopment (TDD) maka kita diharuskan untuk membuat test terlebih dahulu sebelum menambahkan fungsionalitas baru di aplikasi. Jenis test yang seringkali dilakukan adalah Small Test, Medium Test dan Large Test. Ketiga jenis test tersebut adalah berdasarkan level of the testing pyramid.
Dalam penerapannya kita akan sering bertemu dengan TestRule dan sekarang kita akan membahas mengapa kita memerlukan TestRule dan bagaimana itu bekerja……
Dokumentasi JUnit.org mengatakan bahwa
TestRules can do everything that could be done previously with methods annotated with Before, After, BeforeClass, or AfterClass, but they are more powerful, and more easily shared between projects and classes.
Hah ?? Jadi maksudnya ada proses lain sebelum @Test dieksekusi ? Jawabannya adalah YA !!
Flow Test
Pada gambar dibawah ini akan menjelaskan flow dari sebuah @Test yang akan dieksekusi.
Sebagai tambahan informasi, @get:Rule hanya dapat digunakan di bahasa pemograman kotlin. Jika kamu lebih menyukai java maka kamu bisa menggunakan @Rule. Perbedaanya dimana ?? bisa dilihat disini.
Jika @get:Rule kurang lebih mirip dengan @Before dan @After … lalu mengapa kita memerlukannya ?
Mudah untuk digunakan pada beberapa test
Pada umumnya, sebelum test dijalankan maka memerlukan beberapa tahapan terlebih dahulu seperti launch activity, Intent.init(), menyiapkan data dan lain-lain. Maka akan lebih baik jika membungkus tahapan-tahapan tersebut dalam sebuah TestRule daripada kita harus mengulang tahapan tersebut disetiap file test. Jadi, ketika kita diharuskan untuk membuat sebuah test baru yang memerlukan tahapan yang sama maka kita cukup menggunakan TestRule pada test tersebut.
Bisa menggunakan lebih dari satu TestRule dalam satu test
Jika anda melihat poin nomor 1 dan terfikir seperti bentuk abstraksi maka jawabannya adalah YA BETUL !! tetapi ini lebih hebat. Pada bentuk abstraksi biasa, kita hanya diperbolehkan untuk mempunyai 1 parent saja, tetapi bagaimana jika kita butuh lebih dari 1 ??? Tentu saja jawabannya menggunakan TestRule. Karena kita dapat menggabungkan 2 TestRule atau lebih dalam 1 test dengan menggunakan RuleChain. Pada part II dari artikel ini, saya akan menjelaskan bagaimana cara memakai RuleChain dan cara dia bekerja.
Dapat dilihat bahwa Test Class 2 bisa menggunakan Test Rule 1 dan Test Rule 2 secara bersamaan. Tetapi, jika kita menggunakan lebih dari 1 TestRule maka TestRule yang akan dieksekusi terlebih dahulu ?? Pada part II semua akan dijelaskan =D
So, how it works dude ??!!
Kurang lebih cara kerjanya adalah seperti berikut :
- JUnit membaca test class kita dan akan mencari field dengan anotasi @get:Rule
- JUnit akan memanggil apply method yang ada didalam TestRule dan melamparkan informasi mengenai test yang sedang dijalankan. Informasi tersebut dilemparkan melalui Statement
- TestRule tersebut akan membuat sebuah instance baru dari Statement dan di return pada apply method
- Didalam apply method, harus menjalankan evaluate method yang dimiliki oleh Statement untuk menjalankan test tersebut
Bonus nihh buat kalian yang mau coba untuk membuat TestRulenya sendiri … =D
- Buat class baru dengan nama PrintTestRule dan extend TestRule serta override apply method
2. Kita harus menjalankan fungsi evaluate yang dimiliki oleh base untuk dapat mengeksekusi test
3. SELAMAT !!!! Kamu udah berhasil membuat TestRule sendiri… mudah bukann ? Buat kamu yang lagi semangat, ada bonus tambahan lagi nihh, untuk penggunaan description yang ada di apply method.
Buat annotation class baru dan modify PrintRule menjadi seperti dibawah ini
Jadi, saat membuat test baru kamu bisa menambahkan @PrintAfterTest. Jika kamu menambahkan anotasi tersebut maka after statement executed akan di print. Description berisi deksripsi dari test yang sedang dijalankan seperti anotasinya, nama test dan lain sebagainya.
Gimana nihhh artikelnya ?? Cukup membantu untuk memahami TestRule kannn … ayo berikan claps untuk support dan tinggalkan komentar untuk berdiskusi. =D