C'de CUnit

C De Cunit



CUnit sistemi, testlerin yönetimini ve yürütülmesini sağlayan C'de birim testi yapmak için kullanılır. Yaygın olarak kullanılan veri türlerini test etmek için çeşitli iddiaları kapsar ve test yapıları oluşturmak için basit bir mimari kullanır. Kullanıcının test kodu, statik bir kitaplık olarak tasarlanan CUnit ile bağlantılıdır. CUnit test çerçevesini kullanarak C programının görev ve işlevlerinin performansını inceleyebiliriz. C programının her belirli görevinin farklı girdi koşulları ve çıktı sınırlamaları vardır. CUnit'i C programını test etmek için kullanmak için önce sistemimize kurmalıyız. CUnit kurulum adımları aşağıda özetlenmiştir.

Ubuntu 22.04'te CUnit Çerçevesi Nasıl Kullanılır

CUnit test çerçevesini sistemimizde kullanabilmek için kurulum adımlarını takip etmemiz gerekiyor. Bu adımlar Ubuntu 22.04 sistemi için geçerlidir. Kurulumdan önce ilk olarak sistemimizi güncelledik. Sistemin apt komutuyla güncellenmesi için sudo ayrıcalığı gerekiyordu.








Sudo ayrıcalıkları elde etmek için terminal, sudo kullanıcısından kimlik doğrulamasını istedi. Ardından, aşağıda gösterildiği gibi sistem paketlerini ve bağımlılıklarını güncelleyin.




Şimdi aşağıdaki komutu kullanarak CUnit çerçevesini kurduk. Bu komut, paket deposundan libcunitl, libcunitl-doc ve libcunitl-dev paketlerini kurabilir.




CUnit kurulum komutu yürütüldüğünde, kullanıcı şifresi gereklidir. CUnit temel paketleri Ubuntu 22.04'e kuruldu.





örnek 1

Bir önceki bölümde CUnit framework kurulum adımını tamamlamıştık. Şimdi, CUnit test çerçevesini kullanarak aşağıdaki örnekte beklenen sonuçları görmek için toplam ve fark yöntemini test ettik.



#include
#include
#include
#include
#include 'CUnit/Basic.h'

int init_suite ( geçersiz ) { dönüş 0 ; }
int clean_suite ( geçersiz ) { dönüş 0 ; }

