CUyksikkö C:ssä

Cuyksikko C Ssa



CUnit-järjestelmällä suoritetaan yksikkötestaus C-kielellä, mikä mahdollistaa testien hallinnan ja suorittamisen. Se kattaa monenlaisia ​​väitteitä yleisesti käytettyjen tietotyyppien testaamiseen ja käyttää yksinkertaista arkkitehtuuria testirakenteiden luomiseen. Käyttäjän testauskoodi on linkitetty CUnitiin, joka on suunniteltu staattiseksi kirjastoksi. Voimme tutkia C-ohjelman tehtävien ja toimintojen suorituskykyä CUnit-testikehyksen avulla. Jokaisella C-ohjelman tietyllä tehtävällä on erilaiset syöttöolosuhteet ja tulosrajoitukset. Käyttääksemme CUnitiä C-ohjelman testaamiseen, meidän tulee asentaa se ensin järjestelmäämme. CUnitin asennuksen vaiheet on kuvattu alla.

Kuinka käyttää CUnit-kehystä Ubuntu 22.04:ssä

Jotta voimme hyödyntää CUnit-testauskehystä järjestelmässämme, meidän on noudatettava asennusvaiheita. Nämä vaiheet koskevat Ubuntu 22.04 -järjestelmää. Ennen asennusta päivitimme ensin järjestelmämme. Järjestelmä vaati sudo-oikeudet päästäkseen päivitykseen apt-komennolla.








Sudo-oikeuksien hankkimiseksi pääte pyysi todennusta sudo-käyttäjältä. Päivitä sitten järjestelmäpaketit ja niiden riippuvuudet alla olevan kuvan mukaisesti.




Nyt olemme asentaneet CUnit-kehyksen käyttämällä seuraavaa komentoa. Tämä komento voi asentaa libcunitl-, libcunitl-doc- ja libcunitl-dev-paketit pakettivarastosta.




Kun CUnit-asennuskomento on suoritettu, vaaditaan käyttäjän salasana. CUnitin olennaiset paketit on asennettu Ubuntu 22.04:ään.





Esimerkki 1

Suoritimme CUnit-kehyksen asennusvaiheen edellisessä osiossa. Nyt olemme testanneet summa- ja erotusmenetelmää nähdäksemme odotetut tulokset seuraavassa esimerkissä käyttämällä CUnit-testauskehystä.



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

int init_suite ( mitätön ) { palata 0 ; }
int clean_suite ( mitätön ) { palata 0 ; }

int MySum ( olet a1, olet b1 )

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

int MyDiff ( int a2, int b2 )

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

void testi_MySum ( mitätön )
{
WITH_ASSERT ( 4 ==OmaSumma ( kaksi , kaksi ) ) ;
WITH_ASSERT ( 8 ==OmaSumma ( 5 , 3 ) ) ;
WITH_ASSERT ( kaksi ==Oma summa ( - kaksi , 4 ) ) ;
WITH_ASSERT ( 7 ==Oma summa ( 0 , 7 ) ) ;
}


void testi_MyDiff ( mitätön )
{
WITH_ASSERT ( 3 ==Oma ero ( 5 , kaksi ) ) ;
WITH_ASSERT ( - 4 ==Oma ero ( 4 , 8 ) ) ;
WITH_ASSERT ( - 7 ==Oma ero ( - 3 , 4 ) ) ;
WITH_ASSERT ( - 9 ==Oma ero ( 0 , 9 ) ) ;
}


int main ( mitätön )
{

CU_pSuite pSuite1,pSuite2 = NULL;

jos ( CUE_SUCCESS ! = CU_initialize_registry ( ) )
palata CU_get_error ( ) ;

pSuite1 = CU_add_suite ( 'Testi Suite1' , init_suite, clean_suite ) ;
jos ( NULL == pSuite1 ) {
CU_cleanup_registry ( ) ;
palata CU_get_error ( ) ;
}

jos ( ( NULL == CU_lisää_testi ( pSuite1, ' \n \n Summafunktion testaus \n \n ' , test_MySum ) ) )
{
CU_cleanup_registry ( ) ;
palata CU_get_error ( ) ;
}

jos ( ( NULL == CU_lisää_testi ( pSuite1, ' \n \n Erofunktion testaus \n \n ' , test_MyDiff ) ) )
{
CU_cleanup_registry ( ) ;
palata CU_get_error ( ) ;
}

CU_basic_run_tests ( ) ;

CU_cleanup_registry ( ) ;
palata CU_get_error ( ) ;
}







