Saya menguji bahwa suatu fungsi melakukan apa yang diharapkan pada daftar. Jadi saya ingin menguji
f(null) -> null
f(empty) -> empty
f(list with one element) -> list with one element
f(list with 2+ elements) -> list with the same number of elements, doing what expected
Untuk melakukannya, Apa pendekatan terbaik?
- Menguji semua kasus dalam pengujian (metode) yang sama, dengan nama "WorksAsExpected"
- Menempatkan satu tes untuk setiap kasus, sehingga memiliki
- "Bekerja Seperti Yang DiharapkanKetikaNull"
- "Bekerja Seperti Yang Diharapkan Saat Kekosongan"
- "Bekerja Seperti Yang DiharapkanKetika Seling Tunggal"
- "Bekerja Seperti Yang DiharapkanKetika Lebih BanyakLagi"
- Pilihan lain yang tidak saya pikirkan :-)
unit-testing
tdd
malarres
sumber
sumber
Jawaban:
Aturan praktis sederhana yang saya gunakan untuk apakah akan melakukan serangkaian tes dalam satu kasus uji, atau banyak, adalah: apakah hanya melibatkan satu pengaturan?
Jadi jika saya menguji bahwa, untuk beberapa elemen, keduanya memproses semuanya dan mendapatkan hasil yang benar, saya mungkin memiliki dua atau lebih konfirmasi, tetapi saya hanya perlu mengatur daftar sekali. Jadi satu test case baik-baik saja.
Dalam kasus Anda, saya harus mengatur daftar nol, daftar kosong dll. Itu banyak pengaturan. Jadi saya pasti akan membuat beberapa tes dalam kasus ini.
Seperti yang disebutkan orang lain, "beberapa pengujian" tersebut mungkin dapat eksis sebagai kasus uji parameter tunggal; yaitu uji kasus yang sama dijalankan terhadap berbagai data pengaturan. Kunci untuk mengetahui apakah ini solusi yang layak terletak pada bagian lain dari tes ini: "aksi" dan "tegaskan". Jika Anda dapat melakukan tindakan yang sama dan menegaskan pada setiap kumpulan data, maka gunakan pendekatan ini. Jika Anda menambahkan diri
if
misalnya menjalankan kode yang berbeda terhadap bagian data yang berbeda, maka ini bukan solusinya. Gunakan kasus uji individual dalam kasus terakhir.sumber
Ada kompromi. Semakin banyak Anda mengemas dalam satu tes, semakin besar kemungkinan Anda akan memiliki efek bawang mencoba untuk membuatnya lulus. Dengan kata lain, kegagalan pertama menghentikan tes itu. Anda tidak akan tahu tentang pernyataan lain sampai Anda memperbaiki kegagalan pertama. Yang mengatakan, memiliki banyak unit test yang sebagian besar mirip kecuali untuk kode pengaturan adalah banyak pekerjaan yang sibuk hanya untuk mengetahui bahwa beberapa pekerjaan seperti yang ditulis dan yang lainnya tidak.
Alat yang mungkin, berdasarkan kerangka kerja Anda:
Assume.that()
cukup melewatkan tes untuk data jika gagal prasyarat. Ini memungkinkan Anda mendefinisikan "Bekerja seperti yang diharapkan" dan kemudian cukup memberinya banyak data. Saat Anda melihat hasilnya, Anda memiliki entri untuk tes induk dan kemudian sub-entri untuk setiap bagian data.Saya bukan dari pola pikir yang ketat bahwa hanya akan ada satu
assert
pernyataan dalam pengujian Anda, tetapi saya menempatkan batasan bahwa semua pernyataan harus menguji post-kondisi satu tindakan. Jika satu-satunya perbedaan antara tes adalah data, saya dari pola pikir untuk menggunakan fitur tes data didorong lebih lanjut seperti tes parameter atau teori.Timbang pilihan Anda untuk memutuskan apa hasil terbaik. Saya akan mengatakan bahwa "WorksAsExpectedWhenNull" pada dasarnya berbeda dari setiap kasus di mana Anda berurusan dengan koleksi yang memiliki berbagai elemen.
sumber
Itu adalah kasus uji yang berbeda, tetapi kode untuk tes ini sama. Oleh karena itu, menggunakan uji parameterisasi merupakan solusi terbaik. Jika kerangka kerja pengujian Anda tidak mendukung parameterisasi, ekstrak kode bersama menjadi fungsi pembantu, dan panggil dari setiap kasus uji.
Cobalah untuk menghindari parametrization melalui loop dalam satu test case, karena itu membuat sulit untuk menentukan set data mana yang menyebabkan kesalahan.
Dalam siklus merah-hijau-refactor TDD Anda, Anda harus menambahkan satu contoh data yang ditetapkan pada suatu waktu. Menggabungkan beberapa uji kasus menjadi uji parametrized akan menjadi bagian dari langkah refactoring.
Pendekatan yang agak berbeda adalah pengujian properti . Anda akan membuat berbagai tes (parametrized) yang menegaskan berbagai properti fungsi Anda, tanpa menentukan data input konkret. Misalnya properti dapat: untuk semua daftar
xs
, daftarys = f(xs)
memiliki panjang yang sama denganxs
. Kerangka pengujian kemudian akan menghasilkan daftar menarik dan daftar acak, dan menyatakan bahwa properti Anda berlaku untuk semuanya. Ini menjauh dari menentukan contoh secara manual, karena memilih contoh secara manual dapat melewatkan kasus tepi yang menarik.sumber
Memiliki satu tes untuk setiap kasus sesuai karena menguji konsep tunggal dalam setiap tes adalah pedoman yang baik yang sering direkomendasikan.
Lihat posting ini: Apakah boleh memiliki beberapa pernyataan dalam pengujian unit tunggal? . Ada diskusi yang relevan dan terperinci di sana:
[...]
sumber
Menurut saya, itu tergantung pada kondisi tes.
sumber