CUnit i C

Cunit I C



CUnit-systemet används för att utföra enhetstesten i C, vilket möjliggör administration och genomförande av testerna. Den täcker en mängd olika påståenden för att testa vanliga datatyper och använder en enkel arkitektur för att skapa teststrukturer. Användarens testkod är kopplad till CUnit, som är utformat som ett statiskt bibliotek. Vi kan undersöka prestandan för C-programmets uppgifter och funktioner med hjälp av CUnit-testramverket. Varje särskild uppgift i C-programmet har olika ingångsförhållanden och utmatningsbegränsningar. För att använda CUnit för att testa C-programmet bör vi installera det först i vårt system. Stegen för att installera CUnit beskrivs nedan.

Hur man använder CUnit-ramverket i Ubuntu 22.04

För att använda CUnit-testramverket i vårt system måste vi följa installationsstegen. Dessa steg gäller för Ubuntu 22.04-systemet. Innan installationen uppdaterade vi först vårt system. Systemet krävde sudo-behörighet för att uppdateras med kommandot apt.








För att få sudo-privilegier bad terminalen autentiseringen från sudo-användaren. Uppdatera sedan systempaketen och deras beroenden, som visas nedan.




Nu har vi installerat CUnit-ramverket genom att använda följande kommando. Detta kommando kan installera paketen libcunitl, libcunitl-doc och libcunitl-dev från paketförrådet.




När installationskommandot för CUnit har utförts krävs användarlösenordet. CUnit väsentliga paket har installerats i vår Ubuntu 22.04.





Exempel 1

Vi slutförde installationssteget för CUnit-ramverket i föregående avsnitt. Nu har vi testat summa- och skillnadsmetoden för att se de förväntade resultaten i följande exempel med hjälp av CUnit-testramverket.



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

int init_suite ( tomhet ) { lämna tillbaka 0 ; }
int clean_suite ( tomhet ) { lämna tillbaka 0 ; }

int MySum ( du är a1, du är b1 )

{
int res1;
res1 =a1+bl;
lämna tillbaka resl;
}

int MyDiff ( int a2, int b2 )

{
int res2;
res2 =a2-b2;
lämna tillbaka res2;
}

void test_MySum ( tomhet )
{
WITH_ASSERT ( 4 ==Min Summa ( två , två ) ) ;
WITH_ASSERT ( 8 ==Min Summa ( 5 , 3 ) ) ;
WITH_ASSERT ( två ==Min Summa ( - två , 4 ) ) ;
WITH_ASSERT ( 7 ==Min Summa ( 0 , 7 ) ) ;
}


void test_MyDiff ( tomhet )
{
WITH_ASSERT ( 3 ==MyDiff ( 5 , två ) ) ;
WITH_ASSERT ( - 4 ==MyDiff ( 4 , 8 ) ) ;
WITH_ASSERT ( - 7 ==MyDiff ( - 3 , 4 ) ) ;
WITH_ASSERT ( - 9 ==MyDiff ( 0 , 9 ) ) ;
}


int main ( tomhet )
{

CU_pSuite pSuite1,pSuite2 = NULL;

om ( CUE_SUCCESS ! = CU_initialize_registry ( ) )
lämna tillbaka CU_get_error ( ) ;

pSuite1 = CU_add_suite ( 'Testsvit1' , init_suite, clean_suite ) ;
om ( NULL == pSuite1 ) {
CU_cleanup_registry ( ) ;
lämna tillbaka CU_get_error ( ) ;
}

om ( ( NULL == CU_add_test ( pSuite1, ' \n \n Summa funktionstestning \n \n ' , test_MySum ) ) )
{
CU_cleanup_registry ( ) ;
lämna tillbaka CU_get_error ( ) ;
}

om ( ( NULL == CU_add_test ( pSuite1, ' \n \n Skillnad funktion Testning \n \n ' , test_MyDiff ) ) )
{
CU_cleanup_registry ( ) ;
lämna tillbaka CU_get_error ( ) ;
}

CU_basic_run_tests ( ) ;

CU_cleanup_registry ( ) ;
lämna tillbaka CU_get_error ( ) ;
}







Först, för att generera CUnit-strukturen, har vi infogat CUnit-biblioteket 'CUnit/Basic.h' med det inkluderade nyckelordet. Detta C-bibliotek är avsett för ramverk för enhetstestning och erbjuder ett enkelt gränssnitt för konsolutgång. Sedan la vi till två funktioner, 'init_suite' för initiering av svitfunktionen och 'clean_suite' för rensningen av svitfunktionen, till vårt program för testning.

Därefter konstruerade vi metoder, 'MySum' och 'MyDiff', som skulle testas av CUnit. Vi har kallat konstruktorn för dessa funktioner, som innehåller de variabler som summa- och differensoperationer har utförts på. Därefter har vi etablerat en funktion som 'test_MySum' för att testa. Inuti funktionen har vi använt metoden 'CU_ASSERT', där init-uttrycken för summan tilldelas. Samma som 'test_MySum', vi har konstruerat test_MyDiff-funktionen för att testa uttrycket för olika operationer med metoden 'CU_ASSERT'.

Sedan har vi CUnit löparkoden i huvudmetoden. Här har vi skapat två sviter, 'pSuite1' och 'pSuite2', från metoden 'CU_pSuite' och tilldelat dessa sviter ett NULL-värde. Vi har skapat dessa sviter för att utföra CUnit-testet som ska registreras i testregistret. Innan vi lade till sviterna i 'test_registry' skapade vi registret och initierade det med 'if condition'. Vi har använt metoden 'CU_initialze_registry()' för att skapa registret för testsviter.

