CUnidade em C

Cunidade Em C



O sistema CUnit é utilizado para realizar os testes unitários em C, o que possibilita a administração e execução dos testes. Ele cobre uma gama diversificada de asserções para testar tipos de dados comumente usados ​​e utiliza uma arquitetura simples para criar estruturas de teste. O código de teste do usuário está vinculado ao CUnit, projetado como uma biblioteca estática. Podemos examinar o desempenho das tarefas e funções do programa C usando a estrutura de teste CUnit. Cada tarefa específica do programa C tem diferentes circunstâncias de entrada e limitações de saída. Para usar o CUnit para testar o programa C, devemos instalá-lo primeiro em nosso sistema. As etapas para instalar o CUnit estão descritas abaixo.

Como usar o CUnit Framework no Ubuntu 22.04

Para utilizar a estrutura de teste CUnit em nosso sistema, precisamos seguir as etapas de instalação. Essas etapas se aplicam ao sistema Ubuntu 22.04. Antes da instalação, primeiro atualizamos nosso sistema. O sistema exigia o privilégio sudo para ser atualizado com o comando apt.








Para adquirir privilégios sudo, o terminal solicitou a autenticação do usuário sudo. Em seguida, atualize os pacotes do sistema e suas dependências, conforme mostrado abaixo.




Agora, instalamos a estrutura CUnit usando o seguinte comando. Este comando pode instalar os pacotes libcunitl, libcunitl-doc e libcunitl-dev do repositório de pacotes.




Uma vez que o comando de instalação do CUnit é executado, a senha do usuário é necessária. Os pacotes essenciais CUnit foram instalados em nosso Ubuntu 22.04.





Exemplo 1

Concluímos a etapa de instalação da estrutura CUnit na seção anterior. Agora, testamos o método de soma e diferença para ver os resultados esperados no exemplo a seguir usando a estrutura de teste CUnit.



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

int init_suite ( vazio ) { Retorna 0 ; }
int clean_suite ( vazio ) { Retorna 0 ; }

int MinhaSoma ( você é a1, você é b1 )

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

int MyDiff ( int a2, int b2 )

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

void teste_MinhaSoma ( vazio )
{
WITH_ASSERT ( 4 ==MinhaSoma ( dois , dois ) ) ;
WITH_ASSERT ( 8 ==MinhaSoma ( 5 , 3 ) ) ;
WITH_ASSERT ( dois ==MinhaSoma ( - dois , 4 ) ) ;
WITH_ASSERT ( 7 ==MinhaSoma ( 0 , 7 ) ) ;
}


void test_MyDiff ( vazio )
{
WITH_ASSERT ( 3 ==MeuDif ( 5 , dois ) ) ;
WITH_ASSERT ( - 4 ==MeuDif ( 4 , 8 ) ) ;
WITH_ASSERT ( - 7 ==MeuDif ( - 3 , 4 ) ) ;
WITH_ASSERT ( - 9 ==MeuDif ( 0 , 9 ) ) ;
}


int principal ( vazio )
{

CU_pSuite pSuite1,pSuite2 = NULL;

E se ( CUE_SUCCESS ! = CU_initialize_registry ( ) )
Retorna CU_get_error ( ) ;

pSuite1 = CU_add_suite ( 'Suíte de Teste1' , init_suite, clean_suite ) ;
E se ( NULL == pSuite1 ) {
CU_cleanup_registry ( ) ;
Retorna CU_get_error ( ) ;
}

E se ( ( NULL == CU_add_test ( pSuite1, ' \n \n Teste de função de soma \n \n ' , test_MinhaSoma ) ) )
{
CU_cleanup_registry ( ) ;
Retorna CU_get_error ( ) ;
}

E se ( ( NULL == CU_add_test ( pSuite1, ' \n \n Teste de função de diferença \n \n ' , test_MyDiff ) ) )
{
CU_cleanup_registry ( ) ;
Retorna CU_get_error ( ) ;
}

CU_basic_run_tests ( ) ;

CU_cleanup_registry ( ) ;
Retorna CU_get_error ( ) ;
}







Primeiro, para gerar a estrutura CUnit, inserimos a biblioteca CUnit “CUnit/Basic.h” com a palavra-chave incluída. Esta biblioteca C é para estruturas de teste de unidade e oferece uma interface de saída de console simples. Em seguida, adicionamos duas funções, “init_suite” para a inicialização da função suite e “clean_suite” para a limpeza da função suite, ao nosso programa para teste.

Em seguida, construímos os métodos “MySum” e “MyDiff”, para serem testados pelo CUnit. Chamamos o construtor para essas funções, que contém as variáveis ​​nas quais as operações de soma e diferença foram executadas. Em seguida, estabelecemos uma função como “test_MySum” para testar. Dentro da função, empregamos o método “CU_ASSERT”, onde são atribuídas as expressões init para a soma. Igual a “test_MySum”, construímos a função test_MyDiff para testar a expressão para diferentes operações usando o método “CU_ASSERT”.

Então, temos o código do CUnit runner dentro do método main. Aqui, criamos duas suítes, “pSuite1” e “pSuite2”, a partir do método “CU_pSuite” e atribuímos a essas suítes um valor NULL. Criamos essas suítes para executar o teste CUnit que deve ser registrado no registro de teste. Antes de adicionar as suítes ao “test_registry”, criamos o registro e inicializamos com a “condição if”. Usamos o método “CU_initialze_registry()” para criar o registro para suítes de teste.

