CUenota v C

Cuenota V C



Za izvajanje enotnega testiranja v C-ju se uporablja sistem CUnit, ki omogoča administracijo in izvajanje testov. Zajema raznolik nabor trditev za preizkušanje pogosto uporabljenih tipov podatkov in uporablja preprosto arhitekturo za ustvarjanje testnih struktur. Testna koda uporabnika je povezana s CUnit, ki je zasnovana kot statična knjižnica. Učinkovitost nalog in funkcij programa C lahko preverimo z uporabo testnega ogrodja CUnit. Vsaka posebna naloga programa C ima različne vhodne okoliščine in izhodne omejitve. Če želimo uporabiti CUnit za testiranje programa C, ga moramo najprej namestiti v naš sistem. Spodaj so opisani koraki za namestitev CUnit.

Kako uporabljati ogrodje CUnit v Ubuntu 22.04

Za uporabo ogrodja za testiranje CUnit v našem sistemu moramo slediti korakom namestitve. Ti koraki veljajo za sistem Ubuntu 22.04. Pred namestitvijo smo najprej posodobili naš sistem. Sistem je zahteval privilegij sudo za posodobitev z ukazom apt.








Za pridobitev privilegijev sudo je terminal zahteval avtentikacijo od uporabnika sudo. Nato posodobite sistemske pakete in njihove odvisnosti, kot je prikazano spodaj.




Zdaj smo z naslednjim ukazom namestili ogrodje CUnit. Ta ukaz lahko namesti pakete libcunitl, libcunitl-doc in libcunitl-dev iz repozitorija paketov.




Ko je ukaz za namestitev CUnit izveden, je potrebno uporabniško geslo. Osnovni paketi CUnit so bili nameščeni v naš Ubuntu 22.04.





Primer 1

V prejšnjem razdelku smo zaključili korak namestitve ogrodja CUnit. Zdaj smo preizkusili metodo vsote in razlike, da bi videli pričakovane rezultate v naslednjem primeru z uporabo ogrodja za testiranje CUnit.



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

int init_suite ( praznina ) { vrnitev 0 ; }
int clean_suite ( praznina ) { vrnitev 0 ; }

int MojaVsota ( ti si a1, ti si b1 )

{
int res1;
res1 =a1+b1;
vrnitev res1;
}

int MyDiff ( int a2, int b2 )

{
int res2;
res2 =a2-b2;
vrnitev res2;
}

void test_MySum ( praznina )
{
WITH_ASSERT ( 4 ==MojaVsota ( dva , dva ) ) ;
WITH_ASSERT ( 8 ==MojaVsota ( 5 , 3 ) ) ;
WITH_ASSERT ( dva ==MojaVsota ( - dva , 4 ) ) ;
WITH_ASSERT ( 7 ==MojaVsota ( 0 , 7 ) ) ;
}


void test_MyDiff ( praznina )
{
WITH_ASSERT ( 3 ==Moja razlika ( 5 , dva ) ) ;
WITH_ASSERT ( - 4 ==Moja razlika ( 4 , 8 ) ) ;
WITH_ASSERT ( - 7 ==Moja razlika ( - 3 , 4 ) ) ;
WITH_ASSERT ( - 9 ==Moja razlika ( 0 , 9 ) ) ;
}


int main ( praznina )
{

CU_pSuite pSuite1,pSuite2 = NULL;

če ( CUE_SUCCESS ! = CU_initialize_registry ( ) )
vrnitev CU_get_error ( ) ;

pSuite1 = CU_add_suite ( 'Testna zbirka 1' , init_suite, clean_suite ) ;
če ( NULL == pSuite1 ) {
CU_cleanup_registry ( ) ;
vrnitev CU_get_error ( ) ;
}

če ( ( NULL == CU_add_test ( pSuite1, ' \n \n Testiranje funkcije vsote \n \n ' , test_MySum ) ) )
{
CU_cleanup_registry ( ) ;
vrnitev CU_get_error ( ) ;
}

če ( ( NULL == CU_add_test ( pSuite1, ' \n \n Testiranje funkcije razlike \n \n ' , test_MyDiff ) ) )
{
CU_cleanup_registry ( ) ;
vrnitev CU_get_error ( ) ;
}

CU_basic_run_tests ( ) ;

CU_cleanup_registry ( ) ;
vrnitev CU_get_error ( ) ;
}