Ensinnäkin CUnit-rakenteen luomiseksi olemme lisänneet CUnit-kirjaston 'CUnit/Basic.h' mukana tulevalla avainsanalla. Tämä C-kirjasto on tarkoitettu yksikkötestaukseen ja tarjoaa yksinkertaisen konsolilähtöliittymän. Sitten lisäsimme kaksi funktiota, 'init_suite' sarjafunktion alustusta varten ja 'clean_suite' sarjafunktion puhdistamista varten, testausohjelmaamme.

Seuraavaksi rakensimme menetelmät, 'MySum' ja 'MyDiff', jotka CUnit testasi. Olemme kutsuneet näiden funktioiden konstruktorin, joka pitää sisällään muuttujat, joille summa- ja erooperaatiot on suoritettu. Seuraavaksi olemme luoneet funktion 'test_MySum' testattavaksi. Toiminnon sisällä olemme käyttäneet 'CU_ASSERT'-menetelmää, jossa summan init-lausekkeet on määritetty. Kuten 'test_MySum', olemme rakentaneet test_MyDiff-funktion testaamaan lauseketta eri operaatioille 'CU_ASSERT'-menetelmällä.

Sitten meillä on CUnit-ajokoodi päämenetelmän sisällä. Täällä olemme luoneet kaksi sarjaa, 'pSuite1' ja 'pSuite2', 'CU_pSuite'-menetelmästä ja määrittäneet näille sarjoille NULL-arvon. Olemme luoneet nämä sarjat suorittamaan CUnit-testin, joka tulee rekisteröidä testirekisteriin. Ennen kuin lisäsimme sarjat 'test_registry' -rekisteriin, loimme rekisterin ja alustimme sen 'jos-ehdon' avulla. Olemme käyttäneet 'CU_initialze_registry()' -menetelmää rekisterin luomiseen ohjelmistopakettien testausta varten.

Sen jälkeen lisäsimme pSuite1:n testirekisteriin kutsumalla CUnitin 'CU_add_suite' -menetelmää. Sen jälkeen lisäsimme testimme 'test_MySum' ja 'test_MyDiff' määritettyihin sviitteihin käyttämällä 'CU_add_test()' -menetelmää. Lopulta näytimme CUnit-testin tulokset kutsumalla 'CU_basic_run_tests()' -menetelmää ja puhdistimme rekisterin, kun tulokset näytettiin onnistuneesti. 'CU_get_error()' -funktio lähettää CUnit-testien aikana havaitun virheen.

Edellinen CUnit-testitiedosto tallennetaan mytest.c-tiedostona. Olemme suorittaneet tämän C-tiedoston GCC-komennolla. Olemme käyttäneet -lcunit-lippua CUnit-testitiedoston suorittamiseen. Tällä komennolla koodimme käännetään. Sitten suoritimme mytest-tiedoston, ja se näytti CUnit-testin odotetut tulokset, koska kaikki testit läpäistiin ilman epäonnistumisia.

Esimerkki 2

Meillä on toinen esimerkki, jossa olemme testanneet kahta tiedostonkäsittelymenetelmää, 'fread' ja 'fprintf', CUnit-lähestymistavalla. Avasimme ja suljemme väliaikaisen tiedoston CUnit-testitoiminnoilla. CUnit-testitoiminnot testaavat kirjaston toimintoja kirjoittamalla ja lukemalla tilapäistiedostosta.

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

staattinen TIEDOSTO * tiedosto = NULL;
int init_suite1 ( mitätön )
{
jos ( NULL == ( tiedosto = fopen ( 'OmaTiedosto.txt' , 'w +' ) ) ) {
palata -1 ;
}
muu {
palata 0 ;
}
}

int clean_suite1 ( mitätön )
{
jos ( 0 ! = fclose ( tiedosto ) ) {
palata -1 ;
}
muu {
tiedosto = NULL;
palata 0 ;
}
}


void test_fprintf ( mitätön )
{
int x1 = 10 ;

jos ( TYHJÄ ! = tiedosto ) {
WITH_ASSERT ( kaksi == fprintf ( tiedosto , 'K \n ' ) ) ;
WITH_ASSERT ( 7 == fprintf ( tiedosto , 'x1 = %d' , x1 ) ) ;
}
}