Efter det lade vi till pSuite1 till testregistret genom att anropa metoden 'CU_add_suite' för CUnit. Efter det lade vi till våra tester, 'test_MySum' och 'test_MyDiff', till de angivna sviterna genom att använda metoden 'CU_add_test()'. Till slut visade vi resultaten av CUnit-testet genom att anropa metoden 'CU_basic_run_tests()' och rengjorde registret när resultaten visades framgångsrikt. Felet som uppstår när CUnit-testerna utförs kommer att kastas av funktionen 'CU_get_error()'.

Den föregående CUnit-testfilen sparas som filen mytest.c. Vi har kört den här C-filen med GCC-kommandot. Vi har använt flaggan -lcunit för exekvering av CUnit-testfil. Med detta kommando kompileras vår kod. Sedan körde vi mytest-filen och den visade de förväntade resultaten av CUnit-testet eftersom alla tester klarades utan något misslyckande.

Exempel 2

Vi har ett annat exempel där vi har testat de två filhanteringsmetoderna, 'fread' och 'fprintf', med CUnit-metoden. Vi öppnade och stängde den temporära filen med hjälp av CUnit-testfunktionerna. CUnit-testoperationerna testar biblioteksfunktionerna genom att skriva och läsa från den temporära filen.

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

statisk FIL * fil = NULL;
int init_suite1 ( tomhet )
{
om ( NULL == ( fil = fopen ( 'MyFile.txt' , 'w +' ) ) ) {
lämna tillbaka -1 ;
}
annan {
lämna tillbaka 0 ;
}
}

int clean_suite1 ( tomhet )
{
om ( 0 ! = fnära ( fil ) ) {
lämna tillbaka -1 ;
}
annan {
fil = NULL;
lämna tillbaka 0 ;
}
}


void test_fprintf ( tomhet )
{
int x1 = 10 ;

om ( NULL ! = fil ) {
WITH_ASSERT ( två == fprintf ( fil , 'Q \n ' ) ) ;
WITH_ASSERT ( 7 == fprintf ( fil , 'x1 = %d' , x1 ) ) ;
}
}

void test_fread ( tomhet )
{
osignerad char-buffert [ tjugo ] ;

om ( NULL ! = fil ) {
spola tillbaka ( fil ) ;
WITH_ASSERT ( 9 == fread ( buffert, storlek på ( osignerad röding ) , tjugo , fil ) ) ;
WITH_ASSERT ( 0 == strncmp ( buffert, 'Q \n x1 = 10' , 9 ) ) ;
}
}

int main ( )
{
CU_pSuite pSuite = NULL;
om ( CUE_SUCCESS ! = CU_initialize_registry ( ) )
lämna tillbaka CU_get_error ( ) ;
pSuite = CU_add_suite ( 'Svit 1' , init_suite1, clean_suite1 ) ;
om ( NULL == pSuite ) {
CU_cleanup_registry ( ) ;
lämna tillbaka CU_get_error ( ) ;
}
om ( ( NULL == CU_add_test ( pSuite, 'fprintf() funktionstest' , test_fprintf ) ) ||
( NULL == CU_add_test ( pSuite, 'fread() funktionstest' , test_fread ) ) )
{
CU_cleanup_registry ( ) ;
lämna tillbaka CU_get_error ( ) ;
}
CU_basic_set_mode ( CU_BRM_VERBOSE ) ;
CU_basic_run_tests ( ) ;
CU_cleanup_registry ( ) ;
lämna tillbaka CU_get_error ( ) ;
}







Inom rubrikfilen har vi definierat CUnit standardbiblioteket 'CUnit.h/Basic.h'. Sedan förklarade vi 'fil' som en pekare till filen som användes av testerna. Därefter har vi konstruerat funktionen 'init_suite1' som öppnar den temporära filen 'MyFile.txt' och returnerar värdet noll vid framgång; annars kommer ett värde som inte är noll att returneras. För att stänga filen har vi skapat svitrensningsfunktionen, som också returnerar ett värde som inte är noll vid fel när den tillfälliga filen stängs. Annars erhålls nollvärde när den temporära filen framgångsrikt stängs. Sedan har vi helt enkelt implementerat en funktion 'test_fprintf' där vi har infogat data i den temporära filen 'MYfile.txt'. Dessa testfunktioner verifierade också antalet byte som vi försökte skriva i filen.

Efter det skapade vi en annan funktion för funktionen 'test_fread' för att testa fread-metoden. Här har vi kontrollerat att de angivna tecknen finns i tidigare skrivna data med funktionen 'test_fprinf()'. Sedan har vi huvudfunktionen där testerna som ställs upp och utförs hanteras. Vi definierade 'pSuite' i huvudfunktionen och initierade registret med testfunktionen 'CU_initialize_reslistry'. Vi har även kallat funktionen 'CU_add_suite' för att lägga till sviten i registret och lagt till de specificerade testerna till sviterna med hjälp av funktionen 'CU_add_test'.

De grundläggande CUnit-testgränssnitten används i slutändan för att visa resultaten av koden. Observera att huvudfunktionen returnerar en 'CUE_SUCCESS' vid framgångsrik exekvering och en annan 'CUnit_error'-kod vid misslyckad exekvering.

Vi har kört den tidigare koden för CUnit-testet, som visade programsammanfattningen och de framgångsrika testernas metodmeddelande.

Slutsats

CUnit är ett kärnramverk som tillhandahåller olika användargränssnitt. Det låter oss hantera testsviter, testfall och testregister. Att testa programmen och se resultaten av dessa tester underlättas av användargränssnitten. Vi har täckt CUnit-testramverket i C med den här artikeln. Vi demonstrerade installationen och implementerade sedan två körprogram i C-språk. De tidigare testade programmen har gett framgångsrika resultat.