it-swarm-tr.com

Birim Testi C Kodu

Gömülü bir sistem üzerinde bu yaz düz C ile yazıldım. Çalıştığım şirketin devraldığı mevcut bir projeydi. JUnit kullanarak Java'da birim testleri yazmaya oldukça alıştım, ancak sisteme eklenen yeni kodun yanı sıra mevcut kodlar için birim kodları test etmenin en iyi yolu olarak kaybettim.

Ünite testini düz C kodunu, örneğin JUnit ile Java kodunu test etmek kadar kolay hale getirmenin bir yolu var mı? Özellikle gömülü gelişim için geçerli olacak herhangi bir içgörü (arm-linux platformuna çapraz derleme) büyük ölçüde takdir edilecektir.

812
Paul Osborne

C'deki bir birim test çerçevesi Check ; C'deki birim test çerçevelerinin bir listesini bulabilirsiniz burada ve aşağıda çoğaltılmıştır. Çalışma zamanınızın kaç standart kitaplık işlevi bulunduğuna bağlı olarak, bunlardan birini kullanabilir veya kullanamayabilirsiniz.

AceUnit

AceUnit (Gelişmiş C ve Gömülü Birim), kendisini rahat bir C kod birimi test çerçevesi olarak faturalar. JUnit 4.x'i taklit etmeye çalışır ve yansıma benzeri yetenekleri içerir. AceUnit, kaynak kısıtlama ortamlarında, örneğin gömülü yazılım geliştirme ve en önemlisi, tek bir standart başlık dosyası içeremediğiniz ve ANSI/ISO C kütüphanelerinden tek bir standart C işlevini çağıramayacağınız ortamlarda iyi çalışır. Aynı zamanda bir Windows portuna sahiptir. Yazarlar böyle bir özellik eklemeye ilgi duyduklarını belirtmekle birlikte, sinyalleri yakalamak için çatal kullanmazlar. AceUnit anasayfası 'ya bakınız.

GNU Otomatik Birimi

Check ile aynı satırlar boyunca, ayrı bir adres alanındaki birim testlerini çalıştırmayı da içeren çatallar dahil (aslında, orijinal Check yazarı fikri GNU Autounit] 'den ödünç aldı. GNU Autounit, GLib'i yoğun bir şekilde kullanır; bu, bağlantı kurma ve bu gibi özel seçeneklere ihtiyaç duyduğu anlamına gelir, ancak bu, özellikle zaten GTK veya GLib kullanıyorsanız, bu sizin için büyük bir sorun olmayabilir. GNU Autounit anasayfası 'ya bakınız.

cUNIT

Ayrıca GLib kullanır, ancak birim testlerinin adres alanını korumak için çatal kullanmaz.

CUNIT

Win32 GUI uygulaması için planlar içeren standart C. Halen ünite testlerinin adres alanını doldurmaz veya korumaz. Erken gelişimde. CUnit ana sayfas 'a bakınız.

Şirin

Kaynak ağacınıza bıraktığınız yalnızca bir .c ve bir .h dosyası içeren basit bir çerçeve. CuTest ana sayfasını görün.

CppUnit

C++ için önde gelen birim test çerçevesi; C kodunu test etmek için de kullanabilirsiniz. Stabil, aktif olarak geliştirilmiş ve bir GUI arayüzüne sahiptir. CppUnit for C'yi kullanmamanın temel nedenleri ilk önce oldukça büyüktür ve ikincisi testlerinizi C++ ile yazmanız gerekir, bu da bir C++ derleyicisine ihtiyacınız olduğu anlamına gelir. Bunlar endişeye benzemiyorsa, diğer C++ ünite test çerçevelerinin yanı sıra kesinlikle dikkate değer. CppUnit anasayfası 'ya bakınız.

embUnit

embUnit (Embedded Unit) gömülü sistemler için başka bir birim test çerçevesidir. Bunun AceUnit tarafından değiştirildiği görülüyor. Gömülü Birim ana sayfası .

MinUnit

Minimal bir makro seti ve bu kadar! Mesele, kodunuzu test etmenin ne kadar kolay olduğunu göstermektir. MinUnit anasayfası 'ya bakınız.

Bay Ando için birim

