483 votos

La Unidad De Pruebas De Código C

He trabajado en un sistema embebido este verano escrito en la recta C. fue un proyecto que la empresa para la que trabajo se habían tomado. Me he vuelto bastante acostumbrados a escribir pruebas unitarias en Java usando JUnit, pero estaba en una pérdida en cuanto a la mejor manera de escribir tests de unidad para código existente (que necesitaba refactorización) así como el nuevo código añadido al sistema.

Hay proyectos, hay que hacer pruebas de unidad llanura código C tan fácil como unidad de pruebas de código Java con JUnit? Cualquier visión que se aplican específicamente al desarrollo integrado (compilación cruzada de brazo-plataforma linux) sería muy apreciado.

271voto

Adam Rosenfield Puntos 176408

Un marco de pruebas unitarias en C es de Verificación; una lista de marcos de pruebas de unidad en C, se puede encontrar aquí y que se reproduce a continuación. Dependiendo de cómo muchos de la biblioteca estándar de funciones en tiempo de ejecución tiene, puede o no ser capaz de utilizar uno de esos.

AceUnit

AceUnit (Advanced C Embebido y Unidad) se define a sí mismo como un cómodo C código marco de pruebas unitarias. Intenta imitar a la JUnit 4.x y incluye la reflexión-como capacidades. AceUnit puede ser utilizado en la restricción de los recursos de los entornos, por ejemplo. desarrollo de software embebido, y es importante destacar que funciona muy bien en ambientes donde no se puede incluir un único archivo de encabezado estándar y no puede invocar una norma única de la función de C de la norma ANSI / ISO C de bibliotecas. También tiene un puerto de Windows. No utilice horquillas para interceptar las señales, aunque los autores han expresado su interés en la adición de esta característica. Ver el AceUnit página principal.

GNU Autounit

Mucho a lo largo de las mismas líneas de Verificación, incluyendo la bifurcación para ejecutar pruebas de unidad en un espacio de direcciones independiente (de hecho, el autor original de la Verificación tomaron la idea de GNU Autounit). GNU Autounit utiliza GLib ampliamente, lo cual significa que la vinculación y la necesidad de opciones especiales, pero esto no puede ser un gran problema para usted, especialmente si usted ya está usando GTK o Simplista. Consulte la GNU Autounit página principal.

cUnit

También se utiliza Simplista, pero no de la horquilla para proteger el espacio de direcciones de la unidad de pruebas.

CUnit

Estándar de C, con planes para Win32 GUI de la aplicación. Actualmente no horquilla o de otra manera de proteger el espacio de direcciones de la unidad de pruebas. En el desarrollo temprano. Ver la página de inicio de CUnit.

Lindo

Un marco simple con un solo .c y un archivo .h que colocar en el árbol de código fuente. Ver el más Lindo de la página principal.

CppUnit

El premier marco de pruebas unitarias para C++; también se puede utilizar para probar el código de C. Es estable, desarrollado activamente, y tiene una interfaz gráfica de usuario. Las principales razones de no uso CppUnit para C son los primeros que es bastante grande, y en segundo lugar usted tiene que escribir sus pruebas en C++, lo que significa que usted necesita un compilador de C++. Si estos no suenan como las preocupaciones, es definitivamente vale la pena considerar, junto con otros de C++ marcos de pruebas de unidad. Ver el CppUnit página principal.

embUnit

embUnit (Incorporado Unidad) es otro unit test framework para sistemas embebidos. Este parece ser sustituidas por AceUnit. Incorporado Unidad página principal.

MinUnit

Un conjunto mínimo de macros y eso es todo! El punto es mostrar lo fácil que es a prueba la unidad de su código. Ver el MinUnit página principal.

CUnit para el Señor Ando

Un CUnit aplicación que es bastante nuevo, y al parecer todavía en desarrollo temprano. Ver la CUnit para el Señor Ando página principal.

110voto

mikelong Puntos 2034

Personalmente me gusta el de Google en el marco de Prueba.

