tool snippet serp google description best c++ unit-testing automated-tests autotools googletest

c++ - snippet - serp generator



¿Cómo puedo usar Google Test con mi proyecto que se construye a través de autotools? (3)

Parece que hay algunas respuestas que de alguna manera tienen sentido, pero que no sé cómo llevar a cabo. Y no he encontrado una respuesta completa.

El primer problema

Google Test no debe ser una biblioteca instalada, debe construirse con el proyecto. (Vea las FAQ ). Por lo que puedo decir, esto significa que las bibliotecas de Google Test son una dependencia de mis pruebas unitarias, y deberían construirse cuando ejecute "make check" dentro de mi proyecto por primera vez. Esto debería construir bibliotecas de prueba de Google en algún directorio. No se como hacer esto. Menciona algunas secuencias de comandos de autotools que están en desuso, y no estoy seguro de qué están hablando o cómo apuntar mi compilación correctamente.

El segundo problema

Suponiendo que la compilación sea exitosa, ¿cómo escribo una prueba que use mi versión compilada localmente de Google Test para ejecutar pruebas? Supongo que hay un montón de comandos Makefile.am que puse en mi directorio de pruebas. Pero ¿qué son? ¿Y cuál es un ejemplo de una prueba de unidad que usa Google Test?


¡He resuelto el problema a mi entera satisfacción! Voy a seguir por completo ahora. Esto es básicamente pedir un tutorial. Hay muchas decisiones que deben tomarse, con suerte lógicamente, para que Google Test se adapte perfectamente a las autotools. Así que me disculpo por adelantado por la larga respuesta, pero todos los detalles deberían estar ahí.

El primer problema

Para entender la respuesta, la pregunta debe reformularse un poco. Estamos compilando Google Test como una biblioteca a la que se vinculará nuestro código de prueba. La biblioteca no se instalará. La pregunta que queremos formular es: "¿Cómo configuramos las herramientas automáticas para compilar Google Test como una biblioteca con la que nuestro código de prueba se puede vincular?"

Para hacer eso, necesitamos descargar Google Test y colocarlo en nuestro proyecto. Tengo Github, así que lo hago agregando un submódulo en la ruta raíz de mi proyecto:

git submodule add [email protected]:google/googletest.git git submodule init git submodule update

Esto descarga googletest en mi raíz de mi proyecto:

/: Makefile.am configure.ac src/: (files for my project) tests/: (test files) googletest/: googletest/: include/: (headers, etc., to be included) gtest/: gtest.h m4/: (directory for m4 scripts and things) src/: (source files for Google Test)

Necesito compilar según las instructions . Solo quiero que la biblioteca de Google Test se construya al ejecutar make check , así que usaré check_LTLIBRARIES. Agrego lo siguiente a mis pruebas Makefile.am in / tests:

check_LTLIBRARIES = libgtest.la libgtest_la_SOURCES = ../googletest/googletest/src/gtest-all.cc libgtest_la_CPPFLAGS = -I$(top_srcdir)/googletest/googletest/include -I$(top_srcdir)/googletest/googletest libgtest_la_LDFLAGS = -pthread

Esto requiere que los objetos subdir estén habilitados en configure.ac. Eso se logra agregándolo a la línea AM_INIT_AUTOMAKE. También necesito incluir el makefile en AC_CONFIG_FILES. También queremos usar libtool, porque estamos compilando archivos de biblioteca (explicaré por qué y cómo funciona en un momento). Para usar libtool, agregamos AM_PROG_AR, LT_INIT. Queremos que autoreconf instale macros m4 en / m4, y luego queremos que automake los encuentre, por lo que necesitamos AC_CONFIG_MACRO_DIRS. Mi configuracion.ac tiene lineas actualizadas:

AM_INIT_AUTOMAKE([-Wall -Werror subdir-objects]) ... AM_PROG_AR LT_INIT AC_CONFIG_MACRO_DIRS([m4]) ... AC_CONFIG_FILES([Makefile src/Makefile tests/Makefile ])

También necesito incluir el subdirectorio y una línea que apunta a las macros en el directorio de macros / m4 en mi /Makefile.am:

ACLOCAL_AMFLAGS = -I m4 SUBDIRS = src tests

