Saya bekerja pada sistem tertanam musim panas ini ditulis dalam C. lurus. Itu adalah proyek yang sudah ada yang diambil alih oleh perusahaan tempat saya bekerja. Saya menjadi sangat terbiasa menulis unit test di Java menggunakan JUnit tetapi bingung bagaimana cara terbaik untuk menulis unit test untuk kode yang ada (yang perlu refactoring) serta kode baru ditambahkan ke sistem.
Apakah ada proyek di luar sana yang membuat unit menguji kode C semudah unit menguji kode Java dengan JUnit? Setiap wawasan yang akan diterapkan secara khusus untuk pengembangan tertanam (cross-compiling ke platform arm-linux) akan sangat dihargai.
c
unit-testing
testing
embedded
Paul Osborne
sumber
sumber
Jawaban:
Satu kerangka pengujian unit dalam C adalah Periksa ; daftar kerangka pengujian unit dalam C dapat ditemukan di sini dan direproduksi di bawah ini. Bergantung pada berapa banyak fungsi pustaka standar yang dimiliki runtime Anda, Anda mungkin bisa atau tidak bisa menggunakan salah satunya.
Lebih banyak kerangka kerja:
CMocka
CMocka adalah kerangka uji untuk C dengan dukungan untuk benda tiruan. Mudah digunakan dan diatur.
Lihat situs CMocka .
Kriteria
Kriteria adalah kerangka kerja pengujian unit lintas-platform C yang mendukung registrasi pengujian otomatis, pengujian parameter, teori, dan yang dapat menghasilkan berbagai format, termasuk TAP dan JUnit XML. Setiap tes dijalankan dalam prosesnya sendiri, sehingga sinyal dan gangguan dapat dilaporkan atau diuji jika diperlukan.
Lihat beranda Kriteria untuk informasi lebih lanjut.
HUT
HWUT adalah alat Unit Test umum dengan dukungan besar untuk C. Ini dapat membantu untuk membuat Makefile, menghasilkan kasus uji besar-besaran berkode dalam 'tabel iterasi' minimal, berjalan di sepanjang mesin negara, menghasilkan C-stubs dan banyak lagi. Pendekatan umum cukup unik: Putusan didasarkan pada 'stdout baik / buruk stdout'. Namun, fungsi perbandingannya fleksibel. Dengan demikian, semua jenis skrip dapat digunakan untuk memeriksa. Ini dapat diterapkan ke bahasa apa pun yang dapat menghasilkan output standar.
Lihat beranda HWUT .
CGreen
Kerangka kerja pengujian dan mengejek unit lintas bahasa, modern dan portabel untuk C dan C ++. Ini menawarkan notasi BDD opsional, perpustakaan mengejek, kemampuan untuk menjalankannya dalam satu proses (untuk mempermudah proses debug). Pelari uji yang menemukan secara otomatis fungsi tes tersedia. Tapi Anda bisa membuat program sendiri.
Semua fitur tersebut (dan banyak lagi) dijelaskan dalam manual CGreen .
Wikipedia memberikan daftar terperinci tentang kerangka kerja pengujian unit C di bawah Daftar kerangka kerja pengujian unit: C
sumber
0.11.0
dirilis pada 17 Desember 2016 .Secara pribadi saya suka kerangka Google Test .
Kesulitan nyata dalam menguji kode C adalah memutus ketergantungan pada modul eksternal sehingga Anda dapat mengisolasi kode dalam unit. Ini bisa sangat bermasalah ketika Anda mencoba melakukan tes di sekitar kode lama. Dalam hal ini saya sering menemukan diri saya menggunakan tautan untuk menggunakan fungsi bertopik dalam tes.
Inilah yang dimaksud orang ketika mereka berbicara tentang " jahitan ". Di C, satu-satunya pilihan Anda adalah menggunakan pra-prosesor atau tautan untuk menghilangkan ketergantungan Anda.
Rangkaian uji khas di salah satu proyek C saya mungkin terlihat seperti ini:
Perhatikan bahwa Anda sebenarnya termasuk file C dan bukan file header . Ini memberi keuntungan akses ke semua anggota data statis. Di sini saya mengejek logger saya (yang mungkin di logger.o dan memberikan implementasi kosong. Ini berarti bahwa file uji mengkompilasi dan tautan secara independen dari sisa basis kode dan dijalankan secara terpisah.
Sedangkan untuk kompilasi silang kode, agar ini berfungsi, Anda memerlukan fasilitas yang baik pada target. Saya telah melakukan ini dengan lintas googletest yang dikompilasi ke Linux pada arsitektur PowerPC. Ini masuk akal karena di sana Anda memiliki shell dan os penuh untuk mengumpulkan hasil Anda. Untuk lingkungan yang kurang kaya (yang saya klasifikasikan sebagai apa saja tanpa OS penuh) Anda harus membangun dan menjalankannya pada host. Anda harus tetap melakukan ini sehingga Anda dapat menjalankan tes secara otomatis sebagai bagian dari build.
Saya menemukan pengujian kode C ++ umumnya jauh lebih mudah karena fakta bahwa kode OO secara umum jauh lebih sedikit digabungkan daripada prosedural (tentu saja ini sangat tergantung pada gaya pengkodean). Juga di C ++ Anda dapat menggunakan trik-trik seperti injeksi dependensi dan metode overriding untuk mendapatkan jahitan ke dalam kode yang dinyatakan dienkapsulasi.
Michael Feathers memiliki buku yang sangat bagus tentang pengujian kode warisan . Dalam satu bab ia membahas teknik untuk menangani kode non-OO yang sangat saya rekomendasikan.
Sunting : Saya sudah menulis posting blog tentang kode prosedur pengujian unit, dengan sumber tersedia di GitHub .
Sunting : Ada buku baru yang keluar dari Programmer Pragmatis yang secara khusus membahas kode pengujian unit C yang sangat saya rekomendasikan .
sumber
Minunit adalah kerangka pengujian unit yang sangat sederhana. Saya menggunakannya untuk unit test c kode mikrokontroler untuk AVR.
sumber
Saat ini saya menggunakan kerangka uji unit CuTest:
http://cutest.sourceforge.net/
Ini ideal untuk sistem tertanam karena sangat ringan dan sederhana. Saya tidak punya masalah untuk membuatnya bekerja di platform target maupun di desktop. Selain menulis tes unit, semua yang diperlukan adalah:
Sistem perlu mendukung heap dan beberapa fungsi stdio (yang tidak dimiliki semua sistem embedded). Tetapi kodenya cukup sederhana sehingga Anda mungkin bisa bekerja di alternatif untuk persyaratan tersebut jika platform Anda tidak memilikinya.
Dengan beberapa penggunaan extern "C" {} blok yang bijaksana, ia juga mendukung pengujian C ++.
sumber
Before
danAfter
menelepon. Secara keseluruhan, ini lucu.Saya mengatakan hampir sama dengan ratkok tetapi jika Anda memiliki twist tertanam ke unit test maka ...
Unity - Kerangka kerja yang sangat direkomendasikan untuk pengujian unit kode C.
Contoh dalam buku yang disebutkan dalam utas ini TDD untuk embedded C ditulis menggunakan Unity (dan CppUTest).
sumber
Anda juga mungkin ingin melihat libtap , kerangka kerja pengujian C yang menghasilkan Test Anything Protocol (TAP) dan dengan demikian terintegrasi dengan baik dengan berbagai alat yang keluar untuk teknologi ini. Ini sebagian besar digunakan di dunia bahasa yang dinamis, tetapi mudah digunakan dan menjadi sangat populer.
Sebuah contoh:
sumber
ok(TESTING==IsSimple(), "libtap is super easy to use")
Ada kerangka pengujian unit yang elegan untuk C dengan dukungan untuk benda tiruan yang disebut cmocka . Ini hanya membutuhkan pustaka C standar, bekerja pada berbagai platform komputasi (termasuk tertanam) dan dengan kompiler yang berbeda.
Ini juga memiliki dukungan untuk format output pesan yang berbeda seperti Subunit, Test Anything Protocol dan laporan XML jUnit.
cmocka telah dibuat untuk juga bekerja pada platform tertanam dan juga memiliki dukungan Windows.
Tes sederhana terlihat seperti ini:
The API sepenuhnya didokumentasikan dan beberapa contoh adalah bagian dari kode sumber.
Untuk memulai dengan cmocka Anda harus membaca artikel di LWN.net: Pengujian unit dengan objek tiruan di C
cmocka 1.0 telah dirilis Februari 2015.
sumber
Saya tidak jauh-jauh menguji aplikasi C warisan sebelum saya mulai mencari cara untuk mengejek fungsi. Saya sangat perlu mengejek untuk mengisolasi file C yang ingin saya uji dari orang lain. Saya mencoba cmock dan saya pikir saya akan mengadopsinya.
Cmock memindai file header dan menghasilkan fungsi tiruan berdasarkan prototipe yang ditemukannya. Mocks akan memungkinkan Anda untuk menguji file C dalam isolasi yang sempurna. Yang harus Anda lakukan adalah menautkan file pengujian Anda dengan ejekan alih-alih file objek nyata Anda.
Keuntungan lain dari cmock adalah bahwa ia akan memvalidasi parameter yang dilewatkan ke fungsi yang diolok-olok, dan itu akan memungkinkan Anda menentukan nilai balik apa yang seharusnya diberikan oleh tiruan itu. Ini sangat berguna untuk menguji berbagai aliran eksekusi di fungsi Anda.
Tes terdiri dari fungsi testA (), testB () yang tipikal di mana Anda membangun harapan, memanggil fungsi untuk menguji dan memeriksa pernyataan.
Langkah terakhir adalah menghasilkan pelari untuk pengujian Anda dengan satu. Cmock terikat pada kerangka uji kesatuan. Unity mudah dipelajari seperti halnya kerangka kerja unit test lainnya.
Layak dicoba dan cukup mudah untuk dipahami:
http://sourceforge.net/apps/trac/cmock/wiki
Perbarui 1
Kerangka kerja lain yang saya selidiki adalah Cmockery.
http://code.google.com/p/cmockery/
Ini adalah kerangka kerja C murni yang mendukung pengujian dan mengejek unit. Ia tidak memiliki ketergantungan pada ruby (bertentangan dengan Cmock) dan memiliki sedikit ketergantungan pada lib eksternal.
Dibutuhkan sedikit lebih banyak pekerjaan manual untuk mengatur tiruan karena tidak menghasilkan kode. Itu tidak mewakili banyak pekerjaan untuk proyek yang sudah ada karena prototipe tidak akan banyak berubah: setelah Anda mengejek Anda, Anda tidak perlu mengubahnya untuk sementara waktu (ini kasus saya). Pengetikan ekstra memberikan kontrol penuh terhadap ejekan. Jika ada sesuatu yang tidak Anda sukai, Anda cukup mengubah tiruan Anda.
Tidak perlu pelari ujian khusus. Anda hanya perlu membuat array tes dan meneruskannya ke fungsi run_tests. Sedikit lebih banyak pekerjaan manual di sini juga, tetapi saya jelas menyukai gagasan tentang kerangka kerja mandiri yang mandiri.
Plus itu mengandung beberapa trik C bagus yang saya tidak tahu.
Secara keseluruhan Cmockery membutuhkan sedikit lebih banyak pemahaman tentang cemoohan untuk memulai. Contohnya akan membantu Anda mengatasi hal ini. Sepertinya bisa melakukan pekerjaan dengan mekanik yang lebih sederhana.
sumber
Sebagai seorang pemula C, saya menemukan slide yang disebut Test driven development di C sangat membantu. Pada dasarnya, ini menggunakan standar
assert()
bersama dengan&&
untuk mengirim pesan, tanpa ketergantungan eksternal. Jika seseorang terbiasa dengan kerangka kerja pengujian tumpukan penuh, ini mungkin tidak akan berhasil :)sumber
assert
tanpa perpustakaan atau kerangka kerja tambahan. Saya pikir jika Anda hanya seorang pemula, ini bisa menjadi titik awal.Kami menulis CHEAT (host di GitHub ) untuk kemudahan penggunaan dan portabilitas.
Tidak memiliki dependensi dan tidak memerlukan instalasi atau konfigurasi. Hanya file header dan test case yang diperlukan.
Tes dikompilasi menjadi sebuah executable yang menangani menjalankan tes dan melaporkan hasilnya.
Ini memiliki warna yang cantik juga.
sumber
Ada CUnit
Dan Embedded Unit adalah kerangka pengujian unit untuk Embedded C System. Desainnya disalin dari JUnit dan CUnit dan banyak lagi, dan kemudian diadaptasi untuk Embedded C System. Unit Tertanam tidak memerlukan std C libs. Semua objek dialokasikan ke area const.
Dan Tessy mengotomatiskan pengujian unit perangkat lunak tertanam.
sumber
embunit
dan kecewa karenanya.Saya tidak menggunakan framework, saya hanya menggunakan autotools "check" target support. Terapkan "utama" dan gunakan pernyataan (s).
Dir test saya Makefile.am terlihat seperti:
sumber
Buku Michael Feather "Bekerja Efektif dengan Legacy Code" menyajikan banyak teknik khusus untuk pengujian unit selama pengembangan C.
Ada teknik yang berkaitan dengan injeksi ketergantungan yang khusus untuk C yang belum saya lihat di tempat lain.
sumber
CppUTest - Kerangka kerja yang sangat direkomendasikan untuk pengujian unit kode C.
Contoh dalam buku yang disebutkan dalam utas ini TDD untuk embedded C ditulis menggunakan CppUTest.
sumber
Saya menggunakan CxxTest untuk lingkungan c / c ++ yang tertanam (terutama C ++).
Saya lebih suka CxxTest karena memiliki skrip perl / python untuk membangun test runner. Setelah kemiringan kecil untuk menyiapkannya (masih lebih kecil karena Anda tidak harus menulis test runner), cukup mudah digunakan (termasuk sampel dan dokumentasi yang bermanfaat). Pekerjaan yang paling banyak adalah mengatur 'perangkat keras' yang diakses oleh kode sehingga saya dapat menguji unit / modul secara efektif. Setelah itu mudah untuk menambahkan unit uji unit baru.
Seperti disebutkan sebelumnya itu adalah kerangka uji unit C / C ++. Jadi Anda akan memerlukan kompiler C ++.
Panduan Pengguna CxxTest Wiki CxxTest
sumber
selain bias jelas saya
http://code.google.com/p/seatest/
adalah cara sederhana yang bagus untuk menguji kode C unit. meniru xUnit
sumber
Setelah membaca Minunit saya pikir cara yang lebih baik adalah mendasarkan tes dalam menegaskan makro yang saya gunakan banyak seperti teknik program defensif. Jadi saya menggunakan ide yang sama tentang Minunit yang dicampur dengan pernyataan standar. Anda dapat melihat kerangka kerja saya (nama yang bagus bisa NoMinunit) di blog k0ga
sumber
cmockery di http://code.google.com/p/cmockery/
sumber
Google memiliki kerangka pengujian yang sangat baik. https://github.com/google/googletest/blob/master/googletest/docs/primer.md
Dan ya, sejauh yang saya lihat itu akan berfungsi dengan C biasa, yaitu tidak memerlukan fitur C ++ (mungkin memerlukan kompiler C ++, tidak yakin).
sumber
Cmockery adalah proyek yang baru diluncurkan yang terdiri dari pustaka C yang sangat mudah digunakan untuk menulis unit test.
sumber
Pertama, lihat di sini: http://en.wikipedia.org/wiki/List_of_unit_testing_frameworks#C
Perusahaan saya memiliki perpustakaan C yang digunakan pelanggan kami. Kami menggunakan CxxTest (pustaka uji unit C ++) untuk menguji kode. CppUnit juga akan berfungsi. Jika Anda terjebak dalam C, saya akan merekomendasikan RCUNIT (tapi CUnit juga bagus).
sumber
Jika Anda terbiasa dengan JUnit maka saya merekomendasikan CppUnit. http://cppunit.sourceforge.net/cppunit-wiki
Itu dengan asumsi Anda memiliki c ++ compiler untuk melakukan tes unit. jika tidak maka saya harus setuju dengan Adam Rosenfield bahwa cek adalah yang Anda inginkan.
sumber
Saya menggunakan RCUNIT untuk melakukan beberapa pengujian unit untuk kode tertanam pada PC sebelum menguji pada target. Abstraksi antarmuka perangkat keras yang baik adalah penting karena endianness dan register yang dipetakan memori akan membunuh Anda.
sumber
coba potong! - http://code.google.com/p/lcut
sumber
API Sanity Checker - kerangka uji untuk pustaka C / C ++:
Contoh:
sumber
Salah satu teknik yang digunakan adalah mengembangkan kode uji unit dengan kerangka C ++ xUnit (dan kompiler C ++), sambil mempertahankan sumber untuk sistem target sebagai modul C.
Pastikan Anda mengkompilasi sumber C secara teratur di bawah cross-compiler, secara otomatis dengan unit test Anda jika memungkinkan.
sumber
LibU ( http://koanlogic.com/libu ) memiliki modul unit test yang memungkinkan dependensi test suite / case yang eksplisit, isolasi tes, eksekusi paralel dan formatter laporan yang dapat disesuaikan (format default adalah xml dan txt).
Perpustakaan ini berlisensi BSD dan berisi banyak modul berguna lainnya - jaringan, debugging, struktur data yang umum digunakan, konfigurasi, dll. - jika Anda memerlukannya di proyek Anda ...
sumber
Saya terkejut bahwa tidak ada yang disebutkan Cutter (http://cutter.sourceforge.net/) Anda dapat menguji C dan C ++, itu terintegrasi dengan mulus dengan autotool dan memiliki tutorial yang sangat bagus tersedia.
sumber
Jika Anda menargetkan platform Win32 atau mode kernel NT, Anda harus melihat cfix .
sumber
Jika Anda masih mencari kerangka kerja pengujian, CUnitWin32 adalah salah satu untuk platform Win32 / NT.
Ini memecahkan satu masalah mendasar yang saya hadapi dengan kerangka kerja pengujian lainnya. Yaitu variabel global / statis dalam keadaan deterministik karena setiap tes dijalankan sebagai proses terpisah.
sumber