Unit Testing Kode C [ditutup]

853

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.

Paul Osborne
sumber
10
Lihatlah cmocka.org
Mawg mengatakan mengembalikan Monica
2
@zmo - Rekomendasi Perangkat Lunak adalah situs Stack Exchange untuk mendapatkan rekomendasi perangkat lunak. Saya belum menggunakannya, jadi saya tidak bisa mengatakan seberapa baik kerjanya. Anda harus memeriksa aturan posting mereka sebelum memposting di sana.
Jonathan Leffler

Jawaban:

495

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.

AceUnit

AceUnit (Advanced C dan Unit Tertanam) menagih dirinya sebagai kerangka uji unit kode C yang nyaman. Ia mencoba meniru JUnit 4.x dan menyertakan kemampuan seperti refleksi. AceUnit dapat digunakan di lingkungan kendala sumber daya, mis. Pengembangan perangkat lunak yang disematkan, dan yang penting itu berjalan dengan baik di lingkungan di mana Anda tidak dapat menyertakan file header standar tunggal dan tidak dapat meminta fungsi C standar tunggal dari pustaka ANSI / ISO C. Ini juga memiliki port Windows. Itu tidak menggunakan garpu untuk menjebak sinyal, meskipun penulis telah menyatakan minatnya untuk menambahkan fitur seperti itu. Lihat beranda AceUnit .

GNU Autounit

Sebagian besar sejalan dengan Check, termasuk forking untuk menjalankan tes unit dalam ruang alamat yang terpisah (pada kenyataannya, penulis asli Check meminjam ide dari GNU Autounit). GNU Autounit menggunakan GLib secara luas, yang berarti bahwa penautan dan semacamnya memerlukan opsi khusus, tetapi ini mungkin bukan masalah besar bagi Anda, terutama jika Anda sudah menggunakan GTK atau GLib. Lihat beranda GNU Autounit .

cUnit

Juga menggunakan GLib, tetapi tidak bercabang untuk melindungi ruang alamat pengujian unit.

CUnit

Standar C, dengan rencana untuk implementasi GUI Win32. Saat ini tidak bercabang atau melindungi ruang alamat pengujian unit. Dalam pengembangan awal. Lihat beranda CUnit .

CuTest

Kerangka kerja sederhana dengan hanya satu file .c dan satu file .h yang Anda masukkan ke pohon sumber Anda. Lihat beranda CuTest .

CppUnit

Kerangka pengujian unit utama untuk C ++; Anda juga dapat menggunakannya untuk menguji kode C. Ini stabil, dikembangkan secara aktif, dan memiliki antarmuka GUI. Alasan utama untuk tidak menggunakan CppUnit untuk C adalah pertama bahwa itu cukup besar, dan kedua Anda harus menulis tes Anda dalam C ++, yang berarti Anda memerlukan kompiler C ++. Jika ini tidak terdengar seperti kekhawatiran, itu pasti layak dipertimbangkan, bersama dengan kerangka pengujian unit C ++ lainnya. Lihat beranda CppUnit .

embUnit

embUnit (Embedded Unit) adalah kerangka uji unit lain untuk sistem embedded. Yang ini tampaknya digantikan oleh AceUnit. Beranda Unit Tertanam .

MinUnit

Satu set makro minimal dan hanya itu! Intinya adalah untuk menunjukkan betapa mudahnya unit menguji kode Anda. Lihat beranda MinUnit .

CUnit untuk Tn. Ando

Implementasi CUnit yang cukup baru, dan tampaknya masih dalam pengembangan awal. Lihat situs web CUnit untuk Mr. Ando .

Daftar ini terakhir diperbarui pada Maret 2008.

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

