CUnit в C

Cunit V C



Система CUnit используется для выполнения модульного тестирования на C, что позволяет администрировать и выполнять тесты. Он охватывает широкий спектр утверждений для тестирования часто используемых типов данных и использует простую архитектуру для создания тестовых структур. Пользовательский тестовый код связан с CUnit, разработанным как статическая библиотека. Мы можем проверить производительность задач и функций программы C, используя тестовую среду CUnit. Каждая конкретная задача программы C имеет различные входные условия и выходные ограничения. Чтобы использовать CUnit для тестирования программы C, мы должны сначала установить его в нашей системе. Шаги по установке CUnit описаны ниже.

Как использовать CUnit Framework в Ubuntu 22.04

Чтобы использовать среду тестирования CUnit в нашей системе, нам необходимо выполнить шаги установки. Эти шаги относятся к системе Ubuntu 22.04. Перед установкой мы сначала обновили нашу систему. Системе требовалась привилегия sudo для обновления с помощью команды apt.








Чтобы получить привилегии sudo, терминал запросил аутентификацию у пользователя sudo. Затем обновите системные пакеты и их зависимости, как показано ниже.




Теперь мы установили инфраструктуру CUnit с помощью следующей команды. Эта команда может установить пакеты libcunitl, libcunitl-doc и libcunitl-dev из репозитория пакетов.




После выполнения команды установки CUnit требуется пароль пользователя. Основные пакеты CUnit были установлены в Ubuntu 22.04.





Пример 1

Мы завершили этап установки фреймворка CUnit в предыдущем разделе. Теперь мы протестировали метод суммы и разности, чтобы увидеть ожидаемые результаты в следующем примере с использованием среды тестирования CUnit.



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

int init_suite ( пустота ) { возвращаться 0 ; }
int clean_suite ( пустота ) { возвращаться 0 ; }

целая сумма ( ты а1, ты б1 )

{
целое разрешение1;
разрешение1 =а1+b1;
возвращаться разрешение1;
}

интервал MyDiff ( интервал a2, интервал b2 )

{
целое разрешение2;
разрешение2 =а2-б2;
возвращаться разрешение2;
}

недействительным test_MySum ( пустота )
{
WITH_ASSERT ( 4 == Моя сумма ( два , два ) ) ;
WITH_ASSERT ( 8 == Моя сумма ( 5 , 3 ) ) ;
WITH_ASSERT ( два == Моя сумма ( - два , 4 ) ) ;
WITH_ASSERT ( 7 == Моя сумма ( 0 , 7 ) ) ;
}


недействительный test_MyDiff ( пустота )
{
WITH_ASSERT ( 3 ==Мои различия ( 5 , два ) ) ;
WITH_ASSERT ( - 4 ==Мои различия ( 4 , 8 ) ) ;
WITH_ASSERT ( - 7 ==Мои различия ( - 3 , 4 ) ) ;
WITH_ASSERT ( - 9 ==Мои различия ( 0 , 9 ) ) ;
}


внутренний основной ( пустота )
{

CU_pSuite pSuite1,pSuite2 = NULL;

если ( CUE_SUCCESS ! = CU_initialize_registry ( ) )
возвращаться CU_get_error ( ) ;

pSuite1 = CU_add_suite ( «Тестовый набор1» , init_suite, clean_suite ) ;
если ( NULL == pSuite1 ) {
CU_cleanup_registry ( ) ;
возвращаться CU_get_error ( ) ;
}

если ( ( NULL == CU_add_test ( pSuite1, ' \n \n Суммарная функция Тестирование \n \n ' , test_MySum ) ) )
{
CU_cleanup_registry ( ) ;
возвращаться CU_get_error ( ) ;
}

если ( ( NULL == CU_add_test ( pSuite1, ' \n \n Разностная функция Тестирование \n \n ' , test_MyDiff ) ) )
{
CU_cleanup_registry ( ) ;
возвращаться CU_get_error ( ) ;
}

CU_basic_run_tests ( ) ;

CU_cleanup_registry ( ) ;
возвращаться CU_get_error ( ) ;
}







Во-первых, для создания структуры CUnit мы вставили библиотеку CUnit «CUnit/Basic.h» с включенным ключевым словом. Эта библиотека C предназначена для фреймворков модульного тестирования и предлагает простой интерфейс вывода на консоль. Затем мы добавили в нашу программу для тестирования две функции: «init_suite» для инициализации функции набора и «clean_suite» для очистки функции набора.

Затем мы создали методы «MySum» и «MyDiff», которые должны быть протестированы CUnit. Мы вызвали конструктор для этих функций, который содержит переменные, над которыми были выполнены операции суммирования и разности. Затем мы установили функцию «test_MySum» для тестирования. Внутри функции мы использовали метод «CU_ASSERT», в котором задаются выражения инициализации для суммы. Как и в случае с «test_MySum», мы создали функцию test_MyDiff для проверки выражения для различных операций с использованием метода «CU_ASSERT».

Затем у нас есть код запуска CUnit внутри основного метода. Здесь мы создали два набора, «pSuite1» и «pSuite2», из метода «CU_pSuite» и присвоили этим наборам значение NULL. Мы создали эти комплекты для выполнения теста CUnit, который необходимо зарегистрировать в тестовом реестре. Прежде чем добавлять наборы в «test_registry», мы создали реестр и инициализировали его с «условием if». Мы использовали метод «CU_initialze_registry()» для создания реестра для тестовых наборов.

