CUnit v C

Cunit V C



Na vykonávanie unit testovania v jazyku C sa používa systém CUnit, ktorý umožňuje administráciu a vykonávanie testov. Pokrýva rozmanitú škálu tvrdení na testovanie bežne používaných dátových typov a využíva jednoduchú architektúru na vytváranie testovacích štruktúr. Používateľský testovací kód je prepojený s CUnit, ktorá je navrhnutá ako statická knižnica. Môžeme preskúmať výkon úloh a funkcií programu C pomocou testovacieho rámca CUnit. Každá konkrétna úloha programu C má iné vstupné podmienky a výstupné obmedzenia. Ak chcete použiť CUnit na testovanie programu C, mali by sme ho najskôr nainštalovať do nášho systému. Kroky na inštaláciu CUnit sú uvedené nižšie.

Ako používať rámec CUnit v Ubuntu 22.04

Aby sme mohli v našom systéme využiť testovací rámec CUnit, musíme postupovať podľa inštalačných krokov. Tieto kroky platia pre systém Ubuntu 22.04. Pred inštaláciou sme najprv aktualizovali náš systém. Systém vyžadoval privilégium sudo na aktualizáciu pomocou príkazu apt.








Na získanie práv sudo terminál požiadal používateľa sudo o overenie. Potom aktualizujte systémové balíky a ich závislosti, ako je uvedené nižšie.




Teraz sme nainštalovali rámec CUnit pomocou nasledujúceho príkazu. Tento príkaz môže nainštalovať balíky libcunitl, libcunitl-doc a libcunitl-dev z úložiska balíkov.




Po vykonaní inštalačného príkazu CUnit sa vyžaduje heslo používateľa. Základné balíčky CUnit boli nainštalované v našom Ubuntu 22.04.





Príklad 1

Dokončili sme krok inštalácie rámca CUnit v predchádzajúcej časti. Teraz sme testovali metódu súčtu a rozdielu, aby sme v nasledujúcom príklade videli očakávané výsledky pomocou testovacieho rámca CUnit.



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

int init_suite ( neplatné ) { vrátiť 0 ; }
int clean_suite ( neplatné ) { vrátiť 0 ; }

int MySum ( si a1, si b1 )

{
int res1;
res1 =a1+b1;
vrátiť res1;
}

int MyDiff ( int a2, int b2 )

{
int res2;
res2 =a2-b2;
vrátiť res2;
}

void test_MySum ( neplatné )
{
WITH_ASSERT ( 4 ==MySum ( dva , dva ) ) ;
WITH_ASSERT ( 8 ==MySum ( 5 , 3 ) ) ;
WITH_ASSERT ( dva ==MySum ( - dva , 4 ) ) ;
WITH_ASSERT ( 7 ==MySum ( 0 , 7 ) ) ;
}


void test_MyDiff ( neplatné )
{
WITH_ASSERT ( 3 ==MyDiff ( 5 , dva ) ) ;
WITH_ASSERT ( - 4 ==MyDiff ( 4 , 8 ) ) ;
WITH_ASSERT ( - 7 ==MyDiff ( - 3 , 4 ) ) ;
WITH_ASSERT ( - 9 ==MyDiff ( 0 , 9 ) ) ;
}


int main ( neplatné )
{

CU_pSuite pSuite1,pSuite2 = NULL;

ak ( CUE_SUCCESS ! = CU_initialize_registry ( ) )
vrátiť CU_get_error ( ) ;

pSuite1 = CU_add_suite ( 'Testovací balík 1' , init_suite, clean_suite ) ;
ak ( NULL == pSuite1 ) {
CU_cleanup_registry ( ) ;
vrátiť CU_get_error ( ) ;
}

ak ( ( NULL == CU_add_test ( pSuite1, ' \n \n Testovanie funkcie súčtu \n \n ' , test_MySum ) ) )
{
CU_cleanup_registry ( ) ;
vrátiť CU_get_error ( ) ;
}

ak ( ( NULL == CU_add_test ( pSuite1, ' \n \n Diferenčná funkcia Testovanie \n \n ' , test_MyDiff ) ) )
{
CU_cleanup_registry ( ) ;
vrátiť CU_get_error ( ) ;
}

CU_basic_run_tests ( ) ;

CU_cleanup_registry ( ) ;
vrátiť CU_get_error ( ) ;
}







