Baru-baru ini saya menyelesaikan refactoring kotak hitam. Saya tidak dapat memeriksanya, karena saya tidak tahu cara mengujinya.
Pada level tinggi, saya memiliki kelas yang inisialisasi melibatkan mengambil nilai dari beberapa kelas B. Jika kelas B "kosong", itu menghasilkan beberapa default yang masuk akal. Saya mengekstrak bagian ini ke metode yang menginisialisasi kelas B ke default yang sama.
Saya belum mengetahui tujuan / konteks dari salah satu kelas, atau bagaimana mereka akan digunakan. Jadi saya tidak dapat menginisialisasi objek dari kelas B yang kosong dan memeriksa apakah ia memiliki nilai yang benar / melakukan hal yang benar.
Ide terbaik saya adalah menjalankan kode asli, hardcode dalam hasil metode publik tergantung pada anggota yang diinisialisasi, dan menguji kode baru terhadap hal itu. Saya tidak bisa mengartikulasikan mengapa saya merasa tidak nyaman dengan ide ini.
Apakah ada serangan yang lebih baik di sini?
sumber
Jawaban:
Anda baik-baik saja!
Membuat tes regresi otomatis sering kali merupakan hal terbaik yang dapat Anda lakukan untuk membuat komponen dapat diulang kembali. Ini mungkin mengejutkan, tetapi tes semacam itu seringkali dapat ditulis tanpa pemahaman penuh tentang apa yang komponen lakukan secara internal, selama Anda memahami input dan output "antarmuka" (dalam arti umum kata itu). Kami melakukan ini beberapa kali di masa lalu untuk aplikasi warisan penuh, bukan hanya kelas, dan itu sering membantu kami menghindari hal-hal yang tidak kami pahami sepenuhnya.
Namun, Anda harus memiliki data uji yang cukup dan pastikan Anda memiliki pemahaman yang kuat tentang apa yang dilakukan perangkat lunak dari sudut pandang pengguna komponen itu, jika tidak, Anda berisiko menghilangkan kasus uji penting.
Ini adalah ide yang bagus untuk menerapkan tes otomatis Anda sebelum memulai refactoring, bukan setelahnya, sehingga Anda dapat melakukan refactoring dalam langkah-langkah kecil dan memverifikasi setiap langkah. Refactoring itu sendiri harus membuat kode lebih mudah dibaca, sehingga membantu Anda meningkatkan pemahaman Anda sedikit demi sedikit. Jadi langkah-langkah urutan dalam proses ini adalah
sumber
Alasan penting untuk menulis unit test adalah karena mereka mendokumentasikan komponen API entah bagaimana. Tidak memahami tujuan kode yang sedang diuji benar-benar masalah di sini. Cakupan kode adalah tujuan penting lainnya, sulit untuk dicapai tanpa mengetahui cabang eksekusi yang ada dan bagaimana mereka dipicu.
Namun jika dimungkinkan untuk mengatur ulang keadaan secara bersih (atau membuat objek pengujian baru setiap saat), seseorang dapat menulis tes tipe "trash in-trash out" yang hanya memasukkan sebagian besar input acak ke sistem dan mengamati output.
Tes semacam itu sulit dipertahankan, karena ketika gagal, mungkin rumit untuk mengatakan mengapa dan seberapa serius itu. Cakupan mungkin dipertanyakan. Namun mereka masih jauh lebih baik daripada tidak sama sekali. Ketika pengujian tersebut gagal, pengembang dapat merevisi perubahan terbaru dengan lebih banyak perhatian dan mudah-mudahan menemukan bug di sana.
sumber