Damien Flament
sumber
Awalnya, Cek terlihat sangat solid. Saya harus melihat bagaimana itu bertahan di bawah api penggunaan nyata ... tapi sepertinya itu mungkin sesuai dengan tagihan.
Paul Osborne
8
Kami menggunakan cek kode pengujian unit pada sistem tertanam kami. Sebagian besar pemeriksaan adalah pilihan yang baik tetapi sekarang kami sedang mengerjakan sistem yang berjalan di uClinux dan karena pemeriksaan memerlukan garpu, itu tidak bekerja pada sistem itu. : /
David Holm
1
@ labrinth Yang di Ubuntu berasal dari tahun 2002. Versi terbaru adalah dari tahun ini (2014 pada komentar ini). Saya harus mengkompilasinya dari sumber.
Barry Brown
4
HWUT memang menghasilkan rintisan yang dapat dikendalikan dari jarak jauh yang berguna jika Anda ingin menulis tes untuk modul yang berinteraksi dengan driver hardward. Driver itu, dalam banyak kasus tidak ada pada PC. Dokumentasi HWUT
Frank-Rene Schäfer
1
Menurut Check's Github Page , versi terbaru 0.11.0dirilis pada 17 Desember 2016 .
Mandeep Sandhu
164

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:

#include "myimplementationfile.c"
#include <gtest/gtest.h>

// Mock out external dependency on mylogger.o
void Logger_log(...){}

TEST(FactorialTest, Zero) {
    EXPECT_EQ(1, Factorial(0));
}

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 .

mikelong
sumber
17
Jangan membeli barang itu. buku prog. Itu tidak mengandung wawasan apa pun yang tidak ada dalam jawaban untuk pertanyaan ini.
Phil
3
Saya tahu C dan C ++ memiliki banyak tumpang tindih, tetapi itu tidak menurut saya sebagai ide yang baik untuk menggunakan pustaka pengujian C ++ ketika Anda memproduksi kode yang pada akhirnya akan dikompilasi dalam kompiler C.
Rafael Almeida
2
@RafaelAlmeida pada dasarnya saya setuju, apa yang saya tunjukkan di sini adalah jahitan preprosesor tanpa membungkus C termasuk dalam extern C. Terlepas dari itu saya menemukan C ++ cukup berguna sebagai bahasa deskripsi tes dalam praktek. Saya juga menulis kerangka kerja berbasis C untuk pengujian jadi saya tidak dogmatis tentang ini :-) github.com/meekrosoft/fff
mikelong
@Phil saya tidak setuju. Saya menemukan buku itu sangat berharga, terutama bagi seseorang yang tidak terlalu kuat di C.
CHendrix
Saya menggunakan Kerangka Fungsi Palsu untuk mengejek fungsi HAL, sebagaimana dinyatakan di atas. Ini bekerja sangat baik dengan gTest. github.com/meekrosoft/fff
Leonardo
135

Minunit adalah kerangka pengujian unit yang sangat sederhana. Saya menggunakannya untuk unit test c kode mikrokontroler untuk AVR.

Matteo Caprari
sumber
5
Saya tidak punya pengalaman dalam melakukan embedded system jadi saya tidak bisa mengomentari itu, tetapi untuk program C kecil (tugas sekolah, skrip) ini terlihat sempurna. Tautan bagus.
AndrewKS
3
@toasted_flakes Saya telah membuat ini menjadi inti github: gist.github.com/sam159/0849461161e86249f849
Sam
Ini cukup dekat dengan apa yang saya temukan sebelum saya mulai mencari di sini! Saya ingin mengotomatiskan pengujian sehingga TEST (funcname, body) membuat fungsi dan menyimpan pointer ke fungsi, tetapi sepertinya saya perlu melakukan beberapa pemrosesan eksternal.
Ben Kushigian
41

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:

  • file header disertakan di mana pun Anda menelepon rutinitas CuTest
  • satu file 'C' tambahan untuk dikompilasi / ditautkan ke dalam gambar
  • beberapa kode sederhana ditambahkan ke main untuk mengatur dan memanggil unit test - Saya hanya memiliki ini dalam fungsi main () khusus yang akan dikompilasi jika UNITTEST didefinisikan selama build.

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 ++.

Michael Burr
sumber
1
Saya akan memilih kedua untuk CuTest. Saya telah menggunakannya untuk mengembangkan homebrew di Nintendo DS dan tidak mengalami kesulitan untuk mengatur atau menggunakannya.
Theran
Saya akan ketiga ini. Saya mengunduhnya ketika versi 1.4 dan memodifikasinya untuk dibuang ke XML. Sepertinya ada versi 1.5 yang harus saya unduh dan lihat.
Taylor Harga
2
CuTest telah bekerja dengan baik bagi saya untuk menguji kode yang berjalan pada sistem QNX.
Jace Browning
Ia mengaku bekerja seperti JUnit, tapi sepertinya saya ketinggalan Beforedan Aftermenelepon. Secara keseluruhan, ini lucu.
Dragas
40

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).

