2011-08-31 16 views
18

. Soy nuevo en CMake y estoy usando Google Test Framework. He buscado ejemplos más complejos de combinación de CMake y el marco de prueba de Google, pero no he tenido mucha suerte. Esperaba que alguien pudiera dar su opinión sobre la configuración a la que llegué y responder una pregunta por mí. Aquí está la estructura del proyecto básico:Salida de prueba unitaria y estructura de proyecto. Asesoramiento --- CMake + Google Test Framework

ProjectFolder
-CMakeLists.txt
/construcción
/include
    -todas mis archivos .h
/src
    -CMakeLists.txt
    -todos mis archivos .cpp
/tests
    -CMakeLists.txt
   /GTEST
        CMakeLists.txt de -Google
   /burla
        -CMakeLists.txt
        -cpp y h archivos para simulacros

En pocas palabras, el archivo raíz cmake agrega src y las pruebas como subdirectorios. El archivo src cmake engloba los archivos cpp en una biblioteca. El archivo cmake de pruebas agrega burlas y gtest como subdirectorios. El archivo cmake falso engloba todos sus archivos cpp en una segunda biblioteca. Finalmente, el archivo cmake en la carpeta de pruebas vincula la biblioteca src, las bibliotecas de google y las bibliotecas de simulacros con los ejecutables de prueba de la unidad.

Lo que finalmente dan son varios ejecutables: objA_unittest, objB_unittest, etc

Un par de cosas:

  1. Para construir todo esto y mantener mi directorio del proyecto bastante limpio Me CD en la construcción todavía carpeta y ejecute "cmake .." Esto parece funcionar muy bien y yo estaba planeando configurar vim para ejecutar siempre fuera de esta carpeta. ¿Alguien tiene alguna sugerencia o ve algún problema con este enfoque?

  2. No me gusta la idea de tener que anidar la biblioteca de Google en mi carpeta de proyectos (especialmente si finalmente tengo varios proyectos que la usan), pero como parece muy recomendable no precompilar la Las bibliotecas de Google no veo cómo evitar esto. Sin embargo, si alguien sabe de una mejor manera, me encantaría escucharlo.

  3. Ejecutando las pruebas. Me gusta que todo lo que tengo que hacer es ejecutar "hacer prueba" para ejecutar todas las pruebas de mi unidad con ctest. Sin embargo, descubrí que no me gusta mucho la salida. Cada unidad ejecutable de prueba contiene varias pruebas de unidades diferentes. Ejecutar estos directamente proporciona comentarios muy detallados de Google. Si una de las pruebas en un archivo ejecutable falla, sé exactamente qué prueba falla y por qué. Previamente, utilicé un archivo MAKE y al final del archivo MAKE simplemente ejecuté todas las pruebas. Primero intenté arreglar esto creando un objetivo de compilación personalizado en cmake.Sin embargo, solo ejecuta el primer comando. O necesito una forma de obtener una salida más detallada desde CTest O bien, necesito una manera de generar automáticamente un script bash o algo similar de CMake para ejecutar cada ejecutable de prueba unitario. En otras palabras, tengo el archivo cmake configurado ahora, así que solo tengo que agregar la prueba unitaria en un lugar para generar el ejecutable, y no quiero tener que recordar agregarlo a un segundo lugar si puedo evitarlo eso. ¿Alguien tiene alguna experiencia que sería útil en este punto?

Muchas gracias de antemano.

Respuesta

11
  1. realidad, es una práctica recomendada cmake llamados out-of-source build
  2. yo sepa, no se recomienda para instalar bibliotecas googletest recopilados en el sistema. Por lo tanto, no debería haber ningún problema si lo compila como biblioteca compartida o estática como parte de la compilación de su proyecto. He usado Googletest 1.6.0 de esta manera sin problemas en Windows, Linux, OSX y Android.
  3. No estoy seguro acerca de CTest, pero el objetivo personalizado definitivamente puede ejecutar todas las pruebas por usted. Aquí es una solución a corto puedo sugerir:

Add siguientes líneas en su nivel superior CMakeLists.txt (antes de la adición de cualquier prueba):

add_custom_target(test) 
macro(run_test test_target) 
    add_custom_target(${test_target}_runtest 
     COMMAND ${test_target} #cmake 2.6 required 
     DEPENDS ${test_target} 
     WORKING_DIRECTORY "${CMAKE_BINARY_DIR}") 
    add_dependencies(test ${test_target}_runtest) 
endmacro() 

siguientes para cada prueba agregar una sola línea para anexar la prueba de test el objetivo:

#add_executable(mytest ${mysources}) 
run_test(mytest) 
+3

Tenga cuidado: ya hay un objetivo CMake predefinido llamado 'prueba'. Por lo general, no se recomienda agregar un destino personalizado con ese mismo nombre. También puede llamar a "ctest -V" o "ctest -VV" en el mismo directorio donde está llamando "realizar prueba" ahora, y ejecutará el conjunto de pruebas completo * y * le mostrará el resultado de todas las pruebas. (-V == verbose, -VV == muy verboso) – DLRdave

+0

Solo para tu información, realmente aprecio la respuesta rápida (y también la de abajo). He estado ocupado con la escuela y no he tenido tiempo de probar ninguno de estos. Tan pronto como lo haga, elegiré la mejor respuesta de manera apropiada. Solo quería que supieras que no lo había olvidado. :) – Landon

11

Aquí el mi example. Lo hice como una breve guía para mi equipo de desarrollo. Tal vez lo encuentres útil también.

+0

Me gusta que este ejemplo sea simple. Sin embargo, la orientación actual del equipo de gtest es incluir la fuente de Gtest con el paquete. ¿Algún ejemplo de hacer eso? –

+0

Sí. Soy consciente de este cambio. Lo comprobará y pronto y lo actualizará en consecuencia. –

+0

@KurtSchwehr Empecé a implementar una nueva forma y, finalmente, encontré la solución aquí http://stackoverflow.com/questions/9689183/cmake-googletest. Se actualizará como se sugiere en la respuesta anterior. –

Cuestiones relacionadas