Jedinica u C

Jedinica U C



Za izvođenje jediničnog testiranja u C-u koristi se sustav CUnit koji omogućuje administraciju i izvođenje testova. Pokriva raznolik raspon tvrdnji za testiranje često korištenih tipova podataka i koristi jednostavnu arhitekturu za stvaranje testnih struktura. Korisnički kod za testiranje povezan je s CUnitom, koji je dizajniran kao statična biblioteka. Možemo ispitati izvedbu zadataka i funkcija programa C pomoću okvira za testiranje CUnit. Svaki pojedini zadatak C programa ima različite ulazne okolnosti i izlazna ograničenja. Da bismo koristili CUnit za testiranje C programa, prvo bismo ga trebali instalirati u naš sustav. Koraci za instaliranje CUnita navedeni su u nastavku.

Kako koristiti CUnit Framework u Ubuntu 22.04

Da bismo koristili okvir za testiranje CUnit u našem sustavu, moramo slijediti korake instalacije. Ovi se koraci odnose na sustav Ubuntu 22.04. Prije instalacije prvo smo ažurirali naš sustav. Sustav je zahtijevao sudo privilegiju za ažuriranje pomoću naredbe apt.








Kako bi dobio sudo privilegije, terminal je tražio autentifikaciju od sudo korisnika. Zatim ažurirajte pakete sustava i njihove ovisnosti, kao što je prikazano u nastavku.




Sada smo instalirali okvir CUnit pomoću sljedeće naredbe. Ova naredba može instalirati pakete libcunitl, libcunitl-doc i libcunitl-dev iz repozitorija paketa.




Nakon što se izvrši instalacijska naredba CUnit, potrebna je korisnička lozinka. Osnovni paketi CUnit instalirani su u našem Ubuntu 22.04.





Primjer 1

Dovršili smo korak instalacije okvira CUnit u prethodnom odjeljku. Sada smo testirali metodu zbroja i razlike kako bismo vidjeli očekivane rezultate u sljedećem primjeru koristeći okvir za testiranje CUnit.



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

int init_suite ( poništiti ) { povratak 0 ; }
int clean_suite ( poništiti ) { povratak 0 ; }

int MySum ( ti si a1, ti si b1 )

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

int MyDiff ( int a2, int b2 )

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

void test_MySum ( poništiti )
{
WITH_ASSERT ( 4 ==Moj Zbroj ( dva , dva ) ) ;
WITH_ASSERT ( 8 ==Moj Zbroj ( 5 , 3 ) ) ;
WITH_ASSERT ( dva ==Moj Zbroj ( - dva , 4 ) ) ;
WITH_ASSERT ( 7 ==Moj Zbroj ( 0 , 7 ) ) ;
}