Johan
sumber
5
Unity dikombinasikan dengan generasi tiruan otomatis menggunakan CMock cukup baik.
thegreendroid
dapatkah Anda menyarankan beberapa tutorial yang baik untuk cmock?
melwin_jose
Ada tutorial yang sangat bagus untuk CMock dan Unity, yang dirancang oleh Ceedling: dmitryfrank.com/articles/unit_testing_embedded_c_applications
Dmitry Frank
35

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:

#include <tap.h>

int main () {
    plan(5);

    ok(3 == 3);
    is("fnord", "eek", "two different strings not that way?");
    ok(3 <= 8732, "%d <= %d", 3, 8732);
    like("fnord", "f(yes|no)r*[a-f]$");
    cmp_ok(3, ">=", 10);

    done_testing();
}
lsmagalhaes
sumber
Saya menggulung sendiri libtap-setara saya untuk proyek saya sendiri, tetapi sekarang setelah saya tahu ini ada, saya tidak perlu lagi mempertahankan milik saya. Keren!
ephemient
1
ok(TESTING==IsSimple(), "libtap is super easy to use")
AShelly
26

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:

#include <stdarg.h>
#include <stddef.h>
#include <setjmp.h>
#include <cmocka.h>

/* A test case that does nothing and succeeds. */
static void null_test_success(void **state) {
    (void) state; /* unused */
}

int main(void) {
    const struct CMUnitTest tests[] = {
        cmocka_unit_test(null_test_success),
    };
    return cmocka_run_group_tests(tests, NULL, NULL);
}

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.

asn
sumber
3
Ketika saya melihat cmockery dan cmocka, dokumentasi terlihat mirip. Apakah proyek ini terkait?
Matt Friedman
6
cmocka adalah penerus cmockery. Saya sudah bercabang karena tidak dirawat.
asn
21

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.

Philippe A.
sumber
8
Anda harus melihat pada cmocka.org yang merupakan penerus cmockery!
asn
dapatkah Anda menyarankan beberapa tutorial yang baik untuk cmock?
melwin_jose
Mulailah dengan artikel LWN dan kemudian periksa direktori contoh cmocka.
asn
16

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 :)

chelmertz
sumber
Saya sangat terganggu oleh bug di fungsi is_spare () ... tapi terima kasih untuk tautannya! Saya kira TDD tidak menangkap SEMUA bug.
Jis Ben
Ini adalah pendekatan TDD paling sederhana yang pernah saya lihat untuk C, yang bisa Anda ikuti asserttanpa perpustakaan atau kerangka kerja tambahan. Saya pikir jika Anda hanya seorang pemula, ini bisa menjadi titik awal.
kabirbaidhya
16

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.

#include <cheat.h>

CHEAT_TEST(mathematics_still_work,
    cheat_assert(2 + 2 == 4);
    cheat_assert_not(2 + 2 == 5);
)

Tes dikompilasi menjadi sebuah executable yang menangani menjalankan tes dan melaporkan hasilnya.

$ gcc -I . tests.c
$ ./a.out
..
---
2 successful of 2 run
SUCCESS

Ini memiliki warna yang cantik juga.

Tuplanolla
sumber
Suara positif
12

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.

prakash
sumber
1
Saya mencoba embunitdan kecewa karenanya.
Craig McQueen
1
Misalnya melihat laporan bug yang saya kirimkan, serta laporan bug lain yang tidak bereaksi selama 3 tahun.
Craig McQueen
12

Saya tidak menggunakan framework, saya hanya menggunakan autotools "check" target support. Terapkan "utama" dan gunakan pernyataan (s).

Dir test saya Makefile.am terlihat seperti:

check_PROGRAMS = test_oe_amqp

test_oe_amqp_SOURCES = test_oe_amqp.c
test_oe_amqp_LDADD = -L$(top_builddir)/components/common -loecommon
test_oe_amqp_CFLAGS = -I$(top_srcdir)/components/common -static

