CUnit in C

Cunit In C



Das CUnit-System wird verwendet, um die Unit-Tests in C durchzuführen, was die Verwaltung und Ausführung der Tests ermöglicht. Es deckt eine Vielzahl von Behauptungen zum Testen häufig verwendeter Datentypen ab und verwendet eine einfache Architektur zum Erstellen von Teststrukturen. Der Testcode des Benutzers wird mit CUnit verknüpft, das als statische Bibliothek konzipiert ist. Wir können die Leistung der Aufgaben und Funktionen des C-Programms mit dem CUnit-Testframework untersuchen. Jede einzelne Aufgabe des C-Programms hat unterschiedliche Eingabeumstände und Ausgabebeschränkungen. Um das CUnit zum Testen des C-Programms zu verwenden, sollten wir es zuerst in unserem System installieren. Die Schritte zum Installieren von CUnit sind unten beschrieben.

So verwenden Sie das CUnit-Framework in Ubuntu 22.04

Um das CUnit-Testframework in unserem System zu verwenden, müssen wir die Installationsschritte befolgen. Diese Schritte gelten für das Ubuntu 22.04-System. Vor der Installation haben wir zunächst unser System aktualisiert. Das System benötigte sudo-Berechtigungen, um mit dem apt-Befehl aktualisiert zu werden.








Um sudo-Privilegien zu erwerben, forderte das Terminal den sudo-Benutzer zur Authentifizierung auf. Aktualisieren Sie dann die Systempakete und ihre Abhängigkeiten wie unten gezeigt.




Jetzt haben wir das CUnit-Framework mit dem folgenden Befehl installiert. Dieser Befehl kann die Pakete libcunitl, libcunitl-doc und libcunitl-dev aus dem Paket-Repository installieren.




Sobald der CUnit-Installationsbefehl ausgeführt wird, ist das Benutzerkennwort erforderlich. Die wesentlichen CUnit-Pakete wurden in unserem Ubuntu 22.04 installiert.





Beispiel 1

Wir haben den Installationsschritt des CUnit-Frameworks im vorherigen Abschnitt abgeschlossen. Jetzt haben wir die Summen- und Differenzmethode getestet, um die erwarteten Ergebnisse im folgenden Beispiel mit dem CUnit-Testframework zu sehen.



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

int init_suite ( Leere ) { Rückkehr 0 ; }
int clean_suite ( Leere ) { Rückkehr 0 ; }

int MySum ( du bist a1, du bist b1 )

{
int res1;
res1 =a1+b1;
Rückkehr res1;
}

int MyDiff ( int a2, int b2 )

{
intres2;
res2 =a2-b2;
Rückkehr res2;
}

void test_MySum ( Leere )
{
WITH_ASSERT ( 4 ==MeineSumme ( zwei , zwei ) ) ;
WITH_ASSERT ( 8 ==MeineSumme ( 5 , 3 ) ) ;
WITH_ASSERT ( zwei ==MeineSumme ( - zwei , 4 ) ) ;
WITH_ASSERT ( 7 ==MeineSumme ( 0 , 7 ) ) ;
}


void test_MyDiff ( Leere )
{
WITH_ASSERT ( 3 ==MeinDiff ( 5 , zwei ) ) ;
WITH_ASSERT ( - 4 ==MeinDiff ( 4 , 8 ) ) ;
WITH_ASSERT ( - 7 ==MeinDiff ( - 3 , 4 ) ) ;
WITH_ASSERT ( - 9 ==MeinDiff ( 0 , 9 ) ) ;
}


int Haupt ( Leere )
{

CU_pSuite pSuite1, pSuite2 = NULL;

wenn ( CUE_SUCCESS ! = CU_initialize_registry ( ) )
Rückkehr CU_get_error ( ) ;

pSuite1 = CU_add_suite ( 'Testsuite1' , init_suite, clean_suite ) ;
wenn ( NULL == pSuite1 ) {
CU_cleanup_registry ( ) ;
Rückkehr CU_get_error ( ) ;
}

wenn ( ( NULL == CU_add_test ( pSuite1, ' \n \n Testen der Summenfunktion \n \n ' , test_MySum ) ) )
{
CU_cleanup_registry ( ) ;
Rückkehr CU_get_error ( ) ;
}

wenn ( ( NULL == CU_add_test ( pSuite1, ' \n \n Testen der Differenzfunktion \n \n ' , test_MyDiff ) ) )
{
CU_cleanup_registry ( ) ;
Rückkehr CU_get_error ( ) ;
}

CU_basic_run_tests ( ) ;

CU_cleanup_registry ( ) ;
Rückkehr CU_get_error ( ) ;
}







