Saya akan memberikan ceramah kepada departemen saya minggu depan tentang pengujian unit dan pengembangan yang digerakkan oleh pengujian. Sebagai bagian dari ini, saya akan menunjukkan beberapa contoh dunia nyata dari beberapa kode yang saya tulis baru-baru ini, tetapi saya juga ingin menunjukkan beberapa contoh yang sangat sederhana yang akan saya tulis dalam ceramah.
Saya telah mencari di web untuk contoh-contoh yang baik, tetapi saya telah berjuang untuk menemukan yang cocok untuk bidang pengembangan kami. Hampir semua perangkat lunak yang kami tulis adalah sistem kontrol tertanam dalam yang dijalankan pada mikrokontroler kecil. Ada banyak kode C yang mudah diterapkan untuk pengujian unit (saya akan berbicara tentang pengujian unit pada PC daripada pada target itu sendiri) selama Anda menghindari lapisan 'bawah': hal-hal yang berbicara langsung ke peripheral mikrokontroler. Namun, sebagian besar contoh yang saya temukan cenderung didasarkan pada pemrosesan string (mis. Contoh angka Romawi Dive Into Python yang sangat baik) dan karena kita jarang menggunakan string, ini tidak benar-benar cocok (tentang satu-satunya fungsi perpustakaan yang biasanya digunakan kode kita adalah memcpy
, memcmp
dan memset
,strcat
atau ekspresi reguler kurang tepat).
Jadi, pada pertanyaan: bisakah ada yang menawarkan beberapa contoh fungsi yang bagus yang dapat saya gunakan untuk menunjukkan pengujian unit dalam sesi langsung? Jawaban yang bagus menurut pendapat saya (dapat berubah) mungkin adalah:
- Sebuah fungsi yang cukup sederhana sehingga siapa pun (bahkan mereka yang hanya menulis kode sesekali) dapat mengerti;
- Fungsi yang tidak tampak sia-sia (yaitu mengerjakan paritas atau CRC mungkin lebih baik daripada fungsi yang mengalikan dua angka bersamaan dan menambahkan konstanta acak);
- Sebuah fungsi yang cukup pendek untuk ditulis di depan ruangan orang (saya dapat memanfaatkan banyak clipboard Vim untuk mengurangi kesalahan ...);
- Fungsi yang mengambil angka, array, pointer atau struktur sebagai parameter dan mengembalikan sesuatu yang serupa, daripada menangani string;
- Fungsi yang memiliki kesalahan sederhana (misalnya,
>
bukan>=
) yang mudah dimasukkan ke dalam yang akan tetap bekerja dalam kebanyakan kasus tetapi akan pecah dengan beberapa kasus tepi tertentu: mudah diidentifikasi dan diperbaiki dengan uji unit.
Adakah pikiran?
Meskipun mungkin tidak relevan, tes itu sendiri mungkin akan ditulis dalam C ++ menggunakan Google Test Framework: semua header kami sudah memiliki #ifdef __cplusplus extern "C" {
pembungkus di sekitarnya; ini telah bekerja dengan baik dengan tes yang saya lakukan sejauh ini.
Jawaban:
Berikut adalah fungsi sederhana yang seharusnya menghasilkan checksum lebih dari len byte.
Ini memiliki bug fencepost: dalam pernyataan for, tes seharusnya
i < len
.Apa yang menyenangkan adalah, jika Anda menerapkannya ke string teks seperti ini ...
Anda akan mendapatkan "jawaban yang benar"! Itu karena byte tambahan yang checksummed adalah terminator string nol. Jadi Anda bisa berakhir dengan menempatkan fungsi checksum ini ke dalam kode, dan mungkin bahkan mengirim dengannya, dan tidak pernah melihat masalah - yaitu, sampai Anda mulai menerapkannya pada sesuatu selain string teks.
Berikut ini adalah unit test sederhana yang akan menandai bug ini (sebagian besar waktu ... :-)
sumber
Bagaimana dengan mengimplementasikan fungsi sortir seperti bubble sort ? Setelah fungsi sortir berfungsi, Anda dapat melanjutkan dengan pencarian biner yang sama baiknya untuk memperkenalkan pengujian unit dan TDD.
Penyortiran dan pencarian tergantung pada perbandingan yang mudah salah. Ini juga melibatkan penukaran pointer di sekitar yang harus dilakukan dengan hati-hati. Keduanya rentan terhadap kesalahan, jadi silakan mengacau :)
Beberapa ide lagi:
qsort
, dan tes masih harus berlalu, membuktikan fungsi sortir baru Anda juga berfungsi.sumber