Oldukça yeni ve görünüşe göre hala erken gelişimde olan bir CUnit uygulaması. Sayın Ando ana sayfası için bir birim bakın.

Bu liste en son Mart 2008'de güncellenmiştir.

Daha fazla çerçeve:

CMocka

CMocka, C için alay nesnelerini destekleyen bir test çerçevesidir. Kullanımı ve kurulumu kolaydır.

Bakınız CMocka ana sayfası .

Kriter

Kriter, otomatik test kaydını, parametreli hale getirilmiş testleri, teorileri destekleyen ve TAP ve JUnit XML de dahil olmak üzere birden fazla formata çıkabilen, platformlar arası bir C birimi test çerçevesidir. Her test kendi işleminde gerçekleştirilir, böylece sinyaller ve çökmeler gerekirse rapor edilebilir veya test edilebilir.

Daha fazla bilgi için Criterion homepage adresine bakın.

HWUT

HWUT, C'ye büyük destek veren genel bir Birim Test aracıdır. Makefiles oluşturmak, minimal 'yineleme tablolarında' kodlanmış büyük test durumları oluşturmak, durum makineleri boyunca yürümek, C-saplamalar oluşturmak ve daha pek çok şey için yardımcı olabilir. Genel yaklaşım oldukça benzersizdir: Kararlar 'iyi stdout/bad stdout' a dayanmaktadır. Karşılaştırma işlevi olsa da esnektir. Bu nedenle, kontrol için herhangi bir tipte komut dosyası kullanılabilir. Standart çıktı üretebilen herhangi bir dile uygulanabilir.

Bakınız HWUT anasayfası .

CGreen

C ve C++ için modern, taşınabilir, diller arası birim testi ve alaycı bir çerçeve. İsteğe bağlı bir BDD gösterimi, alaycı bir kütüphane, tek bir işlemde çalıştırma yeteneği (hata ayıklamayı kolaylaştırmak için) sunar. Test fonksiyonlarını otomatik olarak keşfeden bir test koşucusu mevcuttur. Ancak kendi programlarınızı kendiniz oluşturabilirsiniz.

Tüm bu özellikler (ve daha fazlası) CGreen kılavuzunda şeklinde açıklanmıştır.

Wikipedia, Birim test çerçevelerinin listesi: C altındaki C birimi test çerçevelerinin ayrıntılı bir listesini verir.

463
Adam Rosenfield

Minunit inanılmaz derecede basit bir birim test çerçevesidir. Ben avr için birim test c mikrodenetleyici kodunu kullanıyorum.

128
Matteo Caprari

Şu anda CuTest birim test çerçevesini kullanıyorum:

http://cutest.sourceforge.net/

Çok hafif ve basit olduğundan gömülü sistemler için idealdir. Hedef platformda ve masaüstünde çalışması için sorun yaşamadım. Ünite testleri yazmaya ek olarak, gereken tek şey:

  • cuTest yordamlarını çağırdığınız her yerde bulunan bir başlık dosyası
  • görüntüye derlenecek/bağlanacak tek bir ek 'C' dosyası
  • birim sınamalarını kurmak ve çağırmak için anaya bazı basit kodlar eklendi - Bunu, UNITTEST derleme sırasında tanımlanmışsa derlenen özel bir main () işlevinde yapıyorum.

Sistemin bir yığın ve bazı stdio işlevlerini (tüm yerleşik sistemlerde olmayan) desteklemesi gerekir. Ancak, platformunuzda yoksa kod bu gereksinimlere alternatif olarak çalışabilecek kadar basittir.

Extern "C" {} bloklarının bir kısmı akıllıca kullanıldığında, C++ 'ı test etmeyi de destekler.

40
Michael Burr

Neredeyse ratkok ile aynı diyorum ama birim testlerine gömülü bir dokunuşunuz varsa o zaman ...

nity - Ünite C kodu testi için tavsiye edilen çerçeve.

Kitapta bu konudaki örnekler gömülü C için TDD Birlik (ve CppUTest) kullanılarak yazılmıştır.

36
Johan