Um die CUnit-Struktur zu generieren, haben wir zunächst die CUnit-Bibliothek „CUnit/Basic.h“ mit dem enthaltenen Schlüsselwort eingefügt. Diese C-Bibliothek dient zum Testen von Komponenten und bietet eine einfache Konsolenausgabeschnittstelle. Dann haben wir unserem Programm zum Testen zwei Funktionen hinzugefügt, „init_suite“ für die Initialisierung der Suite-Funktion und „clean_suite“ für die Bereinigung der Suite-Funktion.

Als nächstes konstruierten wir die Methoden „MySum“ und „MyDiff“, die von der CUnit getestet werden sollten. Wir haben den Konstruktor für diese Funktionen aufgerufen, der die Variablen enthält, an denen Summen- und Differenzoperationen durchgeführt wurden. Als nächstes haben wir eine Funktion als „test_MySum“ zum Testen eingerichtet. Innerhalb der Funktion haben wir die Methode „CU_ASSERT“ verwendet, bei der die Init-Ausdrücke für die Summe zugewiesen werden. Wie bei „test_MySum“ haben wir die Funktion test_MyDiff konstruiert, um den Ausdruck für verschiedene Operationen mit der Methode „CU_ASSERT“ zu testen.

Dann haben wir den CUnit-Runner-Code in der Hauptmethode. Hier haben wir zwei Suiten „pSuite1“ und „pSuite2“ aus der Methode „CU_pSuite“ erstellt und diesen Suiten einen NULL-Wert zugewiesen. Wir haben diese Suiten erstellt, um den CUnit-Test auszuführen, der in der Testregistrierung registriert werden sollte. Vor dem Hinzufügen der Suiten zur „test_registry“ haben wir die Registrierung erstellt und mit der „if-Bedingung“ initialisiert. Wir haben die Methode „CU_initialze_registry()“ zum Erstellen der Registrierung zum Testen von Suiten verwendet.

Danach haben wir die pSuite1 zur Testregistrierung hinzugefügt, indem wir die Methode „CU_add_suite“ von CUnit aufgerufen haben. Danach haben wir unsere Tests „test_MySum“ und „test_MyDiff“ zu den angegebenen Suiten hinzugefügt, indem wir die Methode „CU_add_test()“ verwendet haben. Am Ende haben wir die Ergebnisse des CUnit-Tests angezeigt, indem wir die Methode „CU_basic_run_tests()“ aufgerufen und die Registrierung bereinigt haben, nachdem die Ergebnisse erfolgreich angezeigt wurden. Der bei den CUnit-Tests aufgetretene Fehler wird von der Funktion „CU_get_error()“ ausgegeben.

Die vorherige CUnit-Testdatei wird als mytest.c-Datei gespeichert. Wir haben diese C-Datei mit dem GCC-Befehl ausgeführt. Wir haben das Flag -lcunit für die Ausführung der CUnit-Testdatei verwendet. Mit diesem Befehl wird unser Code kompiliert. Dann haben wir die mytest-Datei ausgeführt und sie zeigte die erwarteten Ergebnisse des CUnit-Tests, da alle Tests ohne Fehler bestanden wurden.

Beispiel 2

Wir haben ein weiteres Beispiel, in dem wir die beiden Dateibehandlungsmethoden „fread“ und „fprintf“ mit dem CUnit-Ansatz getestet haben. Wir haben die temporäre Datei mit den CUnit-Testfunktionen geöffnet und geschlossen. Die CUnit-Testoperationen testen die Bibliotheksfunktionen durch Schreiben und Lesen aus der temporären Datei.

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

statische DATEI * Datei = NULL;
int init_suite1 ( Leere )
{
wenn ( NULL == ( Datei = föffnen ( 'MeineDatei.txt' , 'w +' ) ) ) {
Rückkehr -1 ;
}
anders {
Rückkehr 0 ;
}
}

int clean_suite1 ( Leere )
{
wenn ( 0 ! = fschließen ( Datei ) ) {
Rückkehr -1 ;
}
anders {
Datei = NULL;
Rückkehr 0 ;
}
}


void test_fprintf ( Leere )
{
Ganzzahl x1 = 10 ;

wenn ( NULL ! = Datei ) {
WITH_ASSERT ( zwei == fprintf ( Datei , 'Q \n ' ) ) ;
WITH_ASSERT ( 7 == fprintf ( Datei , 'x1 = %d' , x1 ) ) ;
}
}

