Jika saya memiliki fungsi unit yang diuji :
def do_everything():
# turn twizzles
# push buttons
# move mountain
Dan saya re-faktor menjadi beberapa unit yang lebih kecil:
def do_everything():
turn_twizzles()
push_buttons()
move_mountain()
def turn_twizzles():
# turn twizzles
def push_buttons():
# push buttons
def move_mountain():
# move mountain
Apakah saya membuang-buang waktu untuk menulis tes unit ekstra untuk unit yang lebih kecil?
unit-testing
refactoring
Adam Terrey
sumber
sumber
private
kunci dalam bahasa pemrograman hanyalah salah satu dari banyak cara membatasi akses ke sepotong kode.Tergantung. Lebih tepatnya, itu tergantung pada
Terutama ketika "fungsi yang lebih kecil" itu tidak sepele seperti pada contoh Anda, tetapi akan memiliki daftar parameter input yang lebih atau kurang kompleks, itu bisa menjadi sangat sulit untuk menghasilkan tes unit yang cukup untuk fungsi asli Anda untuk menjamin fungsi yang lebih kecil diuji. dengan semua kombinasi input "menarik". Itu akan menjadi tanda yang jelas untuk menulis unit test khusus untuk fungsi yang lebih kecil juga.
Jadi, tidak ada "ya" atau "tidak" yang jelas untuk pertanyaan ini, itu adalah trade-off yang harus Anda putuskan per kasus.
sumber
Jika
turn_twizzles
,,push_buttons
danmove_mountain
bersifat publik dan dipanggil oleh kode lain, maka saya pikir penting untuk melakukan refactor pengujian Anda untuk menguji fungsi-fungsi ini secara individual.Sayangnya setelah refactor Anda Anda memiliki masalah: untuk menguji unit
do_everything
Anda harus mampu untuk mengejekturn_twizzles
,push_buttons
danmove_mountain
. Menulis tes untukdo_everything
tanpa mengejek dependensi akan menjadi tes integrasi - tidak harus hal yang buruk tergantung pada rencana pengujian Anda, tetapi tidak akan ada banyak manfaat karena Anda sudah menguji tiga fungsi yang lebih kecil secara individual. Ini mungkin saat yang tepat bagi Anda untuk mendesain ulang komponen ini dan berkolaborasi dengan objek lain untuk melakukan semua pekerjaando_everything
.Jika
turn_twizzles
,,push_buttons
danmove_mountain
tidak dipanggil secara eksternal, mereka harus ditandai pribadi, dan saya tidak akan merekomendasikan untuk mengujinya secara terpisahdo_everything
. Ini karena dari sudut pandang berwawasan ke luar,do_everything
akan menjadi unit terkecil (karena yang lain tidak dapat diakses). Lihat juga jawaban ini tentang memecah metode menggunakan metode pribadi.sumber
do_everything
Anda harus mampu untuk mengejekturn_twizzles
,push_buttons
danmove_mountain
... " tergantung pada definisi omong kosong "uji unit".Tidak. Tes unit tambahan lebih tepat. Jika
move_mountain
gagal, maka satu tes akan gagal yang mengatakan dengan sangat spesifik apa yang salah.Ketepatan itu mengurangi waktu debugging, yang sangat berharga. Juga, karena tes ini lebih fokus, seharusnya lebih cepat dijalankan daripada menguji fungsi yang sama melalui fungsi penuh, memberikan umpan balik yang lebih cepat, yang berharga.
sumber