Jadikan pengujian lebih mudah dibaca, dipelihara, dan disusun dengan pengaturan pengujian deklaratif

Salah satu cara yang saya temukan untuk menulis pengujian yang tangguh adalah dengan fokus pada pembuatan penyiapan data yang bersifat deklaratif.

Ada banyak manfaat dari kode penyiapan deklaratif, termasuk mengurangi duplikasi kode.

Namun bagi saya, peningkatan terbesar adalah membuat penyiapan (dan pengujian) kami lebih mudah dibaca, lebih mudah dipelihara, dan lebih mudah dibuat.

Apa itu Pengaturan Deklaratif?

Jadi apa yang dimaksud dengan “deklaratif” dalam pengaturan pengujian Anda? Tujuan kami adalah membuat kode penyiapan kami fokus pada "keadaan akhir" sistem, bukan pada serangkaian langkah untuk mencapainya.

Untuk membantu memperjelas, pertama-tama mari kita lihat contoh yang TIDAK bersifat deklaratif.

Bayangkan sebuah pengujian di mana kita perlu “memasukkan” data domain dasar ke dalam DB.

Ini membuat postingan dan kemudian menggunakan ID postingan untuk menambahkan beberapa tag dan komentar terkait. Kode adalah proses langkah demi langkah untuk mencapai hasil akhir.

Kita perlu membaca baris demi baris untuk sepenuhnya memahami/menginternalisasikan tujuan kode tersebut. Idealnya, kita akan mendeskripsikan data apa yang diperlukan dan mengizinkan potongan kode lain untuk menangani detailnya.

Jadi bagaimana kita mengubah kode ini menjadi deklaratif? Kita memisahkan bagaimana dari apa dengan membuat fungsi pembantu baru.

Fungsi ini akan menerima objek yang mendeskripsikandata yang diinginkan.

Fungsi setupPost masih dapat memiliki kode yang sama (atau serupa) seperti contoh pertama, namun detailnya sekarang disembunyikan dari pengujian itu sendiri.

Perhatikan bagaimana versi ini masih menyertakan data yang sama seperti contoh prosedural pertama namun mengaturnya menjadi satu objek deskriptif. Luangkan waktu sejenak untuk membandingkan kedua contoh dan hargai perbedaannya — perbedaannya tidak kentara!

Ini mungkin membantu untuk " MENGERINGKAN " kodenya, tapi menurut saya ada manfaat yang lebih penting yang tidak begitu jelas pada pandangan pertama.

Lebih Mudah Dibaca

Penyiapan deklaratif umumnya lebih mudah dipindai oleh mata Anda karena Anda tidak membaca proses langkah demi langkah, melainkan deskripsi hasil akhirnya.

Dalam contoh kita di atas, versi deklaratif membuatnya sangat jelas bahwa kita membuat postingan dengan tag dan komentar terkait.

Bandingkan dengan versi prosedural di mana kita perlu membaca setiap baris dan memutuskan bagaimana kaitannya satu sama lain.

Lebih Mudah untuk Dipelihara

Jika “postingan” adalah bagian utama dari data di domain Anda, maka Anda mungkin akan membuat postingan di banyak pengujian. Versi deklaratif kami merangkum implementasi sebenarnya di satu tempat.

Jika ada perubahan (meskipun kecil) pada pembuatan postingan, detail tersebut kini disembunyikan dari pengujian kami. Dalam versi prosedural, hal ini akan “bocor” ke banyak pengujian dan menyebabkan perubahan kecil menjadi bola salju.

Lebih mudah untuk dibuat

Manfaat tersembunyi lainnya adalah deskripsi postingan kami sangat mudah dibuat karena hanya berupa data.

Misalnya, jika kita ingin memasukkan postingan ke dalam fungsi pengaturan yang lebih besar, hal ini menjadi lebih jelas sekarang. Berikut ini contoh menyematkan postingan di dalam fungsi setupUser.

Fungsi setupUser ini mampu membuat lebih banyak data dibandingkan fungsi tunggal setupPost, namun sebagian besar fungsi tersebut sudah diimplementasikan!

Itu karena kita dapat menggunakan kembali fungsi setupPost. Itu sudah menangani bentuk yang tepat sehingga harus sesederhana seperti posts.map(setupPost); untuk membuat seluruh array posting!

Bagian terbaiknya adalah Anda dapat terus menyusun data ini. Bentuk user baru kita dapat digunakan sendiri namun juga dapat dimasukkan dalam bentuk lain, seperti organisasi misalnya.

Saat Anda menulis lebih banyak tes, Anda akan mulai membangun perpustakaan tipe dan pembantu terkait yang bagus. Dengan memisahkan apa dan bagaimana Anda akan membantu memastikan Anda dapat terus menyusun pembantu Anda dengan mudah.

Cobalah!

Saya pikir praktik ini adalah sesuatu yang banyak dari kita lakukan dalam kode "normal", tetapi sering kali hilang dalam pengujian acak.

Lain kali Anda perlu melakukan bootstrap pada beberapa data — mungkin untuk database, state manager, mock backend, dll. — coba fokus pada fungsi deklaratif.

Saya rasa ini akan membantu membuat pengujian Anda lebih mudah dibaca, dipelihara, dan disusun!