CUjednostka w C

Cujednostka W C



System CUnit służy do wykonywania testów jednostkowych w C, co umożliwia administrowanie i wykonywanie testów. Obejmuje szeroki zakres asercji do testowania powszechnie używanych typów danych i wykorzystuje prostą architekturę do tworzenia struktur testowych. Kod testowy użytkownika jest powiązany z CUnit, który został zaprojektowany jako biblioteka statyczna. Możemy zbadać wydajność zadań i funkcji programu C za pomocą frameworka testowego CUnit. Każde konkretne zadanie programu C ma inne okoliczności wejściowe i ograniczenia wyjściowe. Aby użyć CUnit do testowania programu w C, powinniśmy najpierw zainstalować go w naszym systemie. Kroki instalacji CUnit są opisane poniżej.

Jak korzystać z CUnit Framework w Ubuntu 22.04

Aby wykorzystać framework testowy CUnit w naszym systemie, musimy postępować zgodnie z instrukcjami instalacji. Te kroki dotyczą systemu Ubuntu 22.04. Przed instalacją najpierw zaktualizowaliśmy nasz system. System wymagał uprawnień sudo, aby zostać zaktualizowanym za pomocą polecenia apt.








Aby uzyskać uprawnienia sudo, terminal poprosił użytkownika sudo o uwierzytelnienie. Następnie zaktualizuj pakiety systemowe i ich zależności, jak pokazano poniżej.




Teraz zainstalowaliśmy framework CUnit za pomocą następującego polecenia. To polecenie może zainstalować pakiety libcunitl, libcunitl-doc i libcunitl-dev z repozytorium pakietów.




Po wykonaniu polecenia instalacji CUnit wymagane jest hasło użytkownika. Podstawowe pakiety CUnit zostały zainstalowane w naszym Ubuntu 22.04.





Przykład 1

Zakończyliśmy etap instalacji frameworka CUnit w poprzedniej sekcji. Teraz przetestowaliśmy metodę sumy i różnicy, aby zobaczyć oczekiwane wyniki w poniższym przykładzie przy użyciu platformy testowej CUnit.



#include
#include
#włącz
#include
#include 'CUnit/Basic.h'

int init_suite ( próżnia ) { zwrócić 0 ; }
int clean_suite ( próżnia ) { zwrócić 0 ; }

int Moja Suma ( jesteś a1, jesteś b1 )

{
int res1;
res1 =a1+b1;
zwrócić res1;
}

int MyDiff ( int a2, int b2 )

{
int res2;
res2 =a2-b2;
zwrócić res2;
}

void test_MySum ( próżnia )
{
Z_ASSERT ( 4 ==MojaSuma ( dwa , dwa ) ) ;
Z_ASSERT ( 8 ==MojaSuma ( 5 , 3 ) ) ;
Z_ASSERT ( dwa ==MojaSuma ( - dwa , 4 ) ) ;
Z_ASSERT ( 7 ==MojaSuma ( 0 , 7 ) ) ;
}


void test_MyDiff ( próżnia )
{
Z_ASSERT ( 3 ==MójRóżn. ( 5 , dwa ) ) ;
Z_ASSERT ( - 4 ==Mój Róż ( 4 , 8 ) ) ;
Z_ASSERT ( - 7 ==Mój Róż ( - 3 , 4 ) ) ;
Z_ASSERT ( - 9 ==Mój Róż ( 0 , 9 ) ) ;
}


int main ( próżnia )
{

CU_pSuite pSuite1,pSuite2 = NULL;

jeśli ( CUE_SUCCESS ! = CU_initialize_registry ( ) )
zwrócić CU_get_error ( ) ;

pSuite1 = CU_add_suite ( „Apartament testowy1” , init_suite, clean_suite ) ;
jeśli ( NULL == pSuite1 ) {
CU_cleanup_registry ( ) ;
zwrócić CU_get_error ( ) ;
}

jeśli ( ( NULL == CU_add_test ( pSuite1, ' \n \n Testowanie funkcji sumy \n \n ' , test_MySum ) ) )
{
CU_cleanup_registry ( ) ;
zwrócić CU_get_error ( ) ;
}

jeśli ( ( NULL == CU_add_test ( pSuite1, ' \n \n Testowanie funkcji różnicy \n \n ' , test_MyDiff ) ) )
{
CU_cleanup_registry ( ) ;
zwrócić CU_get_error ( ) ;
}

CU_basic_run_tests ( ) ;

CU_cleanup_registry ( ) ;
zwrócić CU_get_error ( ) ;
}