La verdadera dificultad en la prueba de C código está rompiendo las dependencias de los módulos externos de modo que usted puede aislar el código en unidades. Esto puede ser especialmente problemático cuando usted está tratando de conseguir pruebas alrededor de código heredado. En este caso, a menudo me encuentro con el enlazador para el uso de los talonarios de funciones en las pruebas.

Esto es lo que las personas se refieren cuando hablan del "costuras". En C, su única opción es usar el pre-procesador o el enlazador para burlarse de su dependencia.

Una típica serie de pruebas en una de mis obras, 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));
}

Nota que en realidad se está incluyendo el archivo C y no el archivo de encabezado. Esto le da la ventaja de tener acceso a todos los miembros de datos estáticos. Aquí me burlarse de mi registrador (que podría ser en logger.o y dar un vacío de la aplicación. Esto significa que el archivo de prueba compila y enlaces de manera independiente al resto de la base de código y se ejecuta en el aislamiento.

Como para la cruz de compilar el código, para que esto funcione se necesitan buenas instalaciones en el destino. He hecho esto con googletest cruz compilado para Linux en una arquitectura PowerPC. Esto tiene sentido porque no tiene un total de shell y os a recoger sus resultados. Para los menos ricos entornos (que puedo clasificar como nada sin un sistema operativo completo) sólo debe generar y ejecutar en el host. Usted debe hacer esto de todos modos, así que usted puede ejecutar las pruebas de manera automática como parte de la construcción.

Me parece pruebas de código C++ es generalmente mucho más fácil debido al hecho de que OO código es en general mucho menos unida de procedimiento (por supuesto, esto depende en gran medida del estilo de codificación). También en C++ puede utilizar trucos como la inyección de dependencia y el método primordial para conseguir las costuras en el código que está encapsulado.

Michael Feathers tiene un excelente libro acerca de las pruebas de código de la herencia. En uno de los capítulos que cubre técnicas para tratar con los no-OO código que recomiendo encarecidamente.

Edit: he escrito un post en el blog acerca de la unidad de pruebas del código de procedimiento, con fuente está disponible en GitHub.

Edit: Hay un nuevo libro que saldrá desde la Pragmática de los Programadores que aborda específicamente la unidad de pruebas de código C que recomiendo altamente.

91voto

Matteo Caprari Puntos 1195

Minunit es increíblemente simple marco de pruebas unitarias. Lo estoy usando a prueba la unidad c del microcontrolador código para el avr.

36voto

Michael Burr Puntos 181287

Actualmente estoy usando el más Lindo de la unidad en el marco de prueba:

http://cutest.sourceforge.net/

Es ideal para sistemas embebidos como es muy ligero y simple. Yo no tenía problemas para conseguir que funcione en la plataforma de destino, así como en el escritorio. Además de escribir los tests de unidad, todo lo que se requiere es:

  • un archivo de encabezado incluido donde usted está llamando a la más Linda de las rutinas de
  • un simple 'C' archivo compilado/vinculado en la imagen
  • un código simple agregado al principal a configurar y llamar a la unidad de pruebas - I sólo tienen esto en un especial de main() la función que se compila si UNITTEST se define durante la construcción.

El sistema debe apoyar un montón y algunos stdio funcionalidad (que no todos los sistemas integrados). Pero el código es lo suficientemente simple como usted probablemente podría trabajar en alternativas a los requisitos de si la plataforma no dispone de ellos.

Con algo de uso juicioso de extern "C"{} los bloques también se admite la prueba de C++ bien.

22voto

Ovid Puntos 7256

También es posible que desee echar un vistazo a libtap, un C marco de pruebas de que las salidas de la Prueba de Cualquier Protocolo (TAP), que se integra bien con una gran variedad de herramientas para esta tecnología. Se utiliza principalmente en el dinámico mundo de lengua, pero es fácil de usar y cada vez más popular.

Un ejemplo:

#include <tap.h>

int main () {
    plan(5);

    ok(3 == 3);
    is("fnord", "eek", "two different strings not that way?");
    ok(3 <= 8732, "%d <= %d", 3, 8732);
    like("fnord", "f(yes|no)r*[a-f]$");
    cmp_ok(3, ">=", 10);

    done_testing();
}

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X