Apakah boleh untuk menghindari pengujian kelas dasar?

15

Saya memiliki kelas dasar dengan "pemrograman meta" yang lumayan banyak untuk memberikan fleksibilitas / abstraksi yang diperlukannya agak generik.

Saya punya banyak subclass menggunakan metode umum di kelas dasar, dan saya memiliki tes unit berorientasi perilaku yang mencakup semua kasus di setiap subclass.

Apakah boleh untuk melewati pengujian kelas dasar?

Nathan
sumber
1
Satu hal yang kadang-kadang saya lakukan ketika mulai bertanya pada diri sendiri pertanyaan ini adalah mencoba untuk memecahkan kode. Lemparkan input yang tidak valid padanya, tentukan nilai konfigurasi yang salah, dll.
Zymus

Jawaban:

31

Untuk memverifikasi apakah Anda memiliki cukup tes atau tidak, Anda dapat memeriksa cakupan kode Anda dan cakupan cabang Anda yang disebabkan oleh tes (mungkin dengan menggunakan alat cakupan, mungkin secara manual dengan meninjau jalur kode atau dengan menggunakan debugger).

Jika Anda sampai pada kesimpulan tes untuk subclass memberi Anda cakupan yang cukup tinggi untuk kode kelas dasar Anda, kemudian menambahkan tes lebih lanjut jelas tidak akan membawa banyak manfaat. Di sisi lain, jika ada jalur kode yang hanya dapat Anda uji dengan menambahkan tes khusus menggunakan kelas dasar secara langsung, maka Anda harus menempuh rute ini.

Alasan lain yang mungkin untuk "menguji kelas dasar Anda secara langsung" adalah bahwa Anda ingin menguji fungsi tertentu dari kelas itu "secara terpisah". Terkadang lebih mudah untuk merancang kasus uji secara langsung untuk metode tertentu, daripada hanya menguji metode itu secara tidak langsung dengan memanggil metode subclass Anda yang menggunakan metode itu.

Perhatikan bahwa ketika Anda memiliki kelas dasar generik yang skenario penggunaan tipikalnya adalah untuk menurunkan subkelas, kelas dasar Anda mungkin abstrak. Jadi untuk menguji kelas seperti itu Anda harus membuat derivasi pula. Untuk situasi ini, tentu saja menguji "kelas dasar secara langsung" dapat berarti menambahkan derivasi khusus hanya untuk tujuan pengujian.

Doc Brown
sumber
Ya, saya setuju dengan tes unit langsung pada kelas dasar untuk metode yang lebih jelas. Apa yang saya tidak ingin lakukan adalah menguji semua meta-pemrograman sejak unit test pada subclass secara implisit menguji hal itu.
Nathan
4
Merancang kelas yang memperluas kelas dasar / abstrak yang hanya ada di dalam direktori tes dan hanya berfungsi untuk mengekspos / membuat instance kelas dasar adalah pendekatan yang sangat sah dan masuk akal untuk mendapatkan cakupan yang sesuai dari kelas dasar dan menjamin bahwa metode yang mendasarinya adalah bekerja dengan benar dalam isolasi kelas yang lebih kompleks yang digunakan.
@MichaelT: ya. Apakah jawaban saya terdengar seperti saya memiliki pendapat yang berbeda tentang itu?
Doc Brown
@DocBrown tidak sama sekali - Anda jelas mengartikulasikan titik itu. Saya hanya menambahkan penjelasan tambahan yang akan saya tulis dalam jawaban saya sendiri (jika Anda belum menyatakannya). Saya tidak ingin menulis jawaban yang akan dimulai, "Saya setuju dengan semua yang dikatakan Doc, tetapi ingin secara khusus memanggil dan menulis lebih banyak tentang ..."
2

Tes otomatis dibuat untuk kepentingan programmer, programer tidak dibuat untuk melayani tes.

Kami memiliki tes untuk membuat kami lebih produktif dan mengurangi jumlah "masalah" yang dikeluhkan pelanggan.

Jadi mengingat bahwa Anda memiliki tes unit berorientasi perilaku yang mencakup semua kasus di setiap subkelas, tidak ada manfaatnya bagi pelanggan Anda juga menguji kelas dasar secara langsung. Ini dapat dikonfirmasikan dengan mengubah beberapa kode di kelas dasar dan melihat apakah tes gagal, misalnya umum keluar dari baris kode, atau menambahkan "tidak" ke "jika pernyataan". (Hanya memeriksa bahwa setiap baris kode dicakup oleh tes tidak cukup baik.)

Kami kemudian bertanya apakah tes akan membuat Anda lebih produktif . Ini dapat terjadi dalam beberapa cara.

  • Membiarkan Anda berpikir lebih jernih tentang kode - saat kode ditulis, ini tidak mungkin dalam kasus ini.
  • Membiarkan Anda menguji beberapa kode di kelas dasar dalam isolasi, jadi debug itu lebih cepat, sekali lagi tidak mungkin dalam kasus ini karena kode sudah berfungsi.
  • Membiarkan Anda mengubah kode di kelas dasar tanpa harus memahami rincian logika di subkelas - mungkin jika Anda refactoring kode ???

Jadi mengingat bahwa sub-kelas berfungsi, saya tidak melihat titik dalam menulis tes langsung untuk kelas dasar. Ini bukan hari ini, bahwa tidak akan ada manfaat untuk menulis tes ini di awal.

Ian
sumber