Pregunta

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 utilizando JUnit, pero estaba en una pérdida en cuanto a la mejor manera de escribir las pruebas unitarias de código existente (que necesitaba refactorización) así como el nuevo código añadido al sistema.

¿Hay alguna manera de hacer pruebas de unidad llanura C código tan fácil como pruebas unitarias de código Java con, por ejemplo, JUnit?Cualquier visión que se aplican específicamente al desarrollo integrado (compilación cruzada para arm-linux platform), sería muy apreciado.

¿Fue útil?

Solución

Un marco de pruebas unitarias en C es Verificación;una lista de marcos de pruebas de unidad en C, se puede encontrar aquí y es que se reproducen 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 usar uno de esos.

AceUnit

AceUnit (Advanced C e Incorporado Unidad) se define a sí mismo como un cómodo C código de la unidad en el marco de prueba.Intenta imitar a la JUnit 4.x e incluye la reflexión-como capacidades.AceUnit puede ser utilizado en la restricción de recursos entornos, por ejemplo,desarrollo de software embebido, y es importante destacar que funciona muy bien en entornos 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 bibliotecas.También tiene un puerto de Windows.No utilizar 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 de inicio.

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 puede no ser un gran problema para usted, especialmente si usted ya está usando GTK o Simplista.Ver el GNU Autounit página de inicio.

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 una 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 el CUnit página de inicio.

Más lindo

Un marco simple con sólo uno .c y uno .h archivo que colocar en el árbol de código fuente.Ver el Más lindo de la página de inicio.

CppUnit

El premier marco de pruebas unitarias para C++;también se puede utilizar para probar el código 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 segundo tienes que escribir las 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 C++ marcos de pruebas de unidad.Ver el CppUnit página de inicio.

embUnit

embUnit (Incorporado Unidad) es otra unidad en el marco de prueba para sistemas embebidos.Este parece ser sustituidas por AceUnit. Incorporado Unidad página de inicio.

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 de inicio.

CUnit para el Sr.Ando

Una de CUnit aplicación que es bastante nuevo, y al parecer todavía en desarrollo temprano.Ver el CUnit para el Sr.Ando página de inicio.

Esta lista fue actualizada por última vez en Marzo de 2008.

Más marcos:

CMocka

CMocka es un marco de pruebas para C con soporte para objetos ficticios.Es fácil de usar y de configurar.

Ver el CMocka página de inicio.

Criterio

El criterio es una cruz-plataforma C marco de pruebas unitarias de apoyo automático de inscripción en el examen, con parámetros de pruebas, teorías, y que puede dar salida a varios formatos, incluyendo TOQUE y JUnit XML.Cada prueba se ejecuta en su propio proceso, de modo que las señales y las caídas pueden ser divulgados o la prueba si es necesario.

Ver el Criterio de página de inicio para obtener más información.

HWUT

HWUT es un general de la Unidad de Prueba de la herramienta con un gran soporte para la C.Puede ayudar a crear Makefiles, generan una enorme casos de prueba codificada en mínimos "de la iteración de las tablas', caminar a lo largo de máquinas de estado, generar C-recibos de pago y más.El enfoque general es bastante singular:Los veredictos están basados en la "buena stdout/mala stdout'.La función de comparación, sin embargo, es flexible.Por lo tanto, cualquier tipo de secuencia de comandos puede ser utilizado para verificar.Se puede aplicar a cualquier lenguaje que puede producir la salida estándar.

Ver el HWUT página de inicio.

CGreen

Un moderno y portátil, el lenguaje de la cruz de la unidad de pruebas y se burla de marco para C y C++.Se ofrece una opción de BDD de notación, una burla de la biblioteca, la capacidad de correr en un solo proceso (facilita la eliminación de errores).Un test runner que descubre automáticamente las funciones de prueba está disponible.Pero usted puede crear su propia programación.

Todas esas características (y más) se explican en el CGreen manual.

Wikipedia ofrece una lista detallada de C marcos de pruebas de unidad bajo Lista de marcos de pruebas de unidad:C

Otros consejos

Personalmente me gusta el Google framework de Pruebas.

La verdadera dificultad en la prueba de código de C romper 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 la gente se refiere cuando hablan del "las 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 uno de mis C proyectos 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 el registrador.oh, y dar un vacío de la aplicación.Esto significa que el archivo de prueba compila y enlaces de forma independiente del resto de la base de código y ejecuta en forma aislada.

Como para la cruz de compilar el código, para que esto funcione tiene buenas instalaciones en el destino.He hecho esto con googletest cruz compilado para Linux en una arquitectura PowerPC.Esto tiene sentido porque no tiene una concha completa 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 automáticamente como parte de la construcción.

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

Michael Plumas 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.

Editar:He escrito un blog acerca de la unidad de pruebas del código de procedimiento, con fuente disponible en GitHub.

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

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

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 la escritura de la unidad de pruebas, todo lo que se requiere es:

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

El sistema necesita para apoyar un montón y algunos stdio funcionalidad (que no todos los sistemas embebidos tienen).Pero el código es bastante simple que es probable que pueda trabajar en alternativas a los requisitos de si la plataforma no dispone de ellos.

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

Digo casi el mismo como ratkok pero si usted tiene un incorporado vuelta de tuerca a la unidad de pruebas, a continuación,...

La unidad - Muy recomendable marco de pruebas unitarias de código C.

Los ejemplos en el libro que se menciona en este hilo TDD para embedded C se escriben con la Unidad (y CppUTest).

También es posible que desee echar un vistazo a libtap, un C marco de pruebas de que las salidas de la Prueba Nada Protocolo (TAP) y por lo tanto se integra bien con una variedad de herramientas para esta tecnología.Se utiliza principalmente en el dinámico mundo de lengua, pero es fácil de usar y se están volviendo muy populares.

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();
}

Hay un elegante marco de pruebas unitarias para C con soporte para burlarse de objetos llamados cmocka.Sólo se requiere que el estándar de la biblioteca de C, que funciona en una amplia gama de plataformas de computación (incluyendo embedded) y con diferentes compiladores.

También dispone de soporte para mensajes diferentes formatos de salida como de la Subunidad, Prueba de Nada Protocolo y jUnit informes XML.

cmocka ha sido creado para trabajar también en plataformas embebidas y también tiene soporte técnico de Windows.

Una prueba sencilla que se parece a esto:

#include <stdarg.h>
#include <stddef.h>
#include <setjmp.h>
#include <cmocka.h>

/* A test case that does nothing and succeeds. */
static void null_test_success(void **state) {
    (void) state; /* unused */
}

int main(void) {
    const struct CMUnitTest tests[] = {
        cmocka_unit_test(null_test_success),
    };
    return cmocka_run_group_tests(tests, NULL, NULL);
}

El API está completamente documentado y varios ejemplos de esto son parte de el código fuente.

Para empezar con cmocka usted debe leer el artículo en LWN.net: La unidad de pruebas con simulacros de objetos en C

cmocka 1.0 ha sido liberado de febrero de 2015.

Yo no se mucho de prueba de un legado C aplicación antes de comenzar a buscar una manera de burlarse de funciones.Necesitaba burla de mal para aislar el archivo C quiero probar la de los demás.Me dio cmock una oportunidad y creo que voy a adoptar.

Cmock escanea los archivos de cabecera y genera burlarse de las funciones basadas en prototipos que se encuentra.Se burla le permitirá poner a prueba un archivo C en perfecto aislamiento.Todo lo que tienes que hacer es vincular tu archivo de prueba con burla en lugar de su verdadero objeto de archivos.

Otra de las ventajas de cmock es que va a validar los parámetros que se pasan a burlaban de funciones, y le permite especificar qué valor de retorno de la burla debe proporcionar.Esto es muy útil para probar diferentes flujos de ejecución en sus funciones.

Las pruebas consisten en la típica testA(), testB() funciones en que se puede construir expectativas, llamar a funciones de prueba y de verificación afirma.

El último paso es generar un corredor para sus pruebas con la unidad.Cmock está ligada a la unidad en el marco de prueba.La unidad es tan fácil de aprender que cualquier otro marco de pruebas unitarias.

Bien vale la pena intentarlo y muy fácil de comprender:

http://sourceforge.net/apps/trac/cmock/wiki

Actualización 1

Otro marco que estoy investigando es Cmockery.

http://code.google.com/p/cmockery/

Es un puro C marco de apoyo de la unidad de pruebas y de burla.No tiene dependencia de ruby (contrario a Cmock) y que tiene muy poca dependencia externa libs.

Se requiere un poco más de trabajo manual de instalación de burla porque no es la generación de código.Que no representan una gran cantidad de trabajo para un proyecto existente desde los prototipos no cambia mucho:una vez que usted tiene su burla, usted no tendrá que cambiar por un tiempo (este es mi caso).Extra escribiendo proporciona un control completo de burla.Si hay algo que no te gusta, simplemente cambian de simulacros.

No hay necesidad de una prueba especial de corredor.Sólo se necesita necesita para crear un conjunto de pruebas y pasarlo a un run_tests función.Un poco más de trabajo manual aquí también, pero definitivamente me gusta la idea de una auto-contenida autónoma marco.

Además de que contiene algunos símbolos de C trucos que yo no sabía.

En general Cmockery necesita un poco más de comprensión de burla para empezar.Ejemplos deben ayudar a superar esto.Parece que puede hacer el trabajo con mecanismos más sencillos.

Como C novato, he encontrado las diapositivas llamado Desarrollo orientado a pruebas en C muy útil.Básicamente, se utiliza el estándar de assert() junto con && para entregar un mensaje, sin dependencias externas.Si alguien está acostumbrado a un full stack marco de pruebas, esto probablemente no va a hacer :)

Hay CUnit

Y Incorporado Unidad es el marco de pruebas unitarias para Incrustado en C Sistema.Su diseño fue copiado de JUnit y de CUnit y más, y luego adaptado un poco para Embedded C Sistema.Incorporado Unidad no requiere std C libs.Todos los objetos son asignados al área de const.

Y Tessy automatiza la unidad de pruebas de software embebido.

Yo no uso un framework, yo sólo uso autotools "check" target apoyo.Implementar un "principal" y el uso assert(s).

Mi prueba dir Makefile.soy(s) aspecto:

check_PROGRAMS = test_oe_amqp

test_oe_amqp_SOURCES = test_oe_amqp.c
test_oe_amqp_LDADD = -L$(top_builddir)/components/common -loecommon
test_oe_amqp_CFLAGS = -I$(top_srcdir)/components/common -static

TESTS = test_oe_amqp

Escribimos TRUCOS (alojado en GitHub) para la facilidad de uso y portabilidad.

No tiene dependencias y no requiere instalación o configuración.Sólo un archivo de encabezado y un caso de prueba es necesaria.

#include <cheat.h>

CHEAT_TEST(mathematics_still_work,
    cheat_assert(2 + 2 == 4);
    cheat_assert_not(2 + 2 == 5);
)

Pruebas de compilar en un archivo ejecutable que se encarga de la ejecución de las pruebas y el reporte de sus resultados.

$ gcc -I . tests.c
$ ./a.out
..
---
2 successful of 2 run
SUCCESS

Tiene colores bonitos también.

Michael Pluma del libro "Trabajar de manera Efectiva con el Código Heredado" presenta una gran cantidad de técnicas específicas para la unidad de la prueba durante el desarrollo C.

Hay técnicas relacionadas con la inyección de dependencia que son específicas de C que no he visto en ninguna otra parte.

CppUTest - Muy recomendable marco de pruebas unitarias de código C.

Los ejemplos en el libro que se menciona en este hilo TDD para embedded C se escriben con CppUTest.

Yo uso CxxTest para una incrustado en c/c++ entorno (principalmente C++).

Yo prefiero CxxTest porque tiene un perl/python script para crear el test runner.Después de una pequeña pendiente para obtener el programa de instalación (más aún desde que usted no tiene que escribir el test runner), es bastante fácil de usar (incluye muestras y documentación de interés).La mayor parte del trabajo fue la creación de la 'hardware' el código de accesos para que yo pudiera unidad/módulo de prueba de eficacia.Después de que es muy fácil añadir una nueva unidad de casos de prueba.

Como se mencionó anteriormente, es un C/C++ marco de pruebas unitarias.Así que se necesita un compilador de C++.

CxxTest Guía Del Usuario CxxTest Wiki

aparte de mi evidente sesgo

http://code.google.com/p/seatest/

es una buena manera sencilla a prueba la unidad C código.imita xUnit

Después de leer Minunit pensé que la mejor manera era la base de la prueba en afirmar macro que yo uso mucho como programa defensivo técnica.Así que he usado la misma idea de Minunit mezclado con la norma de la aserción.Usted puede ver mi marco (un buen nombre puede ser NoMinunit) en k0ga del blog

Google tiene un excelente marco de pruebas. https://github.com/google/googletest/blob/master/googletest/docs/primer.md

Y sí, por lo que veo va a trabajar con C sin formato, es decir,no requiere de características de C++ (puede requerir compilador de C++, no estoy seguro).

Cmockery es recientemente se inició un proyecto que consiste en una forma muy sencilla para el uso de la biblioteca C para escribir pruebas unitarias.

En primer lugar, mira aquí: http://en.wikipedia.org/wiki/List_of_unit_testing_frameworks#C

Mi empresa tiene una biblioteca de C que utilizan nuestros clientes.Utilizamos CxxTest (C++ de la unidad de biblioteca de pruebas) para probar el código.CppUnit también funcionará.Si usted está atascado en C, me gustaría recomendar RCUNIT (pero CUnit es demasiado bueno).

Si usted está familiarizado con JUnit entonces te recomiendo CppUnit.http://cppunit.sourceforge.net/cppunit-wiki

Que es suponiendo que usted compilador de c++ para hacer las pruebas unitarias.si no, entonces tengo que estar de acuerdo con Adam Rosenfield que comprobar qué es lo que quiere.

He utilizado RCUNIT para hacer algunas pruebas unitarias de código incrustado en el PC antes de la prueba en el destino.Buena interfaz de hardware abstracción es importante más peso y la memoria asignada registros se te va a matar.

La API de Cordura Corrector — en el marco de prueba de librerías C/C++:

Un generador automático de la unidad básica de las pruebas de C/C++ biblioteca.Es capaz de generar razonable (en la mayoría, pero por desgracia no en todos, los casos) de los datos de entrada y parámetros de componer simple ("cordura" o "superficial"de calidad) de los casos de prueba para cada función de la API a través del análisis de las declaraciones en los archivos de encabezado.

La calidad de las pruebas generadas permite comprobar la ausencia de errores críticos en simples casos de uso.La herramienta es capaz de crear y ejecutar pruebas generadas y detectar los bloqueos (segfaults), anula todo tipo de señales emitidas, no-cero de programa código de retorno y el programa de colgar.

Ejemplos:

La técnica a utilizar es desarrollar la prueba de la unidad de código C++ xUnit marco (y compilador de C++), mientras que el mantenimiento de la fuente para el sistema de destino como C módulos.

Asegúrese de que usted regularmente compilar el código fuente en C bajo su compilador cruzado, de forma automática con su unidad de pruebas, si es posible.

LibU (http://koanlogic.com/libu) tiene una unidad de prueba módulo que permite explícito de la suite de prueba/el caso de las dependencias, de la prueba de aislamiento, la ejecución en paralelo y personalizable informe formateador (por defecto son los formatos xml y txt).

La biblioteca es la licencia BSD y contiene otros muchos módulos útiles de redes, la depuración, la que comúnmente se utiliza estructuras de datos, configuración, etc.- en caso de necesitar en sus proyectos ...

Estoy sorprendido de que nadie mencionó Cortador (http://cutter.sourceforge.net/) Usted puede probar de C y C++, se integra a la perfección con autotools y tiene un muy buen tutorial disponible.

En caso de que usted está apuntando a las plataformas Win32 o NT kernel modo, usted debe tener una mirada en cfix.

Si usted todavía está en la búsqueda de marcos de pruebas, CUnitWin32 es uno de Win32/plataforma NT.

Esto resuelve un problema fundamental que me enfrenté con otros marcos de las pruebas.Es decir, variables globales o estáticos están en un determinista del estado, ya que cada prueba se ejecuta como un proceso separado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top