¿Qué ha hecho esto? Libtool se ha habilitado con AM_PROG_AR y LT_INIT. El check_LTLIBRARIES significa que utilizaremos libtool para crear lo que se llama una biblioteca de conveniencia llamada libgtest.la. Con los objetos subdirigidos habilitados, se integrará en el directorio / tests, pero no se instalará. Esto significa que, cuando queremos actualizar nuestras pruebas, no tenemos que volver a compilar la biblioteca de pruebas de Google libgtest.la. Esto le ahorrará tiempo durante las pruebas y nos ayudará a iterar más rápido. Luego, querremos compilar nuestras pruebas de unidad contra ellas más adelante a medida que las actualizamos. La biblioteca solo se compilará al ejecutar make check , lo que ahorrará tiempo al no compilarla si lo único que queremos hacer es make o make install .

El segundo problema

Ahora, el segundo problema debe ser refinado: ¿Cómo (a) creas una prueba (b) que está vinculada a las bibliotecas de Google Test y, por lo tanto, las utiliza? Las preguntas están unidas entre sí, por lo que las respondemos de inmediato.

Crear una prueba es solo cuestión de colocar el siguiente código en un archivo gtest.cpp ubicado en /tests/gtest.cpp:

#include "gtest/gtest.h" // we will add the path to C preprocessor later TEST(CategoryTest, SpecificTest) { ASSERT_EQ(0, 0); } int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }

Esto ejecuta solo la prueba simple 0 = 0. Para crear una prueba para su biblioteca, necesita leer el primer . Notarás que no necesitamos un encabezado para esto (todavía). Estamos vinculando al archivo "gtest / gtest.h", por lo que debemos asegurarnos de que le indiquemos a automake que incluya un directorio que tenga gtest / gtest.h.

A continuación, debemos decirle a automake que queremos construir una prueba y ejecutarla. La prueba se va a construir en un ejecutable que no queremos instalar. Entonces automake va a ejecutar ese ejecutable. Se informará si ese ejecutable dice que las pruebas pasaron o no.

Automake lo hace buscando en el archivo make la variable check_PROGRAMS. Estos son los programas que compilará, pero no necesariamente los ejecutará. Así que agregamos a /tests/Makefile.am:

check_PROGRAMS = gtest gtest_SOURCES = gtest.cpp gtest_LDADD = libgtest.la gtest_LDFLAGS = -pthread gtest_CPPFLAGS = -I$(top_srcdir)/googletest/googletest/include -I$(top_srcdir)/googletest/googletest -pthread

Gtest_SOURCES encuentra el archivo /tests/gtest.cpp y lo compila. gtest_LDADD enlaza contra libgtest.la que se compilará en el directorio / tests. Google quiere que usemos la línea gtest_LDFLAGS para habilitar pthreads. Finalmente, debemos incluir la ubicación donde se encontrará el encabezado "gtest / gtest.h", y esa es la línea gtest_CPPFLAGS. Google también quiere que incluyamos la ubicación / googletest / googletest, e incluyamos la

El estado de las cosas: la biblioteca de Google Test libgtest.la se compilará con make en el directorio / tests, pero no se instalará. El gtest binario solo se compilará con make check , pero no se instalará.

A continuación, le pedimos a automake que realmente ejecute el gtest binario compilado e informe los errores. Esto se logra agregando una línea a /tests/Makefile.am:

TESTS = gtest

El final /tests/Makefile.am se ve así:

check_LTLIBRARIES = libgtest.la libgtest_la_SOURCES = ../googletest/googletest/src/gtest-all.cc libgtest_la_CPPFLAGS = -I$(top_srcdir)/googletest/googletest/include -I$(top_srcdir)/googletest/googletest -pthread check_PROGRAMS = gtest demo gtest_SOURCES = gtest.cpp ../src/fields.cpp gtest_LDADD = libgtest.la gtest_LDFLAGS = -pthread gtest_CPPFLAGS = -I$(top_srcdir)/googletest/googletest/include -I$(top_srcdir)/src demo_SOURCES = demo.cpp ../src/fields.cpp demo_CPPFLAGS = -I$(top_srcdir)/src TESTS = gtest