Najpierw, aby wygenerować strukturę CUnit, wstawiliśmy bibliotekę CUnit „CUnit/Basic.h” z dołączonym słowem kluczowym. Ta biblioteka C służy do testowania jednostek i oferuje prosty interfejs wyjściowy konsoli. Następnie dodaliśmy do naszego programu do testowania dwie funkcje, „init_suite” do inicjalizacji funkcji pakietu i „clean_suite” do czyszczenia funkcji pakietu.

Następnie skonstruowaliśmy metody „MySum” i „MyDiff”, które miały zostać przetestowane przez CUnit. Wywołaliśmy konstruktor dla tych funkcji, który przechowuje zmienne, na których zostały wykonane operacje sumowania i różnicowania. Następnie ustanowiliśmy funkcję „test_MySum” do testowania. Wewnątrz funkcji zastosowaliśmy metodę „CU_ASSERT”, w której przypisane są wyrażenia init dla sumy. Podobnie jak „test_MySum”, skonstruowaliśmy funkcję test_MyDiff do testowania wyrażenia dla różnych operacji przy użyciu metody „CU_ASSERT”.

Następnie mamy kod uruchamiający CUnit wewnątrz głównej metody. Tutaj utworzyliśmy dwa zestawy, „pSuite1” i „pSuite2”, z metody „CU_pSuite” i przypisaliśmy tym zestawom wartość NULL. Stworzyliśmy te pakiety, aby wykonać test CUnit, który powinien zostać zarejestrowany w rejestrze testowym. Przed dodaniem pakietów do „test_registry” utworzyliśmy rejestr i zainicjalizowaliśmy go z „warunkiem if”. Użyliśmy metody „CU_initialze_registry()” do utworzenia rejestru dla pakietów testowych.

Następnie dodaliśmy pSuite1 do rejestru testowego, wywołując metodę „CU_add_suite” CUnit. Następnie dodaliśmy nasze testy „test_MySum” i „test_MyDiff” do określonych pakietów za pomocą metody „CU_add_test()”. Na koniec wyświetliliśmy wyniki testu CUnit, wywołując metodę „CU_basic_run_tests()” i wyczyściliśmy rejestr po pomyślnym wyświetleniu wyników. Błąd napotkany podczas wykonywania testów CUnit zostanie zgłoszony przez funkcję „CU_get_error()”.

Poprzedni plik testowy CUnit jest zapisywany jako plik mytest.c. Wykonaliśmy ten plik C za pomocą polecenia GCC. Użyliśmy flagi -lcunit do wykonania pliku testowego CUnit. Za pomocą tego polecenia nasz kod jest kompilowany. Następnie wykonaliśmy plik mytest, który pokazał oczekiwane wyniki testu CUnit, ponieważ wszystkie testy przeszły bez żadnych błędów.

Przykład 2

Mamy inny przykład, w którym przetestowaliśmy dwie metody obsługi plików, „fread” i „fprintf”, za pomocą podejścia CUnit. Otworzyliśmy i zamknęliśmy plik tymczasowy za pomocą funkcji testowych CUnit. Operacje testowe CUnit testują funkcje biblioteki poprzez zapis i odczyt z pliku tymczasowego.

#include
#include
#włącz
#include
#include 'CUnit/Basic.h'

PLIK statyczny * plik = NULL;
int init_suite1 ( próżnia )
{
jeśli ( NULL == ( plik = fopen ( 'MójPlik.txt' , 'w+' ) ) ) {
zwrócić -1 ;
}
w przeciwnym razie {
zwrócić 0 ;
}
}

int clean_suite1 ( próżnia )
{
jeśli ( 0 ! = fzamknij ( plik ) ) {
zwrócić -1 ;
}
w przeciwnym razie {
plik = NULL;
zwrócić 0 ;
}
}


nieważny test_fprintf ( próżnia )
{
int x1 = 10 ;

jeśli ( ZERO ! = plik ) {
Z_ASSERT ( dwa == fprintf ( plik , 'Q \n ' ) ) ;
Z_ASSERT ( 7 == fprintf ( plik , 'x1 = %d' , x1 ) ) ;
}
}