Ayrıca, Herşeyi Test Et Protokolü'nü (TAP) çıkaran bir C test çerçevesi olan libtap 'a bakmak ve böylece bu teknoloji için ortaya çıkan çeşitli araçlarla iyi bir şekilde bütünleşmek isteyebilirsiniz. Çoğunlukla dinamik dil dünyasında kullanılır, ancak kullanımı kolaydır ve çok popüler hale gelir.

Bir örnek:

#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();
}
32
Ovid

C ( cmocka ) denilen alaycı cisimleri destekleyen zarif bir birim test çerçevesi vardır. Yalnızca standart C kütüphanesini gerektirir, çeşitli bilgi işlem platformlarında (gömülü dahil) ve farklı derleyicilerle çalışır.

Ayrıca, Alt Ünite, Her Şey Testi Protokolü ve jUnit XML raporları gibi farklı ileti çıktı biçimlerini de destekler.

cmocka ayrıca gömülü platformlarda da çalışacak şekilde oluşturuldu ve Windows desteğine de sahip.

Basit bir test şöyle görünür:

#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);
}

API tamamen belgelenmiştir ve birkaç örnek kaynak kodunun bir parçasıdır.

Cmocka ile başlamak için LWN.net'teki makaleyi okumalısınız: C'de sahte nesnelerle birim testi

cmocka 1.0 Şubat 2015 tarihinde piyasaya sürüldü.

26
asn

İşlevleri alay etmenin bir yolunu aramaya başlamadan önce eski bir C uygulamasını test edemedim. Test etmek istediğim C dosyasını diğerlerinden ayırmak için kötü bir şekilde alay ettim. Ben bir cmock denedim ve benimseyeceğim.

Cmock başlık dosyalarını tarar ve bulduğu prototiplere dayanarak alay fonksiyonlarını oluşturur. Mocks, bir C dosyasını mükemmel bir izolasyonla test etmenize izin verir. Tek yapmanız gereken, test dosyanızı gerçek nesne dosyalarınız yerine alaylarla bağlamak.

Cmock'un bir diğer avantajı, alaylı fonksiyonlara geçirilen parametreleri doğrulayacağı ve alaycıların sağladığı dönüş değerini belirlemenize izin vermesidir. Bu, işlevlerinizdeki farklı işlem akışlarını test etmek için çok kullanışlıdır.

Testler, beklentilerinizi oluşturduğunuz tipik testA (), testB () işlevlerinden, test etmek ve test etmek için işlevlerden oluşur.

Son adım, birlik sınavlarınız için bir koşucu oluşturmaktır. Cmock birlik test çerçevesine bağlanır. Birlik, başka herhangi bir birim test çerçevesi kadar kolay öğrenilebilir.

Denemeye değer ve kavraması oldukça kolay:

http://sourceforge.net/apps/trac/cmock/wiki

Güncelleme 1

Araştırıyorum başka bir çerçeve Cmockery.

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

Ünite testini ve alayını destekleyen saf bir C çerçevesidir. Ruby'ye (Cmock'un aksine) bağımlılığı yoktur ve dış kütüphanelere çok az bağımlılığı vardır.

Kod oluşturmak için sahte olması için biraz daha manuel çalışma gerektirir. Bu, prototipler çok fazla değişmeyeceğinden, mevcut bir proje için çok fazla çalışmayı temsil etmiyor: alaylarınızı aldıktan sonra, bir süre onları değiştirmenize gerek kalmayacak (bu benim durumum). Ekstra yazım alayların tam kontrolünü sağlar. Sevmediğiniz bir şey varsa, sadece sahte alay değiştirin.

Özel bir test koşucusuna gerek yok. Sadece bir dizi test oluşturmanız ve bunu bir run_tests fonksiyonuna geçirmeniz yeterlidir. Burada biraz daha manuel çalışma da var ama kesinlikle bağımsız bir özerk çerçeve fikrini seviyorum.

Ayrıca bilmediğim bazı şık C numaralarını da içeriyor.

Genel Cmockery, başlamak için biraz daha fazla alay anlayışı gerektirir. Örnekler bunun üstesinden gelmenize yardımcı olmalıdır. Daha basit mekanikle işi yapabilir gibi görünüyor.

20
Philippe A.

