Unidad en C

Unidad En C



El sistema CUnit se utiliza para realizar las pruebas unitarias en C, lo que permite la administración y ejecución de las pruebas. Cubre una amplia gama de aserciones para probar tipos de datos de uso común y utiliza una arquitectura simple para crear estructuras de prueba. El código de prueba del usuario está vinculado con CUnit, que está diseñado como una biblioteca estática. Podemos examinar el desempeño de las tareas y funciones del programa C utilizando el marco de prueba CUnit. Cada tarea particular del programa C tiene diferentes circunstancias de entrada y limitaciones de salida. Para usar CUnit para probar el programa C, debemos instalarlo primero en nuestro sistema. Los pasos para instalar CUnit se describen a continuación.

Cómo usar el marco CUnit en Ubuntu 22.04

Para utilizar el marco de prueba de CUnit en nuestro sistema, debemos seguir los pasos de instalación. Estos pasos se aplican al sistema Ubuntu 22.04. Antes de la instalación, primero actualizamos nuestro sistema. El sistema requería el privilegio sudo para actualizarse con el comando apt.








Para adquirir privilegios de sudo, la terminal solicitó la autenticación del usuario de sudo. Luego, actualice los paquetes del sistema y sus dependencias, como se muestra a continuación.




Ahora, hemos instalado el marco CUnit usando el siguiente comando. Este comando puede instalar los paquetes libcunitl, libcunitl-doc y libcunitl-dev desde el repositorio de paquetes.




Una vez que se ejecuta el comando de instalación de CUnit, se requiere la contraseña de usuario. Los paquetes esenciales de CUnit se han instalado en nuestro Ubuntu 22.04.





Ejemplo 1

Completamos el paso de instalación del marco CUnit en la sección anterior. Ahora, hemos probado el método de suma y diferencia para ver los resultados esperados en el siguiente ejemplo usando el marco de prueba CUnit.



#incluir
#incluir
#incluir
#incluir
#include 'UnidadCU/Básico.h'

int init_suite ( vacío ) { devolver 0 ; }
int clean_suite ( vacío ) { devolver 0 ; }

int MiSuma ( eres a1, eres b1 )

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

int mi diferencia ( int a2, int b2 )

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

anular prueba_MiSuma ( vacío )
{
CON_ASERTAR ( 4 ==MiSuma ( 2 , 2 ) ) ;
CON_ASERTAR ( 8 ==MiSuma ( 5 , 3 ) ) ;
CON_ASERTAR ( 2 ==MiSuma ( - 2 , 4 ) ) ;
CON_ASERTAR ( 7 ==MiSuma ( 0 , 7 ) ) ;
}


anular prueba_MiDiff ( vacío )
{
CON_ASERTAR ( 3 ==Midiferencia ( 5 , 2 ) ) ;
CON_ASERTAR ( - 4 ==Midiferencia ( 4 , 8 ) ) ;
CON_ASERTAR ( - 7 ==Midiferencia ( - 3 , 4 ) ) ;
CON_ASERTAR ( - 9 ==Midiferencia ( 0 , 9 ) ) ;
}


int principal ( vacío )
{

CU_pSuite pSuite1,pSuite2 = NULL;

si ( CUE_ÉXITO ! = CU_initialize_registry ( ) )
devolver CU_get_error ( ) ;

pSuite1 = CU_add_suite ( 'Suite de prueba 1' , init_suite, clean_suite ) ;
si ( NULL == pSuite1 ) {
CU_cleanup_registry ( ) ;
devolver CU_get_error ( ) ;
}

si ( ( NULL == CU_add_test ( pSuite1, ' \norte \norte Prueba de función de suma \norte \norte ' , prueba_MiSuma ) ) )
{
CU_cleanup_registry ( ) ;
devolver CU_get_error ( ) ;
}

si ( ( NULL == CU_add_test ( pSuite1, ' \norte \norte Prueba de función de diferencia \norte \norte ' , prueba_MiDiff ) ) )
{
CU_cleanup_registry ( ) ;
devolver CU_get_error ( ) ;
}

CU_basic_run_tests ( ) ;

CU_cleanup_registry ( ) ;
devolver CU_get_error ( ) ;
}

 

 

 