void test_MyDiff ( poništiti )
{
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 glavni ( poništiti )
{

CU_pSuite pSuite1,pSuite2 = NULL;

ako ( CUE_SUCCESS ! = CU_initialize_registar ( ) )
povratak CU_get_error ( ) ;

pSuite1 = CU_add_suite ( 'Test paket 1' , init_suite, clean_suite ) ;
ako ( NULL == pSuite1 ) {
CU_cleanup_registar ( ) ;
povratak CU_get_error ( ) ;
}

ako ( ( NULL == CU_add_test ( pSuite1, ' \n \n Ispitivanje funkcije zbroja \n \n ' , test_MySum ) ) )
{
CU_cleanup_registar ( ) ;
povratak CU_get_error ( ) ;
}

ako ( ( NULL == CU_add_test ( pSuite1, ' \n \n Ispitivanje funkcije razlike \n \n ' , test_MyDiff ) ) )
{
CU_cleanup_registar ( ) ;
povratak CU_get_error ( ) ;
}

CU_osnovni_testovi_pokretanja ( ) ;

CU_cleanup_registar ( ) ;
povratak CU_get_error ( ) ;
}







Prvo, da bismo generirali CUnit strukturu, umetnuli smo CUnit biblioteku “CUnit/Basic.h” s uključenom ključnom riječi. Ova C biblioteka je za okvire za jedinično testiranje i nudi jednostavno izlazno sučelje konzole. Zatim smo našem programu za testiranje dodali dvije funkcije, 'init_suite' za inicijalizaciju funkcije paketa i 'clean_suite' za čišćenje funkcije paketa.

Zatim smo konstruirali metode, 'MySum' i 'MyDiff', koje će testirati CUnit. Pozvali smo konstruktor za ove funkcije, koji sadrži varijable na kojima su izvršene operacije zbroja i razlike. Zatim smo uspostavili funkciju kao 'test_MySum' za testiranje. Unutar funkcije upotrijebili smo metodu 'CU_ASSERT', gdje se dodjeljuju početni izrazi za zbroj. Kao i 'test_MySum', konstruirali smo funkciju test_MyDiff za testiranje izraza za različite operacije pomoću metode 'CU_ASSERT'.

Zatim, imamo CUnit runner kod unutar glavne metode. Ovdje smo stvorili dva paketa, “pSuite1” i “pSuite2”, iz metode “CU_pSuite” i tim paketima dodijelili vrijednost NULL. Napravili smo ove pakete za izvođenje CUnit testa koji bi trebao biti registriran u registru testova. Prije dodavanja paketa u 'test_registry', stvorili smo registar i inicijalizirali ga 'if uvjetom'. Koristili smo metodu “CU_initialze_registry()” za stvaranje registra za testiranje paketa.

Nakon toga, dodali smo pSuite1 testnom registru pozivanjem metode “CU_add_suite” CUnita. Nakon toga, dodali smo naše testove, 'test_MySum' i 'test_MyDiff', navedenim paketima korištenjem metode 'CU_add_test()'. Na kraju smo prikazali rezultate CUnit testa pozivanjem metode “CU_basic_run_tests()” i očistili registar nakon što su rezultati uspješno prikazani. Funkcija 'CU_get_error()' izbacit će pogrešku do koje je došlo tijekom izvođenja CUnit testova.

Prethodna testna datoteka CUnit sprema se kao datoteka mytest.c. Izvršili smo ovu C datoteku s GCC naredbom. Koristili smo oznaku -lcunit za izvođenje testne datoteke CUnit. Ovom naredbom kompajlira se naš kod. Zatim smo izvršili datoteku mytest i ona je pokazala očekivane rezultate testa CUnit jer su svi testovi prošli bez ikakvih grešaka.

Primjer 2

Imamo još jedan primjer gdje smo testirali dvije metode rukovanja datotekama, 'fread' i 'fprintf', pristupom CUnit. Otvorili smo i zatvorili privremenu datoteku pomoću testnih funkcija CUnit. CUnit testne operacije testiraju funkcije knjižnice pisanjem i čitanjem iz privremene datoteke.

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

statička DATOTEKA * datoteka = NULL;
int init_suite1 ( poništiti )
{
ako ( NULL == ( datoteka = fopen ( 'Moja datoteka.txt' , 'w +' ) ) ) {
povratak -1 ;
}
drugo {
povratak 0 ;
}
}

int clean_suite1 ( poništiti )
{
ako ( 0 ! = fclose ( datoteka ) ) {
povratak -1 ;
}
drugo {
datoteka = NULL;
povratak 0 ;
}
}


void test_fprintf ( poništiti )
{
int x1 = 10 ;

ako ( NULL ! = datoteka ) {
WITH_ASSERT ( dva == fprintf ( datoteka , 'P \n ' ) ) ;
WITH_ASSERT ( 7 == fprintf ( datoteka , 'x1 = %d' , x1 ) ) ;
}
}

void test_fread ( poništiti )
{
međuspremnik bez potpisa [ dvadeset ] ;

ako ( NULL ! = datoteka ) {
premotati ( datoteka ) ;
WITH_ASSERT ( 9 == strah ( međuspremnik, veličinaof ( unsigned char ) , dvadeset , datoteka ) ) ;
WITH_ASSERT ( 0 == strncmp ( pufer, 'P \n x1 = 10' , 9 ) ) ;
}
}

int glavni ( )
{
CU_pSuite pSuite = NULL;
ako ( CUE_SUCCESS ! = CU_initialize_registar ( ) )
povratak CU_get_error ( ) ;
pSuite = CU_add_suite ( 'Apartman1' , init_suite1, clean_suite1 ) ;
ako ( NULL == pSuite ) {
CU_cleanup_registar ( ) ;
povratak CU_get_error ( ) ;
}
ako ( ( NULL == CU_add_test ( pSuite, 'fprintf() test funkcije' , test_fprintf ) ) ||
( NULL == CU_add_test ( pSuite, 'fread() test funkcije' , test_fread ) ) )
{
CU_cleanup_registar ( ) ;
povratak CU_get_error ( ) ;
}
CU_basic_set_mode ( CU_BRM_VERBOSE ) ;
CU_osnovni_testovi_pokretanja ( ) ;
CU_cleanup_registar ( ) ;
povratak CU_get_error ( ) ;
}







Unutar datoteke zaglavlja definirali smo CUnit standardnu ​​biblioteku “CUnit.h/Basic.h”. Zatim smo deklarirali 'file' kao pokazivač na datoteku koju koriste testovi. Zatim smo konstruirali funkciju “init_suite1” koja otvara privremenu datoteku “MyFile.txt” i vraća vrijednost nula u slučaju uspjeha; inače će biti vraćena vrijednost različita od nule. Da bismo zatvorili datoteku, stvorili smo funkciju čišćenja paketa, koja također vraća vrijednost različitu od nule u slučaju kvara tijekom zatvaranja privremene datoteke. Inače, nakon uspješnog zatvaranja privremene datoteke, dobiva se nula vrijednost. Zatim smo jednostavno implementirali funkciju “test_fprintf” gdje smo umetnuli podatke u privremenu datoteku “MYfile.txt”. Ove testne funkcije također su potvrdile broj bajtova koje smo pokušali upisati u datoteku.

Nakon toga izradili smo još jednu funkciju za funkciju 'test_fread' za testiranje metode fread. Ovdje smo funkcijom 'test_fprinf()' provjerili jesu li navedeni znakovi prisutni u prethodno zapisanim podacima. Zatim imamo glavnu funkciju u kojoj se rukuje postavljenim i izvršenim testovima. Definirali smo “pSuite” u glavnoj funkciji i inicijalizirali registar pomoću testne funkcije “CU_initialize_resgistry”. Također smo pozvali funkciju “CU_add_suite” za dodavanje paketa u registar i dodali navedene testove u pakete uz pomoć funkcije “CU_add_test”.

Osnovna CUnit testna sučelja koriste se na kraju za prikaz rezultata koda. Imajte na umu da glavna funkcija vraća 'CUE_SUCCESS' nakon uspješnog izvođenja i drugačiji kod 'CUnit_error' nakon neuspješnog izvođenja.

Pokrenuli smo prethodni kod za CUnit test, koji je prikazao sažetak programa i poruku metode uspješnog testiranja.

Zaključak

CUnit je temeljni okvir koji pruža različita korisnička sučelja. Omogućuje nam upravljanje testnim paketima, testnim slučajevima i testnim registrima. Testiranje programa i pregled rezultata tih testova olakšavaju korisnička sučelja. Ovim smo člankom pokrili CUnit okvir za testiranje u C-u. Demonstrirali smo instalaciju, a zatim implementirali dva pokrenuta programa u C jeziku. Dosadašnji testirani programi dali su uspješne rezultate.