int Toplamım ( sen a1, sen b1'sin )

{
int res1;
res1 =a1+b1;
dönüş res1;
}

int MyDiff ( int a2, int b2 )

{
int res2;
res2 =a2-b2;
dönüş res2;
}

geçersiz test_MySum ( geçersiz )
{
WITH_ASSERT ( 4 ==Toplamım ( iki , iki ) ) ;
WITH_ASSERT ( 8 ==Toplamım ( 5 , 3 ) ) ;
WITH_ASSERT ( iki ==Toplamım ( - iki , 4 ) ) ;
WITH_ASSERT ( 7 ==Toplamım ( 0 , 7 ) ) ;
}


geçersiz test_MyDiff ( geçersiz )
{
WITH_ASSERT ( 3 ==MyDiff ( 5 , iki ) ) ;
WITH_ASSERT ( - 4 ==MyDiff ( 4 , 8 ) ) ;
WITH_ASSERT ( - 7 ==MyDiff ( - 3 , 4 ) ) ;
WITH_ASSERT ( - 9 ==MyDiff ( 0 , 9 ) ) ;
}


int ana ( geçersiz )
{

CU_pSuite pSuite1,pSuite2 = NULL;

eğer ( CUE_SUCCESS ! = CU_initialize_registry ( ) )
dönüş CU_get_hatası ( ) ;

pSuite1 = CU_add_suite ( 'Test Paketi1' , init_suite, clean_suite ) ;
eğer ( NULL == pSuite1 ) {
CU_cleanup_registry ( ) ;
dönüş CU_get_hatası ( ) ;
}

eğer ( ( NULL == CU_add_test ( pSuite1, ' \n \n Toplam fonksiyon testi \n \n ' , test_MySum ) ) )
{
CU_cleanup_registry ( ) ;
dönüş CU_get_hatası ( ) ;
}

eğer ( ( NULL == CU_add_test ( pSuite1, ' \n \n Fark fonksiyonu Testi \n \n ' , test_MyDiff ) ) )
{
CU_cleanup_registry ( ) ;
dönüş CU_get_hatası ( ) ;
}

CU_basic_run_testleri ( ) ;

CU_cleanup_registry ( ) ;
dönüş CU_get_hatası ( ) ;
}







İlk olarak, CUnit yapısını oluşturmak için, içerdiği anahtar kelime ile “CUnit/Basic.h” CUnit kütüphanesini ekledik. Bu C kitaplığı, birim test çerçeveleri içindir ve basit bir konsol çıktı arabirimi sunar. Ardından test programımıza suite fonksiyonunun başlatılması için “init_suite” ve suite fonksiyonunun temizlenmesi için “clean_suite” olmak üzere iki fonksiyon ekledik.

Ardından, CUnit tarafından test edilecek “MySum” ve “MyDiff” yöntemlerini oluşturduk. Toplam ve fark işlemlerinin yapıldığı değişkenleri tutan bu fonksiyonlar için kurucuyu çağırdık. Daha sonra test etmek için “test_MySum” olarak bir fonksiyon kurduk. Fonksiyonun içinde, toplam için init ifadelerinin atandığı “CU_ASSERT” yöntemini kullandık. “test_MySum” ile aynı şekilde, “CU_ASSERT” yöntemini kullanarak ifadeyi farklı işlemler için test etmek için test_MyDiff fonksiyonunu oluşturduk.

Ardından, ana yöntemin içinde CUnit koşucu kodumuz var. Burada “CU_pSuite” yönteminden “pSuite1” ve “pSuite2” olmak üzere iki süit oluşturduk ve bu süitlere NULL değeri atadık. Bu paketleri, test kayıt defterine kaydedilmesi gereken CUnit testini yürütmek için oluşturduk. Suitleri “test_registry”ye eklemeden önce kayıt defterini oluşturduk ve “if koşulu” ile başlattık. Test takımları için kayıt oluşturmak için “CU_initialze_registry()” yöntemini kullandık.

Daha sonra CUnit'in “CU_add_suite” yöntemini çağırarak pSuite1'i test kayıt defterine ekledik. Daha sonra “CU_add_test()” yöntemini kullanarak testlerimizi “test_MySum” ve “test_MyDiff”i belirtilen suitelere ekledik. Sonunda “CU_basic_run_tests()” yöntemini çağırarak CUnit testinin sonuçlarını görüntüledik ve sonuçlar başarılı bir şekilde görüntülendiğinde kayıt defterini temizledik. CUnit testleri yapılırken karşılaşılan hata “CU_get_error()” fonksiyonu tarafından atılacaktır.

Önceki CUnit test dosyası, mytest.c dosyası olarak kaydedilir. Bu C dosyasını GCC komutu ile çalıştırdık. CUnit test dosyasının yürütülmesi için -lcunit bayrağını kullandık. Bu komut ile kodumuz derlenmiştir. Ardından mytest dosyasını çalıştırdık ve tüm testler hatasız geçtiği için CUnit testinin beklenen sonuçlarını gösterdi.

Örnek 2

CUnit yaklaşımıyla “fread” ve “fprintf” olmak üzere iki dosya işleme yöntemini test ettiğimiz başka bir örneğimiz var. CUnit test fonksiyonlarını kullanarak geçici dosyayı açıp kapattık. CUnit test işlemleri, geçici dosyadan yazıp okuyarak kitaplık işlevlerini test eder.

#include
#include
#include
#include
#include 'CUnit/Basic.h'

statik DOSYA * dosya = BOŞ;
int init_suite1 ( geçersiz )
{
eğer ( BOŞ == ( dosya = fopen ( 'Dosyam.txt' , 'w +' ) ) ) {
dönüş -1 ;
}
başka {
dönüş 0 ;
}
}

int clean_suite1 ( geçersiz )
{
eğer ( 0 ! = fclose ( dosya ) ) {
dönüş -1 ;
}
başka {
dosya = BOŞ;
dönüş 0 ;
}
}


geçersiz test_fprintf ( geçersiz )
{
int x1 = 10 ;

eğer ( HÜKÜMSÜZ ! = dosya ) {
WITH_ASSERT ( iki == fprintf ( dosya , 'Q \n ' ) ) ;
WITH_ASSERT ( 7 == fprintf ( dosya , 'x1 = %d' , x1 ) ) ;
}
}

geçersiz test_fread ( geçersiz )
{
imzasız karakter arabelleği [ yirmi ] ;

eğer ( HÜKÜMSÜZ ! = dosya ) {
geri sarma ( dosya ) ;
WITH_ASSERT ( 9 == korku ( arabellek, sizeof ( imzasız karakter ) , yirmi , dosya ) ) ;
WITH_ASSERT ( 0 == strncmp ( tampon, 'Q \n x1 = 10' , 9 ) ) ;
}
}

int ana ( )
{
CU_pSuite pSuite = NULL;
eğer ( CUE_SUCCESS ! = CU_initialize_registry ( ) )
dönüş CU_get_hatası ( ) ;
pSuite = CU_add_suite ( 'Süit1' , init_suite1, clean_suite1 ) ;
eğer ( NULL == pSuite ) {
CU_cleanup_registry ( ) ;
dönüş CU_get_hatası ( ) ;
}
eğer ( ( NULL == CU_add_test ( p Suite, 'fprintf() fonksiyon Testi' , test_fprintf ) ) ||
( NULL == CU_add_test ( p Suite, 'fread() fonksiyon Testi' , test_fread ) ) )
{
CU_cleanup_registry ( ) ;
dönüş CU_get_hatası ( ) ;
}
CU_basic_set_mode ( CU_BRM_VERBOSE ) ;
CU_basic_run_testleri ( ) ;
CU_cleanup_registry ( ) ;
dönüş CU_get_hatası ( ) ;
}







Başlık dosyası içerisinde CUnit standart kitaplığı “CUnit.h/Basic.h” tanımladık. Ardından, testler tarafından kullanılan dosyaya bir işaretçi olarak “file” ilan ettik. Ardından, “MyFile.txt” geçici dosyasını açan ve başarı durumunda sıfır değerini döndüren “init_suite1” fonksiyonunu oluşturduk; aksi takdirde sıfır olmayan bir değer döndürülür. Dosyayı kapatmak için, geçici dosyayı kapatırken hata durumunda sıfır olmayan bir değer de döndüren takım temizleme işlevini oluşturduk. Aksi takdirde, geçici dosya başarıyla kapatıldığında sıfır değeri elde edilir. Ardından, verileri geçici “MYfile.txt” dosyasına eklediğimiz “test_fprintf” fonksiyonunu basitçe uyguladık. Bu test işlevleri, dosyaya yazmaya çalıştığımız bayt sayısını da doğruladı.

Daha sonra fread metodunu test etmek için “test_fread” fonksiyonu için bir fonksiyon daha oluşturduk. Burada “test_fprinf()” fonksiyonu ile önceden yazılan verilerde belirtilen karakterlerin mevcut olup olmadığını kontrol ettik. Ardından, kurulan ve yürütülen testlerin işlendiği ana fonksiyona sahibiz. Ana fonksiyonda “pSuite” tanımladık ve “CU_initialize_resgistry” test fonksiyonunu kullanarak kayıt defterini başlattık. Suite'i kayıt defterine eklemek için “CU_add_suite” fonksiyonunu da çağırdık ve belirtilen testleri “CU_add_test” fonksiyonu yardımıyla suitelere ekledik.

Sonunda kodun sonuçlarını görüntülemek için temel CUnit test arayüzleri kullanılır. Ana işlevin başarılı yürütme durumunda bir 'CUE_SUCCESS' ve başarısız yürütme durumunda farklı bir 'CUnit_error' kodu döndürdüğünü unutmayın.

Program özetini ve başarılı testlerin yöntem mesajını görüntüleyen CUnit testi için önceki kodu çalıştırdık.

Çözüm

CUnit, çeşitli kullanıcı arayüzleri sağlayan çekirdek bir çerçevedir. Test takımlarını, test senaryolarını ve test kayıtlarını yönetmemizi sağlar. Programları test etmek ve bu testlerin sonuçlarını görmek, kullanıcı arayüzleri ile kolaylaştırılmıştır. Bu makale ile C'deki CUnit test çerçevesini ele aldık. Kurulumu gösterdik ve ardından çalışan iki programı C dilinde uyguladık. Test edilen önceki programlar başarılı sonuçlar vermiştir.