Najprej smo za ustvarjanje strukture CUnit vstavili knjižnico CUnit »CUnit/Basic.h« z vključeno ključno besedo. Ta knjižnica C je za ogrodja za testiranje enot in ponuja preprost izhodni vmesnik konzole. Nato smo našemu programu za testiranje dodali dve funkciji, »init_suite« za inicializacijo funkcije zbirke in »clean_suite« za čiščenje funkcije zbirke.

Nato smo izdelali metodi »MySum« in »MyDiff«, ki ju je testiral CUnit. Za te funkcije smo poklicali konstruktor, ki vsebuje spremenljivke, na katerih so bile izvedene operacije vsote in razlike. Nato smo vzpostavili funkcijo kot 'test_MySum' za testiranje. Znotraj funkcije smo uporabili metodo “CU_ASSERT”, kjer so dodeljeni začetni izrazi za vsoto. Enako kot »test_MySum« smo izdelali funkcijo test_MyDiff za testiranje izraza za različne operacije z uporabo metode »CU_ASSERT«.

Nato imamo kodo tekača CUnit znotraj glavne metode. Tu smo iz metode »CU_pSuite« ustvarili dva paketa, »pSuite1« in »pSuite2«, in tema paketoma dodelili vrednost NULL. Te pakete smo ustvarili za izvajanje testa CUnit, ki bi moral biti registriran v registru testov. Pred dodajanjem zbirk v »test_registry« smo ustvarili register in ga inicializirali s pogojem »if«. Uporabili smo metodo »CU_initialze_registry()« za ustvarjanje registra za testne pakete.

Po tem smo dodali pSuite1 v testni register s klicem metode »CU_add_suite« CUnit. Po tem smo dodali naša testa, 'test_MySum' in 'test_MyDiff', navedenim paketom z uporabo metode 'CU_add_test()'. Na koncu smo prikazali rezultate testa CUnit s klicem metode »CU_basic_run_tests()« in očistili register, ko so bili rezultati uspešno prikazani. Napako, ki se pojavi med izvajanjem preizkusov CUnit, bo sprožila funkcija »CU_get_error()«.

Prejšnja testna datoteka CUnit je shranjena kot datoteka mytest.c. To datoteko C smo izvedli z ukazom GCC. Uporabili smo zastavico -lcunit za izvajanje testne datoteke CUnit. S tem ukazom se naša koda prevede. Nato smo izvedli datoteko mytest in prikazala je pričakovane rezultate testa CUnit, saj so bili vsi testi opravljeni brez napak.

Primer 2

Imamo še en primer, kjer smo s pristopom CUnit preizkusili dve metodi ravnanja z datotekami, »fread« in »fprintf«. Začasno datoteko smo odprli in zaprli s testnimi funkcijami CUnit. Testne operacije CUnit testirajo funkcije knjižnice s pisanjem in branjem iz začasne datoteke.

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

statična DATOTEKA * mapa = NULL;
int init_suite1 ( praznina )
{
če ( NULL == ( mapa = fopen ( 'Moja datoteka.txt' , 'w +' ) ) ) {
vrnitev -1 ;
}
drugače {
vrnitev 0 ;
}
}

int clean_suite1 ( praznina )
{
če ( 0 ! = fclose ( mapa ) ) {
vrnitev -1 ;
}
drugače {
mapa = NULL;
vrnitev 0 ;
}
}


void test_fprintf ( praznina )
{
int x1 = 10 ;

če ( NIČ ! = mapa ) {
WITH_ASSERT ( dva == fprintf ( mapa , 'Q \n ' ) ) ;
WITH_ASSERT ( 7 == fprintf ( mapa , 'x1 = %d' , x1 ) ) ;
}
}

