Ini.
Bahkan jika Anda hanya melakukan pengujian unit, bukan tidak biasa memiliki lebih banyak kode dalam pengujian daripada kode yang sebenarnya diuji. Tidak ada yang salah dengan itu.
Pertimbangkan kode sederhana:
public void SayHello(string personName)
{
if (personName == null) throw new NullArgumentException("personName");
Console.WriteLine("Hello, {0}!", personName);
}
Apa yang akan menjadi tes? Setidaknya ada empat kasus sederhana untuk diuji di sini:
Nama orang itu null
. Apakah pengecualian benar-benar dilemparkan? Itu setidaknya tiga baris kode tes untuk ditulis.
Nama orang itu "Jeff"
. Apakah kita mendapat "Hello, Jeff!"
tanggapan? Itu empat baris kode uji.
Nama orang adalah string kosong. Output apa yang kita harapkan? Apa hasil aktualnya? Pertanyaan sampingan: apakah cocok dengan persyaratan fungsional? Itu berarti empat baris kode lain untuk unit test.
Nama orang cukup pendek untuk sebuah string, tetapi terlalu panjang untuk digabungkan dengan "Hello, "
dan tanda seru. Apa yang terjadi? ¹
Ini membutuhkan banyak kode pengujian. Selain itu, potongan kode yang paling dasar sering memerlukan kode pengaturan yang menginisialisasi objek yang diperlukan untuk kode yang diuji, yang juga sering menyebabkan tulisan bertopik dan mengolok-olok, dll.
Jika rasionya sangat besar, dalam hal ini Anda dapat memeriksa beberapa hal:
Apakah ada duplikasi kode di seluruh tes? Fakta bahwa itu kode uji tidak berarti bahwa kode tersebut harus digandakan (copy-paste) antara tes yang sama: duplikasi seperti itu akan membuat pemeliharaan tes tersebut sulit.
Apakah ada tes yang berlebihan? Sebagai aturan praktis, jika Anda menghapus unit test, jangkauan cabang akan berkurang. Jika tidak, ini mungkin mengindikasikan bahwa tes tidak diperlukan, karena jalur sudah dicakup oleh tes lain.
Apakah Anda hanya menguji kode yang harus Anda uji? Anda tidak diharapkan untuk menguji kerangka kerja yang mendasari perpustakaan pihak ketiga, tetapi secara eksklusif kode proyek itu sendiri.
Dengan tes asap, tes sistem dan integrasi, tes fungsional dan penerimaan, serta tes stres dan beban, Anda menambahkan lebih banyak kode uji, sehingga memiliki empat atau lima LOC tes untuk setiap LOC kode aktual bukanlah sesuatu yang harus Anda khawatirkan.
Catatan tentang TDD
Jika Anda khawatir tentang waktu yang diperlukan untuk menguji kode Anda, mungkin Anda melakukan kesalahan, itu kode pertama, tes nanti. Dalam hal ini, TDD dapat membantu dengan mendorong Anda untuk bekerja dalam iterasi 15-45 detik, beralih antara kode dan tes. Menurut para pendukung TDD, itu mempercepat proses pengembangan dengan mengurangi baik jumlah tes yang perlu Anda lakukan dan, yang lebih penting, jumlah kode bisnis untuk menulis dan terutama menulis ulang untuk pengujian.
¹ Biarkan n menjadi panjang maksimal string . Kita dapat memanggil SayHello
dan mengirim referensi panjang string n - 1 yang seharusnya bekerja dengan baik. Sekarang, pada Console.WriteLine
langkah, format harus berakhir dengan string dengan panjang n + 8, yang akan menghasilkan pengecualian. Mungkin, karena batas memori, bahkan string yang berisi n / 2 karakter akan menghasilkan pengecualian. Pertanyaan yang harus ditanyakan adalah apakah tes keempat ini adalah unit test (sepertinya tes satu, tetapi mungkin memiliki dampak yang jauh lebih tinggi dalam hal sumber daya dibandingkan dengan tes unit rata-rata) dan jika tes ini kode aktual atau kerangka kerja yang mendasarinya.