Primero, para generar la estructura CUnit, hemos insertado la biblioteca CUnit “CUnit/Basic.h” con la palabra clave incluida. Esta biblioteca de C es para marcos de prueba unitaria y ofrece una interfaz de salida de consola simple. Luego, agregamos dos funciones, 'init_suite' para la inicialización de la función de la suite y 'clean_suite' para la limpieza de la función de la suite, a nuestro programa para realizar pruebas.

A continuación, construimos métodos, 'MySum' y 'MyDiff', para ser probados por CUnit. Hemos llamado al constructor de estas funciones, que contiene las variables sobre las que se han realizado operaciones de suma y diferencia. A continuación, hemos establecido una función como 'test_MySum' para probar. Dentro de la función, hemos empleado el método “CU_ASSERT”, donde se asignan las expresiones de inicio para la suma. Al igual que 'test_MySum', hemos construido la función test_MyDiff para probar la expresión para diferentes operaciones usando el método 'CU_ASSERT'.

Luego, tenemos el código del corredor CUnit dentro del método principal. Aquí, hemos creado dos suites, 'pSuite1' y 'pSuite2', a partir del método 'CU_pSuite' y les asignamos un valor NULL a estas suites. Hemos creado estas suites para ejecutar la prueba CUnit que debe registrarse en el registro de prueba. Antes de agregar las suites al 'test_registry', creamos el registro y lo inicializamos con la 'condición if'. Hemos utilizado el método “CU_initialze_registry()” para crear el registro para las suites de prueba.

Después de eso, agregamos pSuite1 al registro de prueba invocando el método 'CU_add_suite' de CUnit. Después de eso, agregamos nuestras pruebas, 'test_MySum' y 'test_MyDiff', a las suites especificadas utilizando el método 'CU_add_test()'. Al final, mostramos los resultados de la prueba CUnit llamando al método 'CU_basic_run_tests()' y limpiamos el registro una vez que los resultados se mostraron correctamente. El error encontrado al realizar las pruebas de CUnit será arrojado por la función “CU_get_error()”.

El archivo de prueba de CUnit anterior se guarda como el archivo mytest.c. Hemos ejecutado este archivo C con el comando GCC. Hemos utilizado el indicador -lcunit para la ejecución del archivo de prueba CUnit. Con este comando se compila nuestro código. Luego, ejecutamos el archivo mytest y mostró los resultados esperados de la prueba CUnit, ya que todas las pruebas se aprobaron sin fallas.

Ejemplo 2

Tenemos otro ejemplo en el que hemos probado los dos métodos de manejo de archivos, 'fread' y 'fprintf', mediante el enfoque CUnit. Abrimos y cerramos el archivo temporal usando las funciones de prueba de CUnit. Las operaciones de prueba de CUnit prueban las funciones de la biblioteca escribiendo y leyendo desde el archivo temporal.

#incluir
#incluir
#incluir
#incluir
#include 'UnidadCU/Básico.h'

ARCHIVO estático * expediente = NULO;
int init_suite1 ( vacío )
{
    si ( NULO == ( expediente = abierto ( 'MiArchivo.txt' , 'w +' ) ) ) {
      devolver -1 ;
    }
    más {
      devolver 0 ;
    }
}

int clean_suite1 ( vacío )
{
    si ( 0 ! = cerrar ( expediente ) ) {
      devolver -1 ;
    }
    más {
      expediente = NULO;
      devolver 0 ;
    }
}


anular prueba_fprintf ( vacío )
{
entero x1 = 10 ;

    si ( NULO ! = expediente ) {
CON_ASERTAR ( 2 == fprintf ( expediente , 'Q \norte ' ) ) ;
CON_ASERTAR ( 7 == fprintf ( expediente , 'x1 = %d' , x1 ) ) ;
    }
}