nieważne test_fread ( próżnia )
{
bufor niepodpisanych znaków [ 20 ] ;

jeśli ( ZERO ! = plik ) {
przewijanie do tyłu ( plik ) ;
Z_ASSERT ( 9 == strach ( bufor, rozmiar ( znak niepodpisany ) , 20 , plik ) ) ;
Z_ASSERT ( 0 == strncmp ( bufor, 'Q \n x1 = 10' , 9 ) ) ;
}
}

int main ( )
{
CU_pSuite pSuite = NULL;
jeśli ( CUE_SUCCESS ! = CU_initialize_registry ( ) )
zwrócić CU_get_error ( ) ;
pSuite = CU_add_suite ( „Apartament 1” , init_suite1, clean_suite1 ) ;
jeśli ( NULL == pSuite ) {
CU_cleanup_registry ( ) ;
zwrócić CU_get_error ( ) ;
}
jeśli ( ( NULL == CU_add_test ( pApartament, 'fprintf() Test funkcji' , test_fprintf ) ) ||
( NULL == CU_add_test ( pApartament, 'fread() Test funkcji' , test_fread ) ) )
{
CU_cleanup_registry ( ) ;
zwrócić CU_get_error ( ) ;
}
CU_basic_set_mode ( CU_BRM_VERBOSE ) ;
CU_basic_run_tests ( ) ;
CU_cleanup_registry ( ) ;
zwrócić CU_get_error ( ) ;
}







W pliku nagłówkowym zdefiniowaliśmy standardową bibliotekę CUnit „CUnit.h/Basic.h”. Następnie zadeklarowaliśmy „plik” jako wskaźnik do pliku używanego przez testy. Następnie skonstruowaliśmy funkcję „init_suite1”, która otwiera tymczasowy plik „MyFile.txt” i zwraca wartość zero w przypadku powodzenia; w przeciwnym razie zostanie zwrócona wartość niezerowa. Aby zamknąć plik, stworzyliśmy funkcję czyszczenia pakietu, która również zwraca niezerową wartość w przypadku niepowodzenia podczas zamykania pliku tymczasowego. W przeciwnym razie, po pomyślnym zamknięciu pliku tymczasowego, uzyskiwana jest wartość zerowa. Następnie po prostu zaimplementowaliśmy funkcję „test_fprintf”, w której wstawiliśmy dane do tymczasowego pliku „MYfile.txt”. Te funkcje testowe zweryfikowały również liczbę bajtów, które próbowaliśmy zapisać w pliku.

Następnie stworzyliśmy kolejną funkcję dla funkcji „test_fread”, aby przetestować metodę fread. Tutaj sprawdziliśmy, czy określone znaki są obecne we wcześniej zapisanych danych przez funkcję „test_fprinf()”. Następnie mamy główną funkcję, w której obsługiwane są konfigurowane i wykonywane testy. Zdefiniowaliśmy „pSuite” w funkcji main i zainicjowaliśmy rejestr za pomocą funkcji testowej „CU_initialize_resgistry”. Wywołaliśmy również funkcję „CU_add_suite”, aby dodać pakiet do rejestru i dodaliśmy określone testy do pakietów za pomocą funkcji „CU_add_test”.

Podstawowe interfejsy testowe CUnit są używane w końcu do wyświetlania wyników kodu. Zauważ, że funkcja main zwraca „CUE_SUCCESS” po pomyślnym wykonaniu i inny kod „CUnit_error” po nieudanym wykonaniu.

Uruchomiliśmy poprzedni kod dla testu CUnit, który wyświetlał podsumowanie programu i komunikat o pomyślnych testach.

Wniosek

CUnit to podstawowa platforma, która zapewnia różne interfejsy użytkownika. Pozwala nam zarządzać zestawami testów, przypadkami testowymi i rejestrami testów. Testowanie programów i przeglądanie wyników tych testów ułatwiają interfejsy użytkownika. W tym artykule omówiliśmy strukturę testową CUnit w języku C. Zademonstrowaliśmy instalację, a następnie zaimplementowaliśmy dwa uruchomione programy w języku C. Poprzednie testowane programy przyniosły pomyślne rezultaty.