TESTS = test_oe_amqp
navicore
sumber
2
Kami tidak menggunakan autotool (meskipun akan lebih baik untuk pindah di beberapa titik). Secara historis, saya telah menggunakan metode utama untuk tujuan pengujian dan itu bukan solusi yang buruk.
Paul Osborne
11

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.

Anuj Gupta
sumber
7

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.

ratkok
sumber
6

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

Zing-
sumber
Compiler yang Anda butuhkan mungkin c ++ tetapi kode yang Anda uji masih bisa C. CxxTest adalah kerangka kerja yang sangat mudah digunakan
David Sykes
6

selain bias jelas saya

http://code.google.com/p/seatest/

adalah cara sederhana yang bagus untuk menguji kode C unit. meniru xUnit

Keith Nicholas
sumber
5

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

Roberto Vargas Caballero
sumber
Saya sekarang menggunakan utest.h Anda dalam proyek saya. Bekerja dengan baik dan cukup membantu. Terima kasih!
Johan
4

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).

Paweł Hajdan
sumber
Apakah kerangka kerja Google akan bekerja dengan C murni? Pandangan sekilas ke halaman menunjukkan bahwa itu adalah kerangka C ++.
Dana
4
Google Test sangat baik, tetapi sangat banyak kerangka C ++. Ini cukup portabel dan dapat digunakan untuk menguji C jika Anda harus.
Josh Kelley
4

Cmockery adalah proyek yang baru diluncurkan yang terdiri dari pustaka C yang sangat mudah digunakan untuk menulis unit test.

Alejandro Bologna
sumber
Anda harus melihat pada cmocka.org yang merupakan penerus Cmockery.
asn
3

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).

Kevin
sumber
2

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.

Kwondri
sumber
6
Pertanyaannya adalah tentang C, bukan C ++
1800 INFORMASI
3
Tidak, tetapi C ++ dapat antarmuka ke perpustakaan C. Jadi mungkin sebenarnya baik-baik saja untuk menguji pustaka C menggunakan kerangka uji unit C ++. (Perusahaan saya melakukan hal itu dengan cara dan itu jauh lebih mudah daripada menggunakan kerangka uji unit C.)
Kevin
Saya melakukan hal yang sama. Kami memiliki pustaka utilitas yang ditulis dalam C yang kami gunakan di bawah kode C ++ dan bahasa scripting kami. Kami menggunakan CppUnit untuk tes dan itu bekerja dengan cukup baik karena kami dapat menggunakan kerangka kerja yang sama untuk C dan C ++.
Jyaan
2

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.

Gerhard
sumber
2

coba potong! - http://code.google.com/p/lcut

Tony Bai
sumber
3
Beberapa dokumentasi akan sangat membantu. Latar belakang dan tujuan proyek, daftar fitur, keunggulan dibandingkan alternatif yang ada, dll. Akan sangat membantu bagi orang yang memeriksanya untuk pertama kali.
Craig McQueen
2

API Sanity Checker - kerangka uji untuk pustaka C / C ++:

Generator otomatis pengujian unit dasar untuk pustaka C / C ++ bersama. Ia mampu menghasilkan input data yang masuk akal (dalam kebanyakan, tetapi sayangnya tidak semua kasus) parameter dan menyusun kasus uji sederhana ("kewarasan" atau "kualitas dangkal") untuk setiap fungsi dalam API melalui analisis deklarasi di header file.

Kualitas tes yang dihasilkan memungkinkan untuk memeriksa tidak adanya kesalahan kritis dalam kasus penggunaan sederhana. Alat ini mampu membangun dan menjalankan tes yang dihasilkan dan mendeteksi crash (segfaults), batal, semua jenis sinyal yang dipancarkan, kode pengembalian program tidak nol dan program menggantung.

Contoh:

aponomarenko
sumber
1

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.

quamrana
sumber
1

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 ...

bongo
sumber
1

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.

Keris
sumber
0

Jika Anda menargetkan platform Win32 atau mode kernel NT, Anda harus melihat cfix .

Johannes Passing
sumber
0

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.

Dushara
sumber