void test_fread ( praznina )
{
medpomnilnik nepodpisanih znakov [ dvajset ] ;

če ( NIČ ! = mapa ) {
previjanje nazaj ( mapa ) ;
WITH_ASSERT ( 9 == groza ( medpomnilnik, sizeof ( nepredpisan znak ) , dvajset , mapa ) ) ;
WITH_ASSERT ( 0 == strncmp ( medpomnilnik, 'Q \n x1 = 10' , 9 ) ) ;
}
}

int main ( )
{
CU_pSuite pSuite = NULL;
če ( CUE_SUCCESS ! = CU_initialize_registry ( ) )
vrnitev CU_get_error ( ) ;
pSuite = CU_add_suite ( 'Apartma1' , init_suite1, clean_suite1 ) ;
če ( NULL == pSuite ) {
CU_cleanup_registry ( ) ;
vrnitev CU_get_error ( ) ;
}
če ( ( NULL == CU_add_test ( pSuite, 'preizkus funkcije fprintf()' , test_fprintf ) ) ||
( NULL == CU_add_test ( pSuite, 'preizkus funkcije fread()' , test_fread ) ) )
{
CU_cleanup_registry ( ) ;
vrnitev CU_get_error ( ) ;
}
CU_basic_set_mode ( CU_BRM_VERBOSE ) ;
CU_basic_run_tests ( ) ;
CU_cleanup_registry ( ) ;
vrnitev CU_get_error ( ) ;
}







Znotraj datoteke glave smo definirali standardno knjižnico CUnit 'CUnit.h/Basic.h'. Nato smo »datoteko« razglasili kot kazalec na datoteko, ki jo uporabljajo testi. Nato smo izdelali funkcijo »init_suite1«, ki odpre začasno datoteko »MyFile.txt« in ob uspehu vrne vrednost nič; sicer bo vrnjena vrednost, ki ni enaka nič. Za zapiranje datoteke smo ustvarili funkcijo čiščenja zbirke, ki ob zapiranju začasne datoteke vrne tudi vrednost, ki ni enaka nič. V nasprotnem primeru se ob uspešnem zaprtju začasne datoteke pridobi vrednost nič. Nato smo preprosto implementirali funkcijo “test_fprintf”, kjer smo podatke vstavili v začasno datoteko “MYfile.txt”. Te testne funkcije so tudi preverile število bajtov, ki smo jih poskušali zapisati v datoteko.

Po tem smo ustvarili še eno funkcijo za funkcijo 'test_fread', da preizkusimo metodo fread. Tu smo s funkcijo »test_fprinf()« preverili, ali so določeni znaki prisotni v predhodno zapisanih podatkih. Nato imamo glavno funkcijo, kjer se obravnavajo nastavljeni in izvedeni testi. Definirali smo »pSuite« v glavni funkciji in inicializirali register s testno funkcijo »CU_initialize_resgistry«. Poklicali smo tudi funkcijo »CU_add_suite«, da dodamo zbirko v register in dodamo navedene teste v zbirko s pomočjo funkcije »CU_add_test«.

Osnovni testni vmesniki CUnit se na koncu uporabijo za prikaz rezultatov kode. Upoštevajte, da glavna funkcija vrne 'CUE_SUCCESS' ob uspešni izvedbi in drugo kodo 'CUnit_error' ob neuspešni izvedbi.

Izvedli smo prejšnjo kodo za test CUnit, ki je prikazal povzetek programa in sporočilo metode uspešnih preizkusov.

Zaključek

CUnit je temeljni okvir, ki ponuja različne uporabniške vmesnike. Omogoča nam upravljanje testnih zbirk, testnih primerov in testnih registrov. Uporabniški vmesniki olajšajo testiranje programov in ogled rezultatov teh testov. S tem člankom smo obravnavali testno ogrodje CUnit v C. Demonstrirali smo namestitev in nato implementirali dva delujoča programa v jeziku C. Prejšnji testirani programi so dali uspešne rezultate.