Untuk Menguji Sistem, Mengisolasi Efek Samping

Menghilangkan efek samping adalah salah satu cara terbaik untuk membangun kode yang dapat diuji

Gambar pertandingan tinju antara dua pejuang pria. Wajah mereka berada di luar bingkai. Pejuang di sebelah kiri telah mengirim kait kiri ke pejuang di sebelah kanan. Pejuang di sebelah kanan mengenakan celana pendek merah dengan simbol kecil Uni Soviet.

Nock adalah perpustakaan terkenal yang ditulis dalam JavaScript yang berguna untuk mematikan permintaan jaringan. Ini mengembalikan respons statis untuk tes sehingga mereka dapat berjalan bahkan jika server HTTP tidak tersedia.

Namun, ini juga bau.

Kopling yang dihasilkan antara Sumber Data dan Sistem yang Diuji adalah biaya yang dapat mempengaruhi refactoring dan perawatan kode.

Inilah sebabnya.

Katakanlah ada server yang mengembalikan daftar posting dan fungsi yang menggunakan respons dari server itu untuk membuat daftar judul posting. Tes untuk fungsi ini menggunakan Nock untuk mematikan respon dari server:

Diagram yang menunjukkan blok di sebelah kiri dengan tulisan

Kode memiliki cakupan yang layak. Namun, ada beberapa masalah dengan itu.

Jika Anda membuat perubahan pada jenis konten dari respons, Anda harus mengubah tes, meskipun perilaku kode tetap sama:

Hal yang sama berlaku jika Anda membuat perubahan pada URL, tajuk atau parameter yang Nock hentikan. Anda harus mengubah tes bahkan jika perilaku sistem tetap sama:

Fungsi "buat daftar posting" adalah System Under Test (SUT). Data dari panggilan HTTP adalah Sumber Data.

Anda dapat mendesain kode sehingga Sumber Data memiliki antarmuka umum yang dapat dihubungkan ke SUT. Dalam hal ini, Anda dapat menggunakan logika tanpa perlu terlalu banyak pengaturan.

Diagram yang menunjukkan blok di sebelah kiri dengan caption

Untuk lingkungan pengujian, Anda dapat menyuntikkan "Sumber Data Dalam Memori." Untuk produksi, Anda dapat menggunakan "Sumber Data Server HTTP."

"Antarmuka umum" di JSFiddle sebelumnya adalah metode "temukan judul tulisan". Terlepas dari cara Anda membangun antarmuka, Anda memiliki kendali atas semua penelepon. Oleh karena itu, perubahannya mudah. Martin Fowler menyebut itu "antarmuka yang tidak dipublikasikan."

Di sisi lain, jika server melanggar kontrak dari Antarmuka yang Diterbitkan, katakanlah atribut kelas berubah dari judul-judul menjadi judul-artikel, Anda hanya perlu mengubah implementasi Sumber Data. Anda tidak perlu melakukan perubahan di mana-mana.

Hal yang penting untuk diuji dan mendapat umpan balik awal adalah tes terhadap perilaku, bukan data. Oleh karena itu, sangat penting untuk merancang kode untuk mengurangi jumlah upaya yang diperlukan untuk perubahan logika. Dalam hal ini, logikanya adalah transformasi input dari Sumber Data ke daftar tanpa daftar HTML.

Dengan desain baru, Anda telah memisahkan Sumber Data dari Sistem yang Diuji. Karena itu, Anda dapat menghapus Nock.

Desain baru juga mengurangi pekerjaan yang diperlukan untuk menambahkan aturan baru ke sistem tanpa menyalin / menempel:

Namun, "Sumber Data Server HTTP" memiliki beberapa logika yang belum teruji di dalam fungsi pribadi "judul posting kueri dari html."

Untuk mengujinya, Anda dapat mengulangi pola yang sama. Dorong efek samping dan buat mekanisme "dapatkan permintaan" dicolokkan ke "Sumber Data Server HTTP." Dengan cara ini Anda masih dapat menguji kode tanpa perlu Nock:

Karena Anda sudah memiliki tes untuk mengonfirmasi "daftar judul posting" berfungsi dengan "Sumber Data Dalam Memori," Anda dapat memutuskan untuk menguji Sumber Data secara terpisah untuk memastikannya mengembalikan hasil yang benar:

Anda telah mendorong efek samping dari logika sepenuhnya. Dalam hal ini, fungsi "dapatkan permintaan" yang sebenarnya adalah efek sampingnya. Sekarang Anda dapat menggunakan Nock untuk membahasnya.

Namun, mengingat logika di dalam "dapatkan permintaan" adalah sepele dan Nock memiliki biaya yang signifikan, masuk akal untuk memiliki sejumlah kecil Tes Integrasi yang dapat menjalankan seluruh aplikasi, termasuk efek samping. Anda dapat menggunakan Nock untuk menghindari koneksi ke server langsung, dan tetap, gunakan permintaan HTTP untuk memverifikasi apakah aplikasi mengembalikan respons yang masuk akal ketika semua bagian cocok.

Nock berguna untuk mematikan koneksi di lapisan HTTP dan untuk memberikan respons statis. Namun, gunakan hemat. Untuk setiap pengujian yang Anda rintisan, Anda meningkatkan kopling dan biaya perubahan yang signifikan.

Jika tidak digunakan dengan hemat, Nock dapat membuat Nock Hell.

Masalah yang ingin Anda pecahkan adalah mengurangi jumlah bug dan biaya perubahan. Jika Anda mengubah struktur kode tanpa perubahan perilaku, tes tidak boleh pecah. Jika ya, berarti Anda gagal menulis tes yang bermanfaat.

Sasaran Anda adalah untuk meningkatkan kualitas cakupan tes ke logika yang Anda pedulikan dan mencapai umpan balik awal. Semua itu tanpa memengaruhi kemampuan Anda untuk memperbaiki kode.

Isolasi efek samping dan batasi penggunaan alat seperti Nock hingga batas aplikasi.

Itu seharusnya memberi Anda kepercayaan diri yang cukup untuk melakukan perubahan dan tidak merusak barang.

Bergabunglah dengan pertarungan, dorong efek samping, dan kemudian ... Nock it out.

Terima kasih sudah membaca. Jika Anda memiliki umpan balik, hubungi saya di Twitter, Facebook, atau Github.

Terima kasih kepada Eduardo Slompo dan Guilherme J. Tramontina untuk umpan baliknya yang mendalam kepada pos ini.