CUnit v C

Cunit V C



K provádění unit testování v C se používá systém CUnit, který umožňuje administraci a provádění testů. Pokrývá rozmanitou škálu tvrzení pro testování běžně používaných datových typů a využívá jednoduchou architekturu pro vytváření testovacích struktur. Uživatelský testovací kód je propojen s CUnit, který je navržen jako statická knihovna. Můžeme zkoumat výkon úkolů a funkcí programu C pomocí testovacího rámce CUnit. Každá konkrétní úloha programu C má jiné vstupní podmínky a výstupní omezení. Chcete-li použít CUnit pro testování programu C, měli bychom ji nejprve nainstalovat do našeho systému. Kroky pro instalaci CUnit jsou popsány níže.

Jak používat CUnit Framework v Ubuntu 22.04

Abychom mohli v našem systému využívat testovací rámec CUnit, musíme postupovat podle instalačních kroků. Tyto kroky platí pro systém Ubuntu 22.04. Před instalací jsme nejprve aktualizovali náš systém. Systém vyžadoval oprávnění sudo k aktualizaci pomocí příkazu apt.








Chcete-li získat oprávnění sudo, terminál požádal uživatele sudo o ověření. Poté aktualizujte systémové balíčky a jejich závislosti, jak je uvedeno níže.




Nyní jsme nainstalovali framework CUnit pomocí následujícího příkazu. Tento příkaz může nainstalovat balíčky libcunitl, libcunitl-doc a libcunitl-dev z úložiště balíčků.




Po provedení instalačního příkazu CUnit je vyžadováno uživatelské heslo. Základní balíčky CUnit byly nainstalovány v našem Ubuntu 22.04.





Příklad 1

Krok instalace frameworku CUnit jsme dokončili v předchozí části. Nyní jsme testovali metodu součtu a rozdílu, abychom viděli očekávané výsledky v následujícím příkladu pomocí testovacího rámce CUnit.



#include
#include <řetězec.h>
#include
#include <řetězec.h>
#include 'CUnit/Basic.h'

int init_suite ( prázdnota ) { vrátit se 0 ; }
int clean_suite ( prázdnota ) { vrátit se 0 ; }

int MySum ( jsi a1, jsi b1 )

{
int res1;
res1 =a1+b1;
vrátit se res1;
}

int MyDiff ( int a2, int b2 )

{
int res2;
res2 =a2-b2;
vrátit se res2;
}

