Haruskah saya refactor unit test saya ketika saya mengekstrak kelas dari System Under Test?

13

Saya menulis kelas ini yang melakukan beberapa hal (mungkin ini merupakan pelanggaran terhadap Prinsip Tanggung Jawab Tunggal). Saya menyadari sekarang bahwa beberapa bagian lain dari proyek membutuhkan sepotong logika itu dan cara saya akan mengeksposnya adalah untuk mengekstrak kelas dari Sistem asli saya Diuji.

Saya mengantisipasi bisa melakukan ini tanpa harus mengubah kode tes apa pun, tetapi ketika saya selesai, Anda bisa berpendapat bahwa tes itu bukan tes unit lagi. Ini akan menguji kelas asli dan kelas yang saya ekstrak. Dengan kata lain, saya akan memiliki satu test case, tetapi dua sistem sedang diuji.

Apakah saya harus memperbaiki kode tes saya setelah selesai? IE: Buat ExtractedClassTest dan pindahkan semua tes yang relevan dari OriginalClassTest ke dalamnya? Sepertinya ini bisa sedikit berisiko: Saya mungkin kehilangan beberapa liputan dalam proses, mungkin tidak sesederhana memindahkan tes dan saya akhirnya menulis ulang beberapa kode tes yang saya tahu dulu berfungsi tetapi mungkin tidak lagi, dll.

Di sisi lain, jika saya membiarkan OriginalClassTest apa adanya, saya dapat melihat ini sebagai masalah perawatan pengujian. Akan sedikit membingungkan untuk menemukan di mana tes ExtractedClass berada. Kesan pertama Anda adalah tidak ada. Seiring waktu dengan banyak perbaikan kode produksi, ini bisa menjadi masalah serius.

Saya baru mengenal TDD jadi saya ingin saran ahli. Terima kasih!

Daniel Kaplan
sumber

Jawaban:

7

Setelah menonton pembicaraan yang luar biasa ini "Ian Cooper: TDD, di mana semuanya salah", saya tidak akan setuju dengan @pdr. Saya pikir Anda hanya harus menyimpan tes asli. Kemampuan Anda untuk memperbaiki sistem yang sedang diuji tanpa melanggar, menulis, atau mengubah tes apa pun adalah tujuan utama menulis tes.

Jika saya menguji kelas yang diekstraksi, saya akan menguji implementasi daripada perilaku. Akibatnya, kode saya akan lebih sulit untuk diperbaiki di masa mendatang: Tes-tes baru ini kemungkinan akan gagal bahkan jika perilakunya masih bekerja.

Daniel Kaplan
sumber
6

Untuk durasi pengembangan, miliki keduanya. Simpan tes yang lama sebagai jaminan bahwa Anda tidak merusak apa pun, tulis tes baru (dari awal) untuk membantu Anda merancang kelas sebagaimana mestinya.

Pada akhirnya, jalankan melalui dan menghapus apa pun yang tidak berfungsi dalam tes lama. Hati-hati dalam analisis ini; jangan hapus sesuatu karena Anda pikir itu harus mati. Tunjukkan pada diri sendiri (atau orang lain, atau bebek karet) mengapa itu tidak diperlukan lagi. Hancurkan tes dan pastikan tes lain gagal.

Apa pun yang tersisa dalam tes lama harus diambil berdasarkan kasus per kasus, tetapi sebagian besar harus ditulis ulang ke dalam struktur baru.

Karena Anda benar, Anda tidak ingin ketinggalan dengan mimpi buruk pemeliharaan. Tetapi Anda tidak ingin cakupan jalan lebih sedikit daripada yang Anda miliki sebelumnya.

pdr
sumber
1
Saya baru saja melakukan ini dan saya harus mengatakan itu cukup mendemotivasi. Meskipun perubahan saya berjalan lurus ke depan, butuh sekitar 2 jam untuk memastikan saya melakukan tes ulang tes saya dengan benar dan saya masih memiliki cakupan yang sama. Menjadi jelas bahwa saya harus menambahkan beberapa tes tambahan ke tes baru hanya untuk memastikan saya memeriksa semuanya. Saya merasa akan lebih efisien untuk mengekstrak kelas dan meninggalkan dua sistem yang diuji. Apakah jumlah pekerjaan ini menyarankan saya menulis tes dengan buruk?
Daniel Kaplan
1
@tieTYT: Sulit untuk menjawabnya tanpa duduk di sana mengawasi Anda. Terkadang TDD tampak seperti lebih banyak pekerjaan daripada nilainya. Di waktu lain, Anda diingatkan mengapa Anda repot. Dan di lain waktu, Andalah yang membuatnya lebih sulit. Belajar untuk membedakannya adalah bagian besar untuk menjadi ahli dalam TDD.
pdr
Apakah Anda pikir ini kemungkinan bahwa dalam kasus ini saya seharusnya tidak melakukan tes ulang pada tes saya atau apakah Anda pikir itu tidak mungkin?
Daniel Kaplan
1
@tieTYT: Tidak mungkin, ya. Tidak mungkin, tidak.
pdr