void test_frread ( mitätön )
{
allekirjoittamaton merkkipuskuri [ kaksikymmentä ] ;

jos ( TYHJÄ ! = tiedosto ) {
kelaa taaksepäin ( tiedosto ) ;
WITH_ASSERT ( 9 == hullu ( puskuri, koko ( allekirjoittamaton merkki ) , kaksikymmentä , tiedosto ) ) ;
WITH_ASSERT ( 0 == strncmp ( puskuri, 'K \n x1 = 10' , 9 ) ) ;
}
}

int main ( )
{
CU_pSuite pSuite = NULL;
jos ( CUE_SUCCESS ! = CU_initialize_registry ( ) )
palata CU_get_error ( ) ;
pSuite = CU_add_suite ( 'Sviitti 1' , init_suite1, clean_suite1 ) ;
jos ( NULL == pSuite ) {
CU_cleanup_registry ( ) ;
palata CU_get_error ( ) ;
}
jos ( ( NULL == CU_lisää_testi ( pSuite, 'fprintf()-funktion testi' , test_fprintf ) ) ||
( NULL == CU_lisää_testi ( pSuite, 'fread()-funktion testi' , test_fread ) ) )
{
CU_cleanup_registry ( ) ;
palata CU_get_error ( ) ;
}
CU_basic_set_mode ( CU_BRM_VERBOSE ) ;
CU_basic_run_tests ( ) ;
CU_cleanup_registry ( ) ;
palata CU_get_error ( ) ;
}







Otsikkotiedostossa olemme määrittäneet CUnit-standardikirjaston 'CUnit.h/Basic.h'. Sitten julistimme 'tiedoston' osoittimeksi testien käyttämälle tiedostolle. Seuraavaksi olemme rakentaneet 'init_suite1'-funktion, joka avaa väliaikaisen tiedoston 'MyFile.txt' ja palauttaa arvon nolla onnistuessa; muuten palautetaan nollasta poikkeava arvo. Tiedoston sulkemiseksi olemme luoneet paketin puhdistustoiminnon, joka myös palauttaa nollasta poikkeavan arvon, jos se epäonnistuu väliaikaisen tiedoston sulkemisen yhteydessä. Muussa tapauksessa tilapäisen tiedoston onnistuneen sulkemisen jälkeen arvoksi saadaan nolla. Sitten olemme yksinkertaisesti toteuttaneet toiminnon 'test_fprintf', jossa olemme lisänneet tiedot väliaikaiseen tiedostoon 'MYfile.txt'. Nämä testitoiminnot vahvistivat myös tavujen määrän, jotka yritimme kirjoittaa tiedostoon.

Sen jälkeen loimme toisen funktion 'test_fread'-funktiolle fread-menetelmän testaamiseksi. Tässä olemme tarkistaneet, että määritetyt merkit ovat läsnä aiemmin kirjoitetuissa tiedoissa 'test_fprinf()' -funktiolla. Sitten meillä on päätoiminto, jossa määritetyt ja suoritetut testit käsitellään. Määritimme 'pSuite':n päätoiminnossa ja alustimme rekisterin 'CU_initialize_resgistry' -testitoiminnolla. Olemme myös kutsuneet 'CU_add_suite'-funktiota lisätäksemme sarjan rekisteriin ja lisänneet määritetyt testit sarjoihin 'CU_add_test'-funktion avulla.

CUnitin perustestiliitäntöjä käytetään lopulta koodin tulosten näyttämiseen. Huomaa, että pääfunktio palauttaa 'CUE_SUCCESS'-koodin onnistuneen suorituksen yhteydessä ja eri 'CUnit_error'-koodin, jos suoritus epäonnistuu.

Olemme suorittaneet edellisen koodin CUnit-testille, joka näytti ohjelman yhteenvedon ja onnistuneiden testien menetelmäviestin.

Johtopäätös

CUnit on ydinkehys, joka tarjoaa erilaisia ​​käyttöliittymiä. Sen avulla voimme hallita testipaketteja, testitapauksia ja testirekisterejä. Ohjelmien testaamista ja testien tulosten näkemistä helpottavat käyttöliittymät. Olemme käsitelleet CUnit-testikehyksen C:ssä tässä artikkelissa. Esitimme asennuksen ja toteutimme sitten kaksi käynnissä olevaa ohjelmaa C-kielellä. Aiemmat testatut ohjelmat ovat tuottaneet onnistuneita tuloksia.