void test_MySum ( prázdnota )
{
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 ( prázdnota )
{
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 ( prázdnota )
{

CU_pSuite pSuite1,pSuite2 = NULL;

-li ( CUE_SUCCESS ! = CU_initialize_registry ( ) )
vrátit se CU_get_error ( ) ;

pSuite1 = CU_add_suite ( 'Testovací sada 1' , init_suite, clean_suite ) ;
-li ( NULL == pSuite1 ) {
CU_cleanup_registry ( ) ;
vrátit se CU_get_error ( ) ;
}

-li ( ( NULL == CU_add_test ( pSuite1, ' \n \n Testování funkce součtu \n \n ' , test_MySum ) ) )
{
CU_cleanup_registry ( ) ;
vrátit se CU_get_error ( ) ;
}

-li ( ( NULL == CU_add_test ( pSuite1, ' \n \n Diferenční funkce Testování \n \n ' , test_MyDiff ) ) )
{
CU_cleanup_registry ( ) ;
vrátit se CU_get_error ( ) ;
}

CU_basic_run_tests ( ) ;

CU_cleanup_registry ( ) ;
vrátit se CU_get_error ( ) ;
}







Nejprve, abychom vygenerovali strukturu CUnit, vložili jsme knihovnu CUnit „CUnit/Basic.h“ se zahrnutým klíčovým slovem. Tato knihovna C je určena pro rámce testování jednotek a nabízí jednoduché výstupní rozhraní konzoly. Poté jsme do našeho programu pro testování přidali dvě funkce, „init_suite“ pro inicializaci funkce sady a „clean_suite“ pro vyčištění funkce sady.

Dále jsme vytvořili metody „MySum“ a „MyDiff“, které budou testovány CUnit. Pro tyto funkce jsme zavolali konstruktor, který obsahuje proměnné, se kterými byly provedeny operace součtu a rozdílu. Dále jsme vytvořili funkci jako „test_MySum“ k testování. Uvnitř funkce jsme použili metodu „CU_ASSERT“, kde jsou přiřazeny init výrazy pro součet. Stejně jako „test_MySum“ jsme zkonstruovali funkci test_MyDiff pro testování výrazu pro různé operace pomocí metody „CU_ASSERT“.

Pak máme kód CUnit runner uvnitř hlavní metody. Zde jsme vytvořili dvě sady, „pSuite1“ a „pSuite2“, z metody „CU_pSuite“ a přiřadili těmto sadám hodnotu NULL. Tyto sady jsme vytvořili pro provedení testu CUnit, který by měl být registrován v registru testů. Před přidáním sad do „test_registry“ jsme vytvořili registr a inicializovali jej pomocí „if condition“. Pro vytvoření registru pro testovací sady jsme použili metodu „CU_initialze_registry()“.

Poté jsme přidali pSuite1 do testovacího registru vyvoláním metody „CU_add_suite“ CUnit. Poté jsme přidali naše testy „test_MySum“ a „test_MyDiff“ do specifikovaných sad pomocí metody „CU_add_test()“. Nakonec jsme zobrazili výsledky testu CUnit voláním metody „CU_basic_run_tests()“ a po úspěšném zobrazení výsledků vyčistili registr. Chyba, ke které dojde při provádění testů CUnit, bude vyvolána funkcí „CU_get_error()“.

Předchozí testovací soubor CUnit se uloží jako soubor mytest.c. Tento soubor C jsme provedli příkazem GCC. Pro spuštění testovacího souboru CUnit jsme použili příznak -lcunit. Pomocí tohoto příkazu je zkompilován náš kód. Poté jsme provedli soubor mytest a ten ukázal očekávané výsledky testu CUnit, protože všechny testy proběhly bez jakéhokoli selhání.

Příklad 2

Máme další příklad, kde jsme testovali dvě metody zpracování souborů, „fread“ a „fprintf“, přístupem CUnit. Dočasný soubor jsme otevřeli a zavřeli pomocí testovacích funkcí CUnit. Testovací operace CUnit testují funkce knihovny zápisem a čtením z dočasného souboru.

#include
#include <řetězec.h>
#include
#include <řetězec.h>
#include 'CUnit/Basic.h'

statický SOUBOR * soubor = NULL;
int init_suite1 ( prázdnota )
{
-li ( NULL == ( soubor = fopen ( 'MyFile.txt' , 'w +' ) ) ) {
vrátit se -1 ;
}
jiný {
vrátit se 0 ;
}
}

int clean_suite1 ( prázdnota )
{
-li ( 0 ! = fzavřít ( soubor ) ) {
vrátit se -1 ;
}
jiný {
soubor = NULL;
vrátit se 0 ;
}
}


void test_fprintf ( prázdnota )
{
int x1 = 10 ;

-li ( NULA ! = soubor ) {
WITH_ASSERT ( dva == fprintf ( soubor , 'O \n ' ) ) ;
WITH_ASSERT ( 7 == fprintf ( soubor , 'x1 = %d' , x1 ) ) ;
}
}

void test_fread ( prázdnota )
{
unsigned char buffer [ dvacet ] ;

-li ( NULA ! = soubor ) {
přetočit ( soubor ) ;
WITH_ASSERT ( 9 == fred ( vyrovnávací paměť, velikost ( nepodepsaný char ) , dvacet , soubor ) ) ;
WITH_ASSERT ( 0 == strncmp ( vyrovnávací paměť, 'O \n x1 = 10' , 9 ) ) ;
}
}

int main ( )
{
CU_pSuite pSuite = NULL;
-li ( CUE_SUCCESS ! = CU_initialize_registry ( ) )
vrátit se CU_get_error ( ) ;
pSuite = CU_add_suite ( 'Suite1' , init_suite1, clean_suite1 ) ;
-li ( NULL == pSuite ) {
CU_cleanup_registry ( ) ;
vrátit se CU_get_error ( ) ;
}
-li ( ( NULL == CU_add_test ( pSuite, 'Test funkce fprintf()' , test_fprintf ) ) ||
( NULL == CU_add_test ( pSuite, 'Test funkce fread()' , test_fread ) ) )
{
CU_cleanup_registry ( ) ;
vrátit se CU_get_error ( ) ;
}
CU_basic_set_mode ( CU_BRM_VERBOSE ) ;
CU_basic_run_tests ( ) ;
CU_cleanup_registry ( ) ;
vrátit se CU_get_error ( ) ;
}







V rámci hlavičkového souboru jsme definovali standardní knihovnu CUnit „CUnit.h/Basic.h“. Poté jsme deklarovali „soubor“ jako ukazatel na soubor použitý v testech. Dále jsme vytvořili funkci „init_suite1“, která otevře dočasný soubor „MyFile.txt“ a v případě úspěchu vrátí hodnotu nula; jinak bude vrácena nenulová hodnota. Chcete-li soubor zavřít, vytvořili jsme funkci vyčištění sady, která také při selhání při zavírání dočasného souboru vrací nenulovou hodnotu. V opačném případě se při úspěšném zavření dočasného souboru získá nulová hodnota. Poté jsme jednoduše implementovali funkci „test_fprintf“, kde jsme data vložili do dočasného souboru „MYfile.txt“. Tyto testovací funkce také ověřily počet bajtů, které jsme se pokusili zapsat do souboru.

Poté jsme vytvořili další funkci pro funkci „test_fread“, abychom otestovali metodu fread. Zde jsme pomocí funkce „test_fprinf()“ ověřili, že zadané znaky jsou přítomny v dříve zapsaných datech. Pak máme hlavní funkci, kde se zpracovávají nastavené a provedené testy. Definovali jsme „pSuite“ v hlavní funkci a inicializovali jsme registr pomocí testovací funkce „CU_initialize_resgistry“. Zavolali jsme také funkci „CU_add_suite“ pro přidání sady do registru a přidali jsme do sad zadané testy pomocí funkce „CU_add_test“.

K zobrazení výsledků kódu se nakonec používají základní testovací rozhraní CUnit. Všimněte si, že hlavní funkce vrací „CUE_SUCCESS“ při úspěšném provedení a jiný kód „CUnit_error“ při neúspěšném provedení.

Spustili jsme předchozí kód pro test CUnit, který zobrazil shrnutí programu a zprávu o metodě úspěšných testů.

Závěr

CUnit je základní framework, který poskytuje různá uživatelská rozhraní. Umožňuje nám spravovat testovací sady, testovací případy a testovací registry. Testování programů a prohlížení výsledků těchto testů usnadňují uživatelská rozhraní. V tomto článku jsme pokryli testovací rámec CUnit v jazyce C. Předvedli jsme instalaci a následně implementovali dva běžící programy v jazyce C. Předchozí testované programy přinesly úspěšné výsledky.