Karena saya tidak benar-benar berpengalaman dalam pengujian unit, saya mencoba mengumpulkan beberapa aturan yang akan saya pelajari terlebih dahulu.
Hati-hati mempelajari "aturan" untuk masalah yang belum pernah Anda temui. Jika Anda menemukan beberapa "aturan" atau "praktik terbaik", saya sarankan mencari contoh mainan sederhana di mana aturan ini "seharusnya" digunakan, dan mencoba menyelesaikan masalah itu sendiri , mengabaikan apa yang dikatakan "aturan".
Dalam hal ini, Anda bisa mencoba membuat 2 atau 3 kelas sederhana dan beberapa perilaku yang harus mereka terapkan. Laksanakan kelas dengan cara apa pun yang terasa alami dan tulis unit test untuk setiap perilaku. Buatlah daftar masalah yang Anda temui, misalnya jika Anda memulai dengan hal-hal yang bekerja satu arah, maka harus kembali dan mengubahnya nanti; jika Anda bingung tentang bagaimana hal-hal yang seharusnya cocok bersama; jika Anda merasa terganggu menulis boilerplate; dll.
Kemudian cobalah memecahkan masalah yang sama dengan mengikuti "aturan". Sekali lagi, buat daftar masalah yang Anda temui. Bandingkan daftar tersebut, dan pikirkan tentang situasi mana yang lebih baik ketika mengikuti aturan, dan yang mungkin tidak.
Mengenai pertanyaan Anda yang sebenarnya, saya cenderung memilih pendekatan port dan adapter , di mana kami membuat perbedaan antara "logika inti" dan "layanan" (ini mirip dengan membedakan antara fungsi murni dan prosedur yang efektif).
Inti logika adalah semua tentang menghitung hal-hal "di dalam" aplikasi, berdasarkan pada domain masalah. Ini mungkin berisi kelas seperti User
, Document
, Order
, Invoice
, dll baik-baik saja untuk memiliki kelas inti panggilan new
untuk kelas inti lainnya, karena mereka "internal" rincian pelaksanaan. Misalnya, membuat Order
mungkin juga membuat Invoice
dan Document
merinci apa yang dipesan. Tidak perlu mengejek ini selama tes, karena ini adalah hal-hal aktual yang ingin kita uji!
Port dan adapter adalah bagaimana logika inti berinteraksi dengan dunia luar. Di sinilah hal-hal seperti Database
, ConfigFile
, EmailSender
, dll hidup. Ini adalah hal-hal yang membuat pengujian sulit, sehingga disarankan untuk membuat ini di luar logika inti, dan meneruskannya sesuai kebutuhan (baik dengan injeksi ketergantungan, atau sebagai argumen metode, dll.).
Dengan cara ini, logika inti (yang merupakan bagian khusus aplikasi, di mana logika bisnis yang penting tinggal, dan tunduk pada churn yang paling banyak) dapat diuji sendiri, tanpa harus peduli dengan database, file, email, dll. Kami hanya dapat mengirimkan beberapa nilai contoh dan memeriksa apakah kami mendapatkan nilai output yang benar.
Port dan adaptor dapat diuji secara terpisah, menggunakan tiruan untuk database, sistem file, dll. Tanpa harus peduli dengan logika bisnis. Kami hanya bisa memberikan beberapa nilai contoh dan memastikan semuanya disimpan / dibaca / dikirim / dll. secara tepat.