2008-09-29 14 views
18

¿Cómo se realizan pruebas similares a las pruebas unitarias en C? ¿Qué marco o haces otras pruebas como pruebas unitarias en el nivel del código?Cómo probar el código C

+1

http://stackoverflow.com/questions/65820/unit-testing-c-code – mmcdole

Respuesta

11

Check es un buen marco de pruebas para C.

2

XCode en Mac tiene algo que llamaron CPTest tipo de built-in. Hice una versión portátil que he publicado aquí

http://www.loufranco.com/blog/files/AppleCppUnitPort.html

me estaba apuntando a gcc en Windows, pero me imagino que sería trabajar en otros lugares, y es un marco muy simple, si usted quiere ver cómo implementar tal cosa .

0

Es posible que desee echar un vistazo a cfix - es un marco de pruebas unitarias especializado para plataformas Win32 y modo kernel NT. Admite C y C++.

0

Si se está utilizando Windows como su entorno de desarrollo, CUnitWin32 podría servir a su propósito

16

Personalmente me gusta la Google Test framework.

La verdadera dificultad para probar el código C es romper las dependencias de los módulos externos para que pueda aislar el código en unidades. Esto puede ser especialmente problemático cuando intenta hacerse pruebas del código heredado. En este caso, a menudo me encuentro utilizando el enlazador para usar funciones stubs en las pruebas.

Esto es a lo que la gente se refiere cuando hablan de "costuras". En C, su única opción es utilizar el preprocesador o el vinculador para simular sus dependencias.

Un conjunto de pruebas típico en uno de mis proyectos de C podría tener este aspecto:

#include "myimplementationfile.c" 
#include <gtest/gtest.h> 

// Mock out external dependency on mylogger.o 
void Logger_log(...){} 

TEST(FactorialTest, Zero) { 
    EXPECT_EQ(1, Factorial(0)); 
} 

Tenga en cuenta que en realidad se está incluyendo el archivo de C y no el archivo de cabecera. Esto brinda la ventaja de tener acceso a todos los miembros de datos estáticos. Aquí hago una maqueta de mi logger (que puede estar en logger.o y le doy una implementación vacía. Esto significa que el archivo de prueba compila y enlaza de forma independiente del resto de la base de código y se ejecuta de forma aislada.

En cuanto a compilando el código, para que esto funcione se necesitan buenas instalaciones en el objetivo. He hecho esto con googletest cross compiled en Linux en una arquitectura PowerPC. Esto tiene sentido porque allí tienes un shell completo y un sistema operativo para reunir los resultados. entornos enriquecidos (que clasifico como cualquier cosa sin un sistema operativo completo) solo debe compilar y ejecutar en el host. Debe hacer esto de todos modos para que pueda ejecutar las pruebas automáticamente como parte de la compilación.

Me parece que el código de prueba C++ generalmente es mucho más fácil debido al hecho de que el código OO está en en general, mucho menos acoplado que de procedimiento (por supuesto, esto depende mucho del estilo de codificación). También en C++ puedes usar trucos como la inyección de dependencia y la anulación de método para obtener un código que, de lo contrario, se encapsula.

Michael Feathers tiene un excellent book about testing legacy code. En un capítulo cubre técnicas para tratar con código no OO que recomiendo encarecidamente.

Editar: He escrito un blog post de las pruebas unitarias código de procedimiento, con source available on GitHub.

Cuestiones relacionadas