Ahora, autoreconf -fiv (tenga en cuenta los errores y, con suerte, corríjalos) desde /, make check y obtendrá una prueba que se ejecuta:

build(dev)$ make check Making check in tests /Applications/Xcode.app/Contents/Developer/usr/bin/make gtest make[2]: `gtest'' is up to date. /Applications/Xcode.app/Contents/Developer/usr/bin/make check-TESTS PASS: gtest ============================================================================ Testsuite summary for IonMotion 0.0.1 ============================================================================ # TOTAL: 1 # PASS: 1 # SKIP: 0 # XFAIL: 0 # FAIL: 0 # XPASS: 0 # ERROR: 0 ============================================================================


Aquí hay un ejemplo de Makefile.am para el proyecto de prueba de unidad (nombre del proyecto: TestProject). Depende de GTEST y GMOCK:

Makefile.am

####################################### # The list of executables we are building seperated by spaces # the ''bin_'' indicates that these build products will be installed # in the $(bindir) directory. For example /usr/bin #bin_PROGRAMS=exampleProgram # Because a.out is only a sample program we don''t want it to be installed. # The ''noinst_'' prefix indicates that the following targets are not to be # installed. noinst_PROGRAMS=utTestProject ####################################### # Build information for each executable. The variable name is derived # by use the name of the executable with each non alpha-numeric character is # replaced by ''_''. So a.out becomes a_out and the appropriate suffex added. # ''_SOURCES'' for example. # Sources for the a.out utTestProject_SOURCES= / utTestProject.cpp # Library dependencies utTestProject_LDADD = / $(top_srcdir)/../TestProject/build/${host}/libTestProject/.libs/libTestProject.a / ../$(PATH_TO_GTEST)/lib/libgtest.a / ../$(PATH_TO_GMOCK)/lib/libgmock.a # Compiler options for a.out utTestProject_CPPFLAGS = / -std=c++11 / -I../$(PATH_TO_GTEST)/include / -I../$(PATH_TO_GMOCK)/include / -I$(top_srcdir)/include / -I$(top_srcdir)/.. TESTS = utTestProject TESTS_ENVIRONMENT = export UT_FOLDER_PATH=$(top_srcdir)/utTestProject; / export GTEST_OUTPUT="xml";

Compilación gtest:

# Useful vars SourceVersionedArchiveFolderName="gtest-1.7.0" # # Make it # pushd . cd ./${SourceVersionedArchiveFolderName}/make make gtest.a if [ $? != 0 ]; then echo "$0: Make failed" exit 1 fi popd


Vale la pena señalar que Googletest ya no mantiene oficialmente su integración con Autotools:

Antes de instalarnos en CMake, hemos estado proporcionando proyectos / scripts de compilación de mantenimiento manual para Visual Studio, Xcode y Autotools. Si bien continuamos brindándolos para su conveniencia, ya no se mantienen activamente. Le recomendamos que siga las instrucciones en las secciones anteriores para integrar Google Test con su sistema de compilación existente.

https://github.com/google/googletest/tree/master/googletest#legacy-build-scripts

Ahora se recomienda construir Googletest con CMake.

Hacer que el código fuente de GoogleTest esté disponible para la compilación principal se puede hacer de varias maneras diferentes:

  • Descargue el código fuente de GoogleTest manualmente y colóquelo en una ubicación conocida. Este es el enfoque menos flexible y puede hacer que sea más difícil de usar con sistemas de integración continua, etc.
  • Incruste el código fuente de GoogleTest como una copia directa en el árbol de fuentes del proyecto principal. Este es a menudo el enfoque más simple, pero también es el más difícil de mantener actualizado. Algunas organizaciones pueden no permitir este método.
  • Agrega GoogleTest como un submódulo de git o equivalente. Esto puede no ser siempre posible o apropiado. Los submódulos de Git, por ejemplo, tienen su propio conjunto de ventajas e inconvenientes.
  • Use CMake para descargar GoogleTest como parte del paso de configuración de la compilación. Esto es solo un poco más complejo, pero no tiene las limitaciones de los otros métodos.

https://github.com/google/googletest/tree/master/googletest#incorporating-into-an-existing-cmake-project