anular prueba_fread ( vacío )
{
búfer de caracteres sin firmar [ 20 ] ;

    si ( NULO ! = expediente ) {
rebobinar ( expediente ) ;
CON_ASERTAR ( 9 == miedo ( búfer, tamaño de ( carácter sin firmar ) , 20 , expediente ) ) ;
CON_ASERTAR ( 0 == strncmp ( buffer, 'Q \norte x1 = 10' , 9 ) ) ;
    }
}

int principal ( )
{
CU_pSuite pSuite = NULL;
    si ( CUE_ÉXITO ! = CU_initialize_registry ( ) )
      devolver CU_get_error ( ) ;
pSuite = CU_add_suite ( 'Suite1' , init_suite1, clean_suite1 ) ;
    si ( NULL == pSuite ) {
CU_cleanup_registry ( ) ;
      devolver CU_get_error ( ) ;
    }
    si ( ( NULL == CU_add_test ( suite, 'Prueba de la función fprintf()' , prueba_fprintf ) ) ||
        ( NULL == CU_add_test ( suite, 'Prueba de la función fread()' , test_fread ) ) )
    {
CU_cleanup_registry ( ) ;
      devolver CU_get_error ( ) ;
    }
CU_basic_set_mode ( CU_BRM_VERBOSE ) ;
CU_basic_run_tests ( ) ;
CU_cleanup_registry ( ) ;
    devolver CU_get_error ( ) ;
}

 

 

 

Dentro del archivo de encabezado, hemos definido la biblioteca estándar de CUnit 'CUnit.h/Basic.h'. Luego, declaramos 'archivo' como un puntero al archivo utilizado por las pruebas. A continuación, hemos construido la función 'init_suite1' que abre el archivo temporal 'MyFile.txt' y devuelve el valor cero en caso de éxito; de lo contrario, se devolverá un valor distinto de cero. Para cerrar el archivo, hemos creado la función de limpieza de la suite, que también devuelve un valor distinto de cero en caso de falla al cerrar el archivo temporal. De lo contrario, al cerrar con éxito el archivo temporal, se obtiene valor cero. Luego, simplemente hemos implementado una función “test_fprintf” donde hemos insertado los datos en el archivo temporal “MYfile.txt”. Estas funciones de prueba también verificaron la cantidad de bytes que intentamos escribir en el archivo.

Después de eso, creamos otra función para la función 'test_fread' para probar el método fread. Aquí, hemos comprobado que los caracteres especificados están presentes en los datos previamente escritos por la función 'test_fprintf()'. Luego, tenemos la función principal donde se manejan las pruebas configuradas y ejecutadas. Definimos el 'pSuite' en la función principal e inicializamos el registro usando la función de prueba 'CU_initialize_resgistry'. También llamamos a la función 'CU_add_suite' para agregar la suite al registro y agregamos las pruebas especificadas a las suites con la ayuda de la función 'CU_add_test'.

Las interfaces de prueba básicas de CUnit se utilizan al final para mostrar los resultados del código. Tenga en cuenta que la función principal devuelve un 'CUE_SUCCESS' cuando se ejecuta con éxito y un código diferente de 'CUnit_error' cuando no se ejecuta correctamente.

Hemos ejecutado el código anterior para la prueba CUnit, que mostraba el resumen del programa y el mensaje del método de las pruebas exitosas.

Conclusión

CUnit es un marco central que proporciona varias interfaces de usuario. Nos permite administrar suites de prueba, casos de prueba y registros de prueba. Las interfaces de usuario facilitan la prueba de los programas y la visualización de los resultados de esas pruebas. Hemos cubierto el marco de prueba CUnit en C con este artículo. Demostramos la instalación y luego implementamos dos programas en ejecución en lenguaje C. Los programas anteriores probados han dado resultados exitosos.