После этого мы добавили pSuite1 в тестовый реестр, вызвав метод «CU_add_suite» CUnit. После этого мы добавили наши тесты «test_MySum» и «test_MyDiff» в указанные наборы, используя метод «CU_add_test()». В конце мы отобразили результаты теста CUnit, вызвав метод «CU_basic_run_tests()», и очистили реестр после успешного отображения результатов. Ошибка, возникшая при выполнении тестов CUnit, будет вызвана функцией «CU_get_error()».

Предыдущий тестовый файл CUnit сохраняется как файл mytest.c. Мы выполнили этот файл C с помощью команды GCC. Мы использовали флаг -lcunit для выполнения тестового файла CUnit. С помощью этой команды наш код компилируется. Затем мы выполнили файл mytest, и он показал ожидаемые результаты теста CUnit, поскольку все тесты были пройдены без сбоев.

Пример 2

У нас есть еще один пример, в котором мы протестировали два метода обработки файлов, «fread» и «fprintf», с помощью подхода CUnit. Мы открывали и закрывали временный файл с помощью тестовых функций CUnit. Тестовые операции CUnit проверяют функции библиотеки путем записи и чтения из временного файла.

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

статический ФАЙЛ * файл = НУЛЬ;
интервал init_suite1 ( пустота )
{
если ( НУЛЬ == ( файл = fоткрыть ( 'Мой файл.txt' , 'ж +' ) ) ) {
возвращаться -1 ;
}
еще {
возвращаться 0 ;
}
}

интервал clean_suite1 ( пустота )
{
если ( 0 ! = fзакрыть ( файл ) ) {
возвращаться -1 ;
}
еще {
файл = НУЛЬ;
возвращаться 0 ;
}
}


недействительный test_fprintf ( пустота )
{
интервал х1 = 10 ;

если ( НУЛЕВОЙ ! знак равно файл ) {
WITH_ASSERT ( два == fprintf ( файл , 'Q \n ' ) ) ;
WITH_ASSERT ( 7 == fprintf ( файл , 'x1 = %d' , х1 ) ) ;
}
}

недействительным test_fread ( пустота )
{
беззнаковый символьный буфер [ 20 ] ;

если ( НУЛЕВОЙ ! знак равно файл ) {
перематывать ( файл ) ;
WITH_ASSERT ( 9 == фред ( буфер, размер ( беззнаковый символ ) , 20 , файл ) ) ;
WITH_ASSERT ( 0 == стрнкмп ( буфер, 'Q \n х1 = 10 дюймов , 9 ) ) ;
}
}

внутренний основной ( )
{
CU_pSuite pSuite = NULL;
если ( CUE_SUCCESS ! = CU_initialize_registry ( ) )
возвращаться CU_get_error ( ) ;
pSuite = CU_add_suite ( 'Люкс1' , init_suite1, clean_suite1 ) ;
если ( NULL == pSuite ) {
CU_cleanup_registry ( ) ;
возвращаться CU_get_error ( ) ;
}
если ( ( NULL == CU_add_test ( люкс, 'Проверка функции fprintf()' , test_fprintf ) ) ||
( NULL == CU_add_test ( люкс, 'Проверка функции fread()' , test_fread ) ) )
{
CU_cleanup_registry ( ) ;
возвращаться CU_get_error ( ) ;
}
CU_basic_set_mode ( CU_BRM_VERBOSE ) ;
CU_basic_run_tests ( ) ;
CU_cleanup_registry ( ) ;
возвращаться CU_get_error ( ) ;
}







В заголовочном файле мы определили стандартную библиотеку CUnit «CUnit.h/Basic.h». Затем мы объявили «file» как указатель на файл, используемый тестами. Затем мы создали функцию «init_suite1», которая открывает временный файл «MyFile.txt» и возвращает нулевое значение в случае успеха; в противном случае будет возвращено ненулевое значение. Чтобы закрыть файл, мы создали функцию очистки пакета, которая также возвращает ненулевое значение в случае сбоя при закрытии временного файла. В противном случае при успешном закрытии временного файла будет получено нулевое значение. Затем мы просто реализовали функцию «test_fprintf», где мы вставили данные во временный файл «MYfile.txt». Эти тестовые функции также проверяли количество байтов, которые мы пытались записать в файл.

После этого мы создали еще одну функцию для функции «test_fread», чтобы протестировать метод fread. Здесь мы проверили наличие указанных символов в ранее записанных данных с помощью функции «test_fprinf()». Затем у нас есть основная функция, в которой обрабатываются настроенные и выполненные тесты. Мы определили «pSuite» в основной функции и инициализировали реестр с помощью тестовой функции «CU_initialize_resgistry». Мы также вызвали функцию «CU_add_suite», чтобы добавить пакет в реестр, и добавили указанные тесты в наборы с помощью функции «CU_add_test».

Базовые тестовые интерфейсы CUnit используются в конце для отображения результатов кода. Обратите внимание, что основная функция возвращает «CUE_SUCCESS» при успешном выполнении и другой код «CUnit_error» при неудачном выполнении.

Мы запустили предыдущий код для теста CUnit, который отображал сводку программы и сообщение об успешном выполнении теста.

Вывод

CUnit — это основная структура, предоставляющая различные пользовательские интерфейсы. Это позволяет нам управлять наборами тестов, тестовыми наборами и тестовыми реестрами. Пользовательские интерфейсы упрощают тестирование программ и просмотр результатов этих тестов. В этой статье мы рассмотрели среду тестирования CUnit на C. Мы продемонстрировали установку, а затем реализовали две запущенные программы на языке Си. Предыдущие протестированные программы дали успешные результаты.