Bir C acemisi olarak C 'de test edilen geliştirme denilen slaytları çok faydalı buldum. Temel olarak, herhangi bir harici bağımlılık olmadan bir mesaj iletmek için assert() standardını && ile birlikte kullanır. Birisi tam yığın test çerçevesine alışmışsa, bu muhtemelen işe yaramayacak :)

15
chelmertz

Bir çerçeve kullanmıyorum, yalnızca hedefleri "kontrol et" araçlarını kullanıyorum. Bir "main" uygulayın ve assert (ler) kullanın.

Test dir Makefile.am (lar) benziyor:

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
12
navicore

Var Birim

Ve ( Gömülü Birim Gömülü C Sistemi için birim test çerçevesidir. Tasarımı JUnit ve CUnit'ten ve daha birçok şeyden kopyalandı ve daha sonra Gömülü C Sistemine uyarlandı. Gömülü Ünite std C lib'leri gerektirmez. Tüm nesneler inşaat alanına tahsis edilmiştir.

Ve Tessy , gömülü yazılımın birim testini otomatikleştirir.

12
prakash

Kolay kullanım ve taşınabilirlik için CHEAT (barındırılan GitHub ) yazdık.

Bağımlılığı yoktur ve kurulum veya yapılandırma gerektirmez. Sadece bir başlık dosyası ve bir test durumu gereklidir.

#include <cheat.h>

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

Testler, testleri çalıştırma ve sonuçlarını raporlama ile ilgilenen bir yürütülebilir dosya olarak derlenir.

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

Çok güzel renkleri var.

12
Tuplanolla

Michael Feather'ın "Eski Kodla Etkili Çalışma" adlı kitabı, C geliştirme sırasında birim testlerine özgü birçok teknik sunuyor.

Bağımlılık enjeksiyonuyla ilgili başka hiçbir yerde görmediğim C'ye özgü teknikler var.

11

CppUTest - Ünite C kodu testi için şiddetle tavsiye edilen çerçeve.

Kitapta bu konudaki örnekler C gömülü C için TDD CppUTest kullanılarak yazılmıştır.

7
ratkok

bariz önyargım dışında

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

c kodunu test etmenin güzel ve basit bir yoludur. xUnit taklit eder

6
Keith Nicholas

Gömülü bir c/c ++ ortamı için CxxTest kullanıyorum (öncelikle C++).

CxxTest'i tercih ediyorum çünkü test çalıştırıcısını oluşturmak için bir Perl/python betiği var. Kurulum için küçük bir eğimden sonra (test çalıştırıcısını yazmak zorunda olmadığınızdan daha küçük), kullanımı oldukça kolaydır (örnekler ve kullanışlı belgeler içerir). En çok iş, kodun eriştiği 'donanımı' ayarlamaktı; Bundan sonra yeni birim test durumları eklemek kolaydır.

Daha önce de belirtildiği gibi bir C/C++ birim test çerçevesidir. Böylece bir C++ derleyicisine ihtiyacınız olacak.

CxxTest Kullanıcı KılavuzCxxTest Wiki

6
Zing-

Minunit okuduktan sonra, daha iyi bir yolun testi savunma sistemi tekniği gibi kullandığım assert makrosuna dayandırdığını düşündüm. Bu yüzden Minunit fikrini standart assert ile karıştırdım. Çerçevemi (iyi bir isim NoMinunit olabilir) k0ga'nın blog içinde görebilirsiniz.

Google'ın mükemmel test çerçevesi var. https://github.com/google/googletest/blob/master/googletest/docs/primer.md

Ve evet, gördüğüm kadarıyla düz C ile çalışacak, yani C++ özellikleri gerektirmiyor (C++ derleyicisi gerekebilir, emin değilim).

4
Paweł Hajdan
4
Landon Kuhn

Cmockery , birim testleri yazmak için C kütüphanesinin kullanımı çok basit olan, yeni başlatılan bir projedir.

4

İlk önce buraya bakın: http://en.wikipedia.org/wiki/List_of_unit_testing_frameworks#C

Şirketimin müşterilerimizin kullandığı bir C kütüphanesi var. Kodu test etmek için CxxTest (bir C++ birim test kütüphanesi) kullanıyoruz. CppUnit da işe yarayacak. C'ye takılı kalırsanız, RCUNIT'i öneririm (ancak CUnit de iyidir).

3
Kevin
2
Tony Bai

API Sanity Checker - C/C++ kütüphaneleri için test çerçevesi:

Otomatik bir temel birim üreteci, C/C++ kütüphanesi için testler yapar. Parametreler için makul (çoğu ama maalesef hiçbir durumda değil) girdi verileri üretebilir ve API'deki her işlev için başlıktaki bildirimlerin analizi yoluyla basit ("aklı" veya "sığ" kalite) test durumları oluşturabilir. Dosyalar.

Üretilen testlerin kalitesi, basit kullanım durumlarında kritik hataların bulunmadığını kontrol etmenizi sağlar. Bu araç, üretilen testler oluşturabilir ve uygulayabilir ve çökmeleri (segfaults), iptalleri, her türlü yayılan sinyali, sıfır olmayan program dönüş kodunu ve programın askıya alınmasını algılayabilir.

Örnekler:

2
linuxbuild

Hedefi denemeden önce PC'deki gömülü kod için bazı birim testleri yapmak için RCUNIT kullandım. İyi bir donanım arayüzü soyutlama başka önemli değil endianness ve hafıza eşlemeli kayıtları seni öldürecek.

2
Gerhard

JUnit'e aşina iseniz, CppUnit'i tavsiye ederim. http://cppunit.sourceforge.net/cppunit-wiki

Birim testleri yapmak için c ++ derleyiciniz olduğunu farz ediyorum. eğer öyleyse, Adam Rosenfield ile aynı fikirdeyim, istediğin kontrol bu.

2
Kwondri

LibU ( http://koanlogic.com/lib ) açık test paketi/vaka bağımlılıkları, test yalıtımı, paralel çalıştırma ve özelleştirilebilir bir rapor formatlayıcıya izin veren bir birim test modülüne sahiptir (varsayılan formatlar xml ve txt'dir) ).

Kütüphane BSD lisanslıdır ve pek çok faydalı modül içerir - ağ oluşturma, hata ayıklama, yaygın olarak kullanılan veri yapıları, konfigürasyon vb. - projelerinizde onlara ihtiyaç duyarsanız ...

1
bongo

Hiç kimsenin bahsetmediğine şaşırdım Cutter (http://cutter.sourceforge.net/) C ve C++ 'ı test edebilirsiniz, otomatik olarak otomatik araçlarla bütünleşir ve gerçekten güzel bir öğreticiye sahip).

1
Kris

Kullanılacak tekniklerden biri, birim test kodunu C++ xUnit çerçeveli (ve C++ derleyici) geliştirmek ve hedef sistemin kaynağını C modülleri olarak korumaktır.

C kaynağınızı çapraz derleyicinizin altında, mümkünse otomatik olarak birim testlerinizle otomatik olarak derleyin.

1
quamrana

Hala test çerçeveleri arayışındaysanız, CUnitWin32 , Win32/NT platformu içindir.

Bu, diğer test çerçevelerinde karşılaştığım bir temel sorunu çözdü. Yani genel/statik değişkenler deterministik bir durumdadır, çünkü her test ayrı bir işlem olarak yürütülür.

0
Dushara

Win32 platformlarını veya NT çekirdek modunu hedefliyorsanız, cfix 'e bir göz atmanız gerekir.

0
Johannes Passing

Sadece şunu yazdım Libcut mevcut C birimi test kitaplıkları ile ilgili sıkıntıdan. Otomatik tür ilkel dizilimi vardır (test_eq_int, test_eq_long, test_eq_short, vb ... gerek yok; ilkel ve dizgiler için sadece iki farklı küme var) ve tek bir başlık dosyasından oluşuyor. İşte kısa bir örnek:

#include <libcut.h>

LIBCUT_TEST(test_abc) {
    LIBCUT_TEST_EQ(1, 1);
    LIBCUT_TEST_NE(1, 0);
    LIBCUT_TEST_STREQ("abc", "abc");
    LIBCUT_TEST_STRNE("abc", "def");
}

LIBCUT_MAIN(test_abc);

Ancak, yalnızca C11 ile çalışır.

0
kirbyfan64sos