Depois disso, adicionamos o pSuite1 ao registro de teste invocando o método “CU_add_suite” do CUnit. Depois disso, adicionamos nossos testes, “test_MySum” e “test_MyDiff”, às suítes especificadas utilizando o método “CU_add_test()”. No final, exibimos os resultados do teste CUnit chamando o método “CU_basic_run_tests()” e limpamos o registro assim que os resultados foram exibidos com sucesso. O erro encontrado ao fazer os testes CUnit será lançado pela função “CU_get_error()”.

O arquivo de teste CUnit anterior é salvo como o arquivo mytest.c. Executamos este arquivo C com o comando GCC. Usamos o sinalizador -lcunit para a execução do arquivo de teste CUnit. Com este comando, nosso código é compilado. Em seguida, executamos o arquivo mytest, e ele mostrou os resultados esperados do teste CUnit, pois todos os testes foram aprovados sem nenhuma falha.

Exemplo 2

Temos outro exemplo onde testamos os dois métodos de manipulação de arquivos, “fread” e “fprintf”, pela abordagem CUnit. Abrimos e fechamos o arquivo temporário usando as funções de teste CUnit. As operações de teste CUnit testam as funções da biblioteca gravando e lendo do arquivo temporário.

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

ARQUIVO estático * Arquivo = NULO;
int init_suite1 ( vazio )
{
E se ( NULO == ( Arquivo = fopen ( 'MeuArquivo.txt' , 'w +' ) ) ) {
Retorna -1 ;
}
senão {
Retorna 0 ;
}
}

int clean_suite1 ( vazio )
{
E se ( 0 ! = fpróximo ( Arquivo ) ) {
Retorna -1 ;
}
senão {
Arquivo = NULO;
Retorna 0 ;
}
}


void test_fprintf ( vazio )
{
int x1 = 10 ;

E se ( NULO ! = Arquivo ) {
WITH_ASSERT ( dois == fprintf ( Arquivo , 'Q \n ' ) ) ;
WITH_ASSERT ( 7 == fprintf ( Arquivo , 'x1 = %d' , x1 ) ) ;
}
}

void test_fread ( vazio )
{
buffer de caractere não assinado [ vinte ] ;

E se ( NULO ! = Arquivo ) {
rebobinar ( Arquivo ) ;
WITH_ASSERT ( 9 == medo ( buffer, tamanho de ( caracter não identifcado ) , vinte , Arquivo ) ) ;
WITH_ASSERT ( 0 == strncmp ( amortecedor, 'Q \n x1 = 10' , 9 ) ) ;
}
}

int principal ( )
{
CU_pSuite pSuite = NULL;
E se ( CUE_SUCCESS ! = CU_initialize_registry ( ) )
Retorna CU_get_error ( ) ;
pSuite = CU_add_suite ( 'Suíte1' , init_suite1, clean_suite1 ) ;
E se ( NULL == pSuite ) {
CU_cleanup_registry ( ) ;
Retorna CU_get_error ( ) ;
}
E se ( ( NULL == CU_add_test ( pSuite, 'teste da função fprintf()' , teste_fprintf ) ) ||
( NULL == CU_add_test ( pSuite, Teste da função 'fread()' , test_fread ) ) )
{
CU_cleanup_registry ( ) ;
Retorna CU_get_error ( ) ;
}
CU_basic_set_mode ( CU_BRM_VERBOSE ) ;
CU_basic_run_tests ( ) ;
CU_cleanup_registry ( ) ;
Retorna CU_get_error ( ) ;
}







Dentro do arquivo de cabeçalho, definimos a biblioteca padrão CUnit “CUnit.h/Basic.h”. Em seguida, declaramos “arquivo” como um ponteiro para o arquivo utilizado pelos testes. Em seguida, construímos a função “init_suite1” que abre o arquivo temporário “MyFile.txt” e retorna o valor zero em caso de sucesso; caso contrário, um valor diferente de zero será retornado. Para fechar o arquivo, criamos a função de limpeza do conjunto, que também retorna um valor diferente de zero em caso de falha ao fechar o arquivo temporário. Caso contrário, ao fechar com sucesso o arquivo temporário, o valor zero é obtido. Então, simplesmente implementamos uma função “test_fprintf” onde inserimos os dados no arquivo temporário “MYfile.txt”. Essas funções de teste também verificaram o número de bytes que tentamos gravar no arquivo.

Depois disso, criamos outra função para a função “test_fread” para testar o método fread. Aqui, verificamos que os caracteres especificados estão presentes nos dados escritos anteriormente pela função “test_fprinf()”. Em seguida, temos a função principal onde são tratados os testes configurados e executados. Definimos o “pSuite” na função principal e inicializamos o registro usando a função de teste “CU_initialize_resgistry”. Também chamamos a função “CU_add_suite” para adicionar o conjunto ao registro e adicionamos os testes especificados aos conjuntos com a ajuda da função “CU_add_test”.

As interfaces básicas de teste CUnit são usadas no final para exibir os resultados do código. Observe que a função principal retorna um “CUE_SUCCESS” na execução bem-sucedida e um código diferente “CUnit_error” na execução malsucedida.

Executamos o código anterior para o teste CUnit, que exibia o resumo do programa e a mensagem do método dos testes bem-sucedidos.

Conclusão

CUnit é uma estrutura central que fornece várias interfaces de usuário. Ele nos permite gerenciar suítes de teste, casos de teste e registros de teste. Testar os programas e ver os resultados desses testes é facilitado pelas interfaces do usuário. Cobrimos a estrutura de teste CUnit em C com este artigo. Demonstramos a instalação e depois implementamos dois programas em execução na linguagem C. Os programas anteriores testados deram resultados bem sucedidos.