void test_fread ( Leere )
{
unsigned char Puffer [ zwanzig ] ;

wenn ( NULL ! = Datei ) {
zurückspulen ( Datei ) ;
WITH_ASSERT ( 9 == Angst ( Puffer, Größe von ( unsigned char ) , zwanzig , Datei ) ) ;
WITH_ASSERT ( 0 == strncmp ( Puffer, 'Q \n x1 = 10' , 9 ) ) ;
}
}

int Haupt ( )
{
CU_pSuite pSuite = NULL;
wenn ( CUE_SUCCESS ! = CU_initialize_registry ( ) )
Rückkehr CU_get_error ( ) ;
pSuite = CU_add_suite ( 'Suite1' , init_suite1, clean_suite1 ) ;
wenn ( NULL == pSuite ) {
CU_cleanup_registry ( ) ;
Rückkehr CU_get_error ( ) ;
}
wenn ( ( NULL == CU_add_test ( pSuite, 'fprintf() Funktionstest' , test_fprintf ) ) ||
( NULL == CU_add_test ( pSuite, 'fread() Funktionstest' , test_fread ) ) )
{
CU_cleanup_registry ( ) ;
Rückkehr CU_get_error ( ) ;
}
CU_basic_set_mode ( CU_BRM_VERBOSE ) ;
CU_basic_run_tests ( ) ;
CU_cleanup_registry ( ) ;
Rückkehr CU_get_error ( ) ;
}







Innerhalb der Header-Datei haben wir die CUnit-Standardbibliothek „CUnit.h/Basic.h“ definiert. Dann haben wir „file“ als Zeiger auf die von den Tests verwendete Datei deklariert. Als nächstes haben wir die Funktion „init_suite1“ konstruiert, die die temporäre Datei „MyFile.txt“ öffnet und bei Erfolg den Wert Null zurückgibt; andernfalls wird ein Wert ungleich Null zurückgegeben. Um die Datei zu schließen, haben wir die Suite-Bereinigungsfunktion erstellt, die beim Schließen der temporären Datei bei einem Fehler auch einen Wert ungleich Null zurückgibt. Andernfalls wird beim erfolgreichen Schließen der temporären Datei der Wert Null erhalten. Dann haben wir einfach eine Funktion „test_fprintf“ implementiert, wo wir die Daten in die temporäre Datei „MYfile.txt“ eingefügt haben. Diese Testfunktionen haben auch die Anzahl der Bytes überprüft, die wir versucht haben, in die Datei zu schreiben.

Danach haben wir eine weitere Funktion für die Funktion „test_fread“ erstellt, um die fread-Methode zu testen. Hier haben wir durch die Funktion „test_fprinf()“ überprüft, ob die angegebenen Zeichen in den zuvor geschriebenen Daten vorhanden sind. Dann haben wir die Hauptfunktion, in der die eingerichteten und ausgeführten Tests behandelt werden. Wir haben die „pSuite“ in der main-Funktion definiert und die Registry mit der Testfunktion „CU_initialize_resgistry“ initialisiert. Wir haben auch die Funktion „CU_add_suite“ aufgerufen, um die Suite zur Registrierung hinzuzufügen, und die angegebenen Tests mit Hilfe der Funktion „CU_add_test“ zu den Suiten hinzugefügt.

Die grundlegenden CUnit-Testschnittstellen werden am Ende verwendet, um die Ergebnisse des Codes anzuzeigen. Beachten Sie, dass die Hauptfunktion bei erfolgreicher Ausführung einen „CUE_SUCCESS“ und bei nicht erfolgreicher Ausführung einen anderen „CUnit_error“-Code zurückgibt.

Wir haben den vorherigen Code für den CUnit-Test ausgeführt, der die Programmzusammenfassung und die Methodenmeldung der erfolgreichen Tests anzeigte.

Fazit

CUnit ist ein Kernframework, das verschiedene Benutzeroberflächen bereitstellt. Es ermöglicht uns die Verwaltung von Testsuiten, Testfällen und Testregistrierungen. Das Testen der Programme und das Anzeigen der Ergebnisse dieser Tests wird durch die Benutzeroberflächen erleichtert. Wir haben das CUnit-Testframework in C mit diesem Artikel behandelt. Wir demonstrierten die Installation und implementierten dann zwei laufende Programme in C-Sprache. Die zuvor getesteten Programme haben zu erfolgreichen Ergebnissen geführt.