Najprv sme na vygenerovanie štruktúry CUnit vložili knižnicu CUnit „CUnit/Basic.h“ so zahrnutým kľúčovým slovom. Táto knižnica C je určená pre rámce testovania jednotiek a ponúka jednoduché výstupné rozhranie konzoly. Potom sme do nášho programu na testovanie pridali dve funkcie, „init_suite“ na inicializáciu funkcie balíka a „clean_suite“ na vyčistenie funkcie balíka.

Ďalej sme vytvorili metódy „MySum“ a „MyDiff“, ktoré budú testované CUnit. Pre tieto funkcie sme zavolali konštruktor, ktorý obsahuje premenné, s ktorými sa vykonali operácie súčtu a rozdielu. Ďalej sme vytvorili funkciu ako „test_MySum“ na testovanie. Vo vnútri funkcie sme použili metódu „CU_ASSERT“, kde sú priradené init výrazy pre súčet. Rovnako ako „test_MySum“, vytvorili sme funkciu test_MyDiff na testovanie výrazu pre rôzne operácie pomocou metódy „CU_ASSERT“.

Potom máme kód CUnit runner v hlavnej metóde. Tu sme vytvorili dve sady, „pSuite1“ a „pSuite2“, z metódy „CU_pSuite“ a priradili sme týmto suitám hodnotu NULL. Tieto sady sme vytvorili na vykonanie testu CUnit, ktorý by mal byť zaregistrovaný v registri testov. Pred pridaním balíkov do „test_registry“ sme vytvorili register a inicializovali sme ho s podmienkou „if“. Na vytvorenie registra na testovanie balíkov sme použili metódu „CU_initialze_registry()“.

Potom sme pridali pSuite1 do testovacieho registra vyvolaním metódy „CU_add_suite“ CUnit. Potom sme pridali naše testy „test_MySum“ a „test_MyDiff“ do špecifikovaných balíkov pomocou metódy „CU_add_test()“. Nakoniec sme zobrazili výsledky testu CUnit volaním metódy „CU_basic_run_tests()“ a po úspešnom zobrazení výsledkov sme vyčistili register. Chyba, ktorá sa vyskytla pri vykonávaní testov CUnit, bude vyvolaná funkciou „CU_get_error()“.

Predchádzajúci testovací súbor CUnit sa uloží ako súbor mytest.c. Tento súbor C sme spustili príkazom GCC. Na vykonanie testovacieho súboru CUnit sme použili príznak -lcunit. Pomocou tohto príkazu sa skompiluje náš kód. Potom sme spustili súbor mytest a ukázal očakávané výsledky testu CUnit, pretože všetky testy prešli bez akéhokoľvek zlyhania.

Príklad 2

Máme ďalší príklad, kde sme testovali dve metódy spracovania súborov, „fread“ a „fprintf“, prístupom CUnit. Dočasný súbor sme otvorili a zatvorili pomocou testovacích funkcií CUnit. Testovacie operácie CUnit testujú funkcie knižnice zapisovaním a čítaním z dočasného súboru.

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

statický SÚBOR * súbor = NULL;
int init_suite1 ( neplatné )
{
ak ( NULL == ( súbor = fopen ( 'MyFile.txt' , 'w +' ) ) ) {
vrátiť -1 ;
}
inak {
vrátiť 0 ;
}
}

int clean_suite1 ( neplatné )
{
ak ( 0 ! = fzavrieť ( súbor ) ) {
vrátiť -1 ;
}
inak {
súbor = NULL;
vrátiť 0 ;
}
}


void test_fprintf ( neplatné )
{
int x1 = 10 ;

ak ( NULOVÝ ! = súbor ) {
WITH_ASSERT ( dva == fprintf ( súbor , 'Q \n ' ) ) ;
WITH_ASSERT ( 7 == fprintf ( súbor , 'x1 = %d' , x1 ) ) ;
}
}

void test_fread ( neplatné )
{
unsigned char buffer [ dvadsať ] ;

ak ( NULOVÝ ! = súbor ) {
pretočiť späť ( súbor ) ;
WITH_ASSERT ( 9 == fred ( buffer, sizeof ( nepodpísaný char ) , dvadsať , súbor ) ) ;
WITH_ASSERT ( 0 == strncmp ( nárazník, 'Q \n x1 = 10' , 9 ) ) ;
}
}

int main ( )
{
CU_pSuite pSuite = NULL;
ak ( CUE_SUCCESS ! = CU_initialize_registry ( ) )
vrátiť CU_get_error ( ) ;
pSuite = CU_add_suite ( 'Suita1' , init_suite1, clean_suite1 ) ;
ak ( NULL == pSuite ) {
CU_cleanup_registry ( ) ;
vrátiť CU_get_error ( ) ;
}
ak ( ( NULL == CU_add_test ( pSuite, 'Test funkcie fprintf()' , test_fprintf ) ) ||
( NULL == CU_add_test ( pSuite, 'Test funkcie fread()' , test_fread ) ) )
{
CU_cleanup_registry ( ) ;
vrátiť CU_get_error ( ) ;
}
CU_basic_set_mode ( CU_BRM_VERBOSE ) ;
CU_basic_run_tests ( ) ;
CU_cleanup_registry ( ) ;
vrátiť CU_get_error ( ) ;
}







V hlavičkovom súbore sme definovali štandardnú knižnicu CUnit „CUnit.h/Basic.h“. Potom sme deklarovali „súbor“ ako ukazovateľ na súbor používaný v testoch. Ďalej sme vytvorili funkciu „init_suite1“, ktorá otvorí dočasný súbor „MyFile.txt“ a pri úspechu vráti hodnotu nula; v opačnom prípade sa vráti nenulová hodnota. Na zatvorenie súboru sme vytvorili funkciu čistenia balíka, ktorá tiež vráti nenulovú hodnotu pri zlyhaní pri zatváraní dočasného súboru. V opačnom prípade sa pri úspešnom zatvorení dočasného súboru získa nulová hodnota. Potom sme jednoducho implementovali funkciu „test_fprintf“, kde sme údaje vložili do dočasného súboru „MYfile.txt“. Tieto testovacie funkcie tiež overili počet bajtov, ktoré sme sa pokúsili zapísať do súboru.

Potom sme vytvorili ďalšiu funkciu pre funkciu „test_fread“ na testovanie metódy fread. Tu sme pomocou funkcie „test_fprinf()“ skontrolovali, či sú špecifikované znaky prítomné v predtým zapísaných údajoch. Potom máme hlavnú funkciu, kde sa spracovávajú nastavené a vykonané testy. Definovali sme „pSuite“ v hlavnej funkcii a inicializovali sme register pomocou testovacej funkcie „CU_initialize_resgistry“. Zavolali sme tiež funkciu „CU_add_suite“, aby sme pridali sadu do registra a pridali špecifikované testy do balíkov pomocou funkcie „CU_add_test“.

Na zobrazenie výsledkov kódu sa nakoniec používajú základné testovacie rozhrania CUnit. Všimnite si, že hlavná funkcia vráti „CUE_SUCCESS“ pri úspešnom vykonaní a iný kód „CUnit_error“ pri neúspešnom vykonaní.

Spustili sme predchádzajúci kód pre test CUnit, ktorý zobrazil zhrnutie programu a správu o metóde úspešných testov.

Záver

CUnit je základný rámec, ktorý poskytuje rôzne používateľské rozhrania. Umožňuje nám spravovať testovacie súpravy, testovacie prípady a testovacie registre. Testovanie programov a zobrazenie výsledkov týchto testov uľahčujú používateľské rozhrania. V tomto článku sme pokryli testovací rámec CUnit v jazyku C. Predviedli sme inštaláciu a následne implementovali dva spustené programy v jazyku C. Predchádzajúce testované programy priniesli úspešné výsledky.