Menambahkan tes unit ke proyek C, warisan C yang sederhana

12

Judulnya mengatakan itu semua. Perusahaan saya menggunakan kembali proyek firmware lawas untuk perangkat mikrokontroler, ditulis sepenuhnya dalam bahasa C.

Ada bagian-bagian yang jelas-jelas salah dan perlu diubah, dan berasal dari latar belakang C # / TDD saya tidak suka gagasan untuk secara acak melakukan refactoring tanpa ada tes untuk meyakinkan kami bahwa fungsionalitas tetap tidak berubah. Juga, saya telah melihat bahwa sulit untuk menemukan bug diperkenalkan di banyak kesempatan melalui perubahan sekecil apa pun (yang merupakan sesuatu yang saya percaya akan diperbaiki jika pengujian regresi digunakan). Banyak kehati-hatian yang harus diambil untuk menghindari kesalahan ini: sulit untuk melacak sekelompok global di sekitar kode.

Untuk meringkas:

  • Bagaimana Anda menambahkan tes unit ke kode yang sudah digabungkan sebelumnya sebelum melakukan refactoring?
  • Alat apa yang Anda rekomendasikan? (kurang penting, tapi tetap menyenangkan untuk diketahui)

Saya tidak terlibat langsung dalam penulisan kode ini (tanggung jawab saya adalah sebuah aplikasi yang akan berinteraksi dengan perangkat dengan berbagai cara), tetapi akan menjadi buruk jika prinsip-prinsip pemrograman yang baik ditinggalkan jika ada kemungkinan mereka dapat digunakan.

Groo
sumber

Jawaban:

7

Ambil salinan Bekerja Efektif dengan Kode Warisan oleh Michael Feathers. Ini dimaksudkan untuk menghadapi situasi seperti itu. Meskipun lebih fokus pada bahasa OO seperti C ++ dan Java, saya percaya itu masih banyak membantu Anda.

Sepertinya sebagian darinya (atau artikel awal) bahkan tersedia gratis di sini .

Péter Török
sumber
+1, terima kasih. Tapi, saya percaya saya cukup pandai refactoring kode OO dengan lebih banyak kode OO. Apa yang saya tidak tahu adalah bagaimana menguji kode prosedural, dan refactor kode prosedural dengan kode prosedural kurang digabungkan.
Groo
@ Goo, buku ini bukan tentang refactoring per se. Ini adalah tentang bagaimana mengubah sekelompok kode spaghetti tanpa unit test menjadi sekelompok kode (agak kurang spaghetti) yang tercakup dengan baik dengan unit test. Kode semacam itu sulit untuk diuji, jadi Anda harus melakukan refactor terlebih dahulu agar dapat diuji; namun, seperti yang telah Anda sebutkan, refactoring tanpa tes unit berisiko, sehingga situasi sulit. Buku ini memandu Anda cara membuat perubahan terkecil, teraman untuk kode yang memungkinkan Anda untuk menutupinya dengan unit test, sehingga selanjutnya mulai refactoring dengan sungguh-sungguh.
Péter Török
Buku itu adalah saran yang bagus dan mencakup C bersama dengan bahasa OO.
ThomasW
7

Untuk teknik, mungkin Feathers Michael buku di jawaban Péter Török ini akan cukup komprehensif. Jika Anda tidak ingin pergi ke buku, saya sarankan proses tiga langkah:

  1. memeriksa kode yang tidak dapat diuji, dan menggandakan sebagian kecil dari fungsi kode itu ke dalam fungsi yang dapat diuji. Sangat penting bahwa fungsi-fungsi baru memiliki perilaku yang jelas setara dengan fungsi yang Anda coba gandakan - saya sebenarnya tidak menganjurkan penulisan unit-tes di sekitar kode warisan, jadi Anda harus sangat berhati-hati, dan membatasi ruang lingkup Anda, di untuk menjaga kepercayaan pada refactoring.
  2. tulis tes unit di sekitar fungsi-fungsi baru tersebut.
  3. memodifikasi kode asli untuk memanggil fungsi-fungsi baru.

Ulangi proses ini beberapa kali, dan Anda akan menemukan kualitas basis kode legacy telah meningkat secara signifikan.

Sejauh alat berjalan, perhatikan bahwa C ++ dapat memanggil ke C, sehingga setiap kerangka kerja pengujian unit C ++ dapat digunakan untuk menguji kode C. Misalnya, kami menggunakan CPPUnit untuk menguji unit sekelompok kode C dalam proyek kami.

Aidan Cully
sumber
+1 terima kasih atas tips dan tautan CPPUnit .
Groo