Kelas utilitas pengujian unit

10

Kita semua memiliki beberapa kelas utilitas, yang hanya berisi metode statis, untuk penggunaan dari berbagai sumber. Sekarang, bisa ada dua pendekatan yang dapat diambil untuk menguji bagian kode ini.

Pendekatan 1:

Memiliki tes unit terpisah untuk kelas utilitas. Di mana pun mereka dipanggil, tiru interaksi mereka menggunakan beberapa kerangka uji yang memiliki ketentuan untuk itu, seperti PowerMock. Ini pada dasarnya memperlakukan kelas utilitas sebagai komponen terpisah dari sistem, yang perlu diuji dan dipelihara secara individual.

Pendekatan 2:

Jangan menulis tes unit untuk kelas utilitas. Namun, tes yang ditulis untuk kelas inti Anda yang berinteraksi dengan kelas utilitas ini, biarkan interaksi itu terjadi, yang secara intrinsik akan memastikan bahwa kode yang ditulis dalam kelas utilitas ini diuji dengan benar untuk berbagai usecases. Jika ada yang rusak, tes untuk komponen lain harus bisa menangkapnya.

Silakan bagikan pemikiran Anda tentang pendekatan mana yang lebih disukai, atau jika ada cara lain di mana orang melakukan hal ini.

Ulrich
sumber
1
Terkait: Layanan statis dan kemampuan uji : “Jika suatu fungsi murni, maka Anda bisa mengujinya langsung satu kali, dan kemudian menggunakannya dalam kode lain mengetahui bahwa itu akan berfungsi. Ini biasanya hanya berlaku untuk metode utilitas kecil, atau ketika Anda melakukan pemrograman fungsional yang ketat. Jika layanan yang disediakan oleh metode statis itu lebih kompleks, menggunakan teknik injeksi ketergantungan menjadi hal yang diinginkan. ” Dalam setiap kasus, pengujian langsung terhadap metode statis publik masuk akal.
amon

Jawaban:

7

Saya pikir ada kesalahpahaman besar tentang kelas 'utilitas' di luar sana. Hanya karena Anda membuat kelas 'statis', itu tidak menjadikannya kelas utilitas. Jika kelas utilitas statis Anda memiliki dependensi (yang dapat memanifestasikan dirinya dalam kelas 'utilitas' statis lainnya), ia menimbulkan efek samping atau perilakunya tidak dapat sepenuhnya dikontrol oleh inputnya bukan kelas utilitas.

Kelas utilitas yang sebenarnya tidak perlu diejek karena outputnya selalu deterministik tergantung pada inputnya.

Pengujian unit adalah tentang instantiasi sebagian kecil aplikasi Anda (sebuah unit) secara terpisah sehingga Anda dapat (berpotensi) menguji semua jalur kode di dalam unit itu. Mengejek dependensi mencapai isolasi ini. Jika kelas utilitas istirahat isolasi, sekali lagi itu bukan kelas utilitas karena kelas utilitas seharusnya diisolasi oleh definisi.

Jadi, dalam suatu aplikasi seseorang seharusnya tidak ingin atau harus mengejek kelas utilitas. Kelas yang Anda rasa perlu diejek perlu diubah menjadi kelas instantiable kelas satu dan perlu diteruskan ke unit sebagai ketergantungan (Lihat Injeksi Ketergantungan ). Ketergantungan ini kemudian dapat diejek dengan mudah sehingga unit dapat diuji secara terpisah.

c_maker
sumber
19

Dalam pilihan saya itu konyol untuk mengejek ketergantungan pada metode utilitas statis untuk hal-hal seperti pemisahan string.

Ya, jika metode splitter salah, ini dapat menyebabkan kegagalan palsu dalam pengujian untuk metode yang bukan tentang pemisahan tali. Tapi itu bukan inti dari test suite. Test suite harus berhasil 100%, titik. Jika tidak, Anda memperbaiki apa yang rusak dan ulangi sampai berhasil 100%. Jika kelas string utilitas akan rusak, harus segera menyebabkan kegagalan dalam tes yang adalah tentang fungsi tali. Anda memperbaiki fungsi itu dan kemudian semua kegagalan hilang, sehingga Anda bahkan tidak perlu melihat kasus pengujian yang gagal palsu.

Dengan kata lain, YA, tulis tes untuk metode utilitas. TIDAK, jangan mencoba memisahkan mereka dari tes lain. Cukup berasumsi bahwa fungsi utilitas sepele bekerja dengan benar, sebagaimana diverifikasi oleh tes mereka sendiri. Melakukan sesuatu yang lebih adalah lebih banyak usaha tanpa hasil apa pun.

Kilian Foth
sumber
Hanya untuk memastikan, Anda lebih suka pendekatan 2 daripada 1, kan?
Ahmad Fadli
1
@AhmadFadli Tidak, dia mengatakan bahwa pendekatan 3 adalah yang terbaik: Tulis tes untuk fungsi utilitas dan jangan mengejeknya dalam tes lain.
FINDarkside
@AhmadFadli, "Dengan kata lain, YA, tulis tes untuk metode utilitas. TIDAK, jangan coba memisahkan mereka dari tes lain" itu berarti pilihan kedua 2, saya kira. Yaitu, menulis tes yang menggunakan metode kelas Utility tetapi tidak menulis tes insolasi khusus untuk metode Utility
Farid