Marco de prueba de la unidad C ++

Uso el marco Boost Test para mi código C ++, pero hay dos problemas que probablemente sean comunes a todos los frameworks de prueba C ++:

  • No hay forma de crear apéndices de prueba automáticos (extrayendo funciones públicas de las clases seleccionadas, por ejemplo).
  • No puede ejecutar una sola prueba: debe ejecutar toda la serie de pruebas (a menos que cree muchos proyectos de prueba diferentes, supongo).

¿Alguien sabe de un mejor marco de prueba o estoy para siempre celoso de las herramientas de prueba disponibles para los desarrolladores de Java / .NET?

Acabo de responder a una pregunta muy similar . Terminé usando UnitTest ++ de Noel Llopis. Me gustó más que boost :: test porque no insistía en implementar el progtwig principal del arnés de prueba con una macro: puede conectarse con cualquier ejecutable que crees. Sufre el mismo estorbo de boost :: test en el sentido de que requiere que se vincule una biblioteca. He usado CxxTest, y está más cerca que cualquier otra cosa en C ++: aterrizar para generar pruebas automáticamente (aunque requiere Perl ser parte de tu sistema de comstackción para hacer esto). C ++ simplemente no proporciona los ganchos de reflexión que tienen los lenguajes .NET y Java. Las herramientas de MsTest en Visual Studio Team System – Developer’s Edition generarán automáticamente apéndices de prueba de C ++ no administrado, pero los métodos tienen que exportarse desde una DLL para hacer esto, por lo que no funciona con bibliotecas estáticas. Otros marcos de prueba en el mundo .NET también pueden tener esta habilidad, pero no estoy familiarizado con ninguno de ellos. Así que ahora usamos UnitTest ++ para C ++ no administrado y actualmente estoy decidiendo entre MsTest y NUnit para las bibliotecas administradas.

Acabo de sacar mi propio marco, CATCH , por ahí. Todavía está en desarrollo, pero creo que ya supera a la mayoría de los otros marcos. Diferentes personas tienen diferentes criterios, pero he tratado de cubrir la mayor parte del terreno sin demasiadas concesiones. Eche un vistazo a mi entrada de blog vinculada para una prueba. Mis cinco principales características son:

  • Solo encabezado
  • Registro automático de funciones y pruebas basadas en métodos
  • Descompone las expresiones estándares de C ++ en LHS y RHS (por lo que no necesita una familia completa de macros assert).
  • Soporte para secciones anidadas dentro de un accesorio basado en función
  • Pruebas de nombres usando lenguaje natural – se generan nombres de funciones / métodos

No hace generación de stubs, pero es un área bastante especializada. Creo que Isolator ++ es la primera herramienta para lograrlo. Tenga en cuenta que los marcos de Mocking / stubbing generalmente son independientes de los marcos de prueba de unidades. CATCH funciona particularmente bien con objetos simulados ya que el estado de prueba no se pasa por el contexto.

También tiene enlaces de Objective-C.

[actualizar]

Acabo de volver a cruzar esta respuesta mía de hace unos años. Gracias por todos los excelentes comentarios! Obviamente, Catch se ha desarrollado mucho en ese momento. Ahora tiene soporte para pruebas de estilo BDD (dado / cuando / entonces), tags, ahora en un solo encabezado, y un montón de mejoras internas y refinamientos (por ejemplo, una línea de comando más rica, resultados claros y expresivos, etc.). Una publicación de blog más actualizada está aquí.

Eche un vistazo al Marco de prueba de Google C ++.

Es utilizado por Google para todos sus proyectos internos de C ++, por lo que debe ser bastante bueno.

http://googletesting.blogspot.com/2008/07/announcing-new-google-c-testing.html

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

Boost.Test no permite ejecutar caso de prueba por nombre. O suite de prueba. O varios de ellos.

Boost.Test NO insiste en implementar main, aunque hace que sea fácil hacerlo.

Boost.Test NO es necesario para usar como biblioteca. Tiene variante de encabezado único.

Soy un gran admirador de UnitTest ++ , es muy liviano, pero hace el trabajo. Puede ejecutar pruebas individuales allí fácilmente.

Gran pregunta! Hace unos años busqué por siempre algo que valiera la pena usar y me quedé corto. Estaba buscando algo que fuera muy liviano y no me requiriera vincularlo en algunas bibliotecas … usted sabe algo que podría poner en funcionamiento en minutos.

Sin embargo, persistí y terminé corriendo por cxxtest .

Desde el sitio web:

  • No requiere RTTI
  • No requiere funciones de plantilla de miembro
  • No requiere manejo de excepciones
  • No requiere ninguna biblioteca externa (incluida la gestión de memoria, archivo / consola de E / S, bibliotecas de gráficos)
  • Se distribuye por completo como un conjunto de archivos de encabezado (y un script de python).

Wow … ¡súper simple! Incluya un archivo de encabezado, derive de la clase de prueba y está listo y en ejecución. Hemos estado usando esto durante los últimos cuatro años y aún no he encontrado nada con lo que esté más satisfecho.

Prueba WinUnit . Suena excelente, y es recomendado por John Robbins .

Me gusta el marco de prueba de la unidad Boost, principalmente porque es muy liviano.

  • Nunca escuché sobre un marco de pruebas unitarias que generaría stubs. En general, no estoy convencido de la generación de código, aunque solo sea porque se vuelve obsoleto muy rápidamente. Tal vez se vuelve útil cuando tienes una gran cantidad de clases?

  • Un proponente de Test Driven Development probablemente diga que es fundamental que ejecute todo el conjunto de pruebas cada vez, para asegurarse de que no ha introducido una regresión. Si ejecutar todas las pruebas toma demasiado tiempo, tal vez sus pruebas sean demasiado grandes o hacer demasiadas llamadas a funciones intensivas de CPU que deberían ser burladas. Si sigue siendo un problema, una capa delgada alrededor de las pruebas de la unidad de impulso debería permitirle elegir sus pruebas, y probablemente sería más rápido que aprender otro marco y portar todas sus pruebas.

Estoy usando tut-framework

Aeryn es otro marco que vale la pena mirar

Visual Studio tiene un marco de pruebas de unidades incorporado, este es un excelente enlace para configurar un proyecto de prueba para la aplicación de consola win32:

http://codeketchup.blogspot.ie/2012/12/unit-test-for-unmanaged-c-in-visual.html

Si está trabajando en un proyecto de DLL estático, es mucho más fácil de configurar ya que otros han señalado que los marcos de prueba externos como GTest y Boost tienen características adicionales.

CppUnit fue el homenaje original a JUnit.

Eclipse / JUnit es un paquete sólido para Java, y hay extensiones / equivalentes de C ++ para ambos. Puede hacer lo que estás hablando. Por supuesto, tendrías que cambiar los IDEs …

Yo también soy fanático de UnitTest ++.

El inconveniente es que la distribución fuente contiene casi 40 archivos separados. Esto es absurdo. La administración de las tareas de control y comstackción de origen para un proyecto simple está dominada por el cuidado de todos estos archivos de prueba de unidades.

Modifiqué UnitTest ++ para que se pueda integrar con un proyecto agregando un archivo .h y .cpp. Esto lo he denominado “más lindo”. Los detalles están en http://ravenspoint.com/blog/index.php?entry=entry080704-063557

No genera automáticamente apéndices de prueba, como se solicitó en la pregunta original. No puedo dejar de pensar que tal característica sería más problemática de lo que vale, generando grandes cantidades de funciones de acceso de “prueba” de código inútiles.

Me imagino que anular automáticamente las funciones de prueba sería más una función (de scripts para el framework o) el entorno de desarrollo en cuestión. Supuestamente, las aplicaciones de C ++ Builder de CodeGear generarán rápidamente código de prueba para las funciones del usuario.

Vale la pena visitar la biblioteca de fructosa de Andrew Marlow … http://fructose.sourceforge.net/

Recuerdo sus documentos que contienen un análisis bastante detallado y una comparación de otras ofertas en el momento en que escribió Fructose, pero no puede encontrar una URL directa a ese documento.

Estoy probando Igloo , también un conjunto de pruebas de C ++ solo de encabezado, incluso sus dos dependencias incluidas son encabezado solamente.

Por lo tanto, es bastante sencillo y simple. Además del ejemplo incluido en github, hay ejemplos y más detalles en el sitio principal, igloo-testing.org . Lo actualizaré más tarde a medida que tenga más experiencia con él y otros marcos.