Google Test con Eclipse y MinGW-W64 desde cero

Estaba investigando como hacer tests unitarios con C++ a raíz de un curso online sobre GoogleTest.
En el proceso de instalar el entorno encontré una serie de retos que tuve que investigar más allá de lo que enseñaba ese curso online y decidí que es materia para un artículo.

En este artículo voy a describir como llegar a instalar Google Test en Eclipse CDT, Git, Cmake y MinGW64, en Windows, desde cero.

Instalando Eclipse:

Eclipse es un entorno de desarrollo de código libre. Tiene un montón de módulos para adaptarlo para desarrollar en Java, PHP, muchos otros lenguages y por supuesto para C++.

El Eclipse para C++ se llama Eclipse CDT que significa C/C++ Development Tooling.

Una forma de obtener el CDT es sobre un Eclipse plano instalar los módulos.

Eclipse con CDT está también disponible para descargar en https://www.eclipse.org/downloads/packages/release/2022-06/r/eclipse-ide-cc-developers

En Download Links puedes encontrar el de Windows, Linux y MacOS.

El que me descargué al momento de este artículo es: https://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/2022-06/R/eclipse-cpp-2022-06-R-win32-x86_64.zip

Descomprimes el zip donde quieras.

Instalando MinGW-W64.

Eclipse por si solo no es mas que un notepad muy sofisticado. No Incluye compiladores sino que puede usar los compiladores que tu tengas. Podría ser el de VisualC, podría ser Clang o como en este caso MinGW-W64.

MinGW-W64 es una de varias distribuciones de GCC para Windows como Cygwin o MSYS2.

El proyecto MingGW esta en https://sourceforge.net/projects/mingw-w64/

Hay un instalador con el que puedes seleccionar ciertos aspectos como que si quieres que compile para arquitecturas x86_64 o i686 (64 and 32 bits respectivamente), o si lo quieres simulando el Posix interfaz de los sistemas unix o directamente win32 y a elegir entre sjlj, seh y dwarf. Estos tres últimos estándares tienen que ver en la forma que quieres que se manejen las excepciones pero no lo entiendo.

Bueno, pues ese instalador NO FUNCIONA así que NO te lo descargues.

En su lugar ve a la sección files y ahí veras la lista de versiones disponibles.

Como no entiendo mucho de las versiones disponibles yo me he descargado la que he visto mas común y esa es x86_64, posix, y seh versión 8.1.0 en el momento de este artículo.

Aquí el link https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/mingw-builds/8.1.0/threads-posix/seh/x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z

Descomprimimos el fichero. Normalmente esto va C:\mingw64 pero puedes ponerlo en otro sitio, solo recuerda la ruta.

Dentro de la carpeta esta la carpeta bin. Tienes que añadir la de esa carpeta C:\mingw64\bin en la variable de entorno de Windows, PATH de forma que los ejecutables estén disponibles.

Una vez añadida puedes ir a la linea de comando con Win + R y escribiendo cmd y en la consola escribir gcc -v y comprobarás que GCC está ya disponible.

Instalar CMake.

Otra herramienta que necesitamos tener para llegar a instalar el Google Test es CMake.

Cuando un programa en C o C++ tiene mas ficheros que el fichero main.c se hace necesaria una utilidad que automáticamente los compile sin tener tu que escribir todo el comando con sus librerías.
Por este propósito se inventó el la utilidad Make que viene incluida con casi todos los compiladores.

Esta herramienta lee un fichero llamado Makefile donde están todas las instrucciones para compilar tu proyecto.

El problema vino después cuando los proyectos tenían que ser multiplataforma y había que hacer diferentes Makefiles.

Para ello se inventó otra herramienta llamada configure que automáticamente detectaba tu sistema y que dependencias se satisfacían y creaba un Makefile que entonces ya si se ejecutaba con el comando make.

El problema es que esa herramienta requiere una configuración que en ocasiones es mas extensa que el proyecto que estas intentando compilar con ella así que inventó CMake

CMake por tanto viene a generar el makefile pero de una forma mas fácil y es el último grito.

CMake esta disponible para descargar en https://cmake.org/download/ y tiene un instalador en windows.

Cuando lo instales tienes que añadir la ruta de sus ejecutables al PATH. Presumiblemente en C:\Program Files\CMake\bin

En la línea de comandos como hicimos antes puedes comprobar que se ha instalado correctamente lanzando el comando:

cmake -version

Instalando Git.

El proyecto Google Test esta alojado en github.org y para descargarlo necesitamos el programa Git que es un control de versiones de código. Es el más usado ahora.
Se puede encontrar en https://git-scm.com/downloads

una vez instalado, en la línea de comandos puedes comprobar que se ha instalado correctamente con el comando:

git --version

Compilando Google Test

Ahora sí que si. Ya podemos descargar los fuente de google test y compilarlo aunque no será este la ultima etapa de este viaje.

Tienes que buscar un lugar donde descargar el google test. Si abriste el Eclipse probablemente te creó una carpeta en la ruta C:\Users\tu usuario\eclipse-workspace. Ese sería un buen sitio para ir.
En la carpeta que elijas tienes que lanzar este comando:

git clone https://github.com/google/googletest.git

Con esto se descarga el código fuente de Google Test, en la sub carpeta googletest de modo que haz:

cd googletest

Despues creamos la carpeta donde vamos a compilar la librería.
Podríamos usar los comandos de la consola para crear la carpeta como el comando mkdir pero CMake provee de comandos "agnosticos de consola" que funcionan igual en las consolas de Windows o en las de Linux.

cmake -E make_directory mingw_build

Ahora vamos a hacer uso de CMake para compilar el proyecto pero no vamos a lanzar el comando plano porque por defecto nos lo prepara para ser compilado por Visual C. En su lugar le tenemos que pasar una serie de parámetros para que se compile con MinGW-W64 de modo que lanzamos los siguientes comandos:

cmake -E chdir mingw_build cmake -G "MinGW Makefiles" -D CMAKE_C_COMPILER=gcc.exe -D CMAKE_CXX_COMPILER=g++.exe -D CMAKE_MAKE_PROGRAM=mingw32-make.exe ..

Esto le dice a cmake que trabaje dentro de la carpeta mingw_build y crear en ella un projecto apropiado para compilar con MinGW-W64.

Así que lo compilamos y lo instalamos con estos dos comandos tambien agnosticos de sistema operativo.

cmake --build mingw_build

cmake --install mingw_build

Para el comando install podrías necesitar permisos de administrador porque lo va a instalar dentro de la carpeta C:/Program Files (x86)

Al cabo de un rato se habrá compilado y estará listo para usar con nuestro projecto.

Configurando Eclipse para test unitarios.

Eclipse tiene un plugin con el que se puede automatizar los test unitarios asi que vamos a instalarlo.
En la barra de herramientas, Help, en la opción Install New Software… se abre una ventana de dialogo.
Hay un desplegable que se titula Working with. Selecciona el repositorio 2022-03 - https://download.eclipse.org/releases/2022-03 que es válida en el momento de este artículo.

En el árbol de debajo, Programming Languages y dentro de el C/C++ Unit Testing Support.

Esto por ahora, mas adelante lo configuraremos con nuestro proyecto.

Crear un proyecto.

Ahora creamos un proyecto así que vamos a File → New → C/C++ Project. Esto abre una ventana.
Yo sugeriría crear uno del tipo C++ Managed Build. Esto significa que Eclipse se encarga de compilar y enlazar automáticamente.

En la siguiente página de la ventana le damos un nombre al proyecto y en Project type podemos seleccionar Hello World C++ Project. Y en la lista de al lado podemos ver los toolchains que disponemos. Seleccionamos MinGW GCC.

Ahora deberíamos tener un proyecto con un código de ejemplo con el obligado Hello World.

Ahora en la lista de proyectos de Project Explorer hacemos click con el botón derecho del ratón y en el desplegable seleccionamos properties y se abre una ventana.

En esta ventana hay un árbol en el lado izquierdo. Vamos a C/C++ General → Paths and Symbols.
En el lado derecho del árbol hay varias pestañas.

Vamos a la pestaña Includes y en la lista de lenguajes seleccionamos GNU C++ y en el lado derecho hacemos click en el botón add…

Se abre otro dialogo. En el hacemos click en File system… y buscamos la carpeta include de Google Test. Sería asi: C:/Program Files (x86)/googletest-distribution/include

Ahora vamos a la pestaña Library Paths y del mismo modo pulsamos add… y en el siguiente dialogo hacemos click en File system… igual que antes pero ahora buscamos la carpeta C:/Program Files (x86)/googletest-distribution/lib

Por último volvemos al arbol de propiedades de la izquierda, en C/C++ Build → Settings y en la pestaña Tool Settings hay otro arbol. Vamos a MinGW C++ Linker → Libraries y en el lado derecho encontraremos dos listas, una vacia y la otra con la ruta C:/Program Files (x86)/googletest-distribution/lib que introdujimos antes.

En la lista vacia necesitamos añadir dos libreria, una llamada gtest y la otra gtest_main como en la imagen:

Bueno pues ahora nuestro proyecto puede compilar enlazando la librería GoogleTest.

Añadir el test runner

Por último añadimos un test runner que es para usar el pluging de tests unitarios que instalamos antes en nuestro Eclipse.

Para ello buscamos en la barra de herramientas el botón run que tiene una flechita hacia abajo.
Del menú desplegable seleccionamos Run Configurations…
Esto nos abre una ventana con un árbol a la izquierda. En el árbol buscamos C/C++ unit y con el seleccionado hacemos click en el botón nuevo que esta sobre el arbol y esto creará un nuevo nodo bajo C/C++unit.

En el lado derecho del árbol tenemos el nombre del test runner.
Si no nos gusta el nombre que tiene lo podemos cambiar. Al mio lo llamé GTTests Unit Tests.

Bajo este, tenemos varias pestañas. Vamos a C/C++ Testing. Aquí encontramos un formulario muy sencillo. Tiene un desplegable titulado Tests Runner. Pués seleccionamos Google Tests Runner.


Probando que funciona.

A este punto ya esta todo configurado y listo para comprobar que funciona.
Volvemos a nuestro código. Podemos borrar todo lo que haya y poner este otro código:

#include <iostream>
#include <gtest/gtest.h>

TEST(FooTest, tests_foo){
	ASSERT_TRUE(true);
}

Ahora pulsamos el botón de compilar. El que tiene un icono de un martillo.
Y para ejecutarlo podemos pulsar el botón run.
Esto nos da una salida en modo consola que nos dice que ha pasado los tests porque ese test que hemos hecho esta diseñado para ser pasado.
Pero esta es la salida que nos da cuando ejecutamos el ejecutable que hemos generado tal cual.

Como ahora tenemos un test runner podemos seleccionarlo en el menú desplegable de al lado, en mi caso lo llamé GTTests Unit Tests. Y si ahora pulsamos correr, lo que vemos es el runner en vez de la consola con la información en un formato más amigable.

Y hasta aquí este artículo. En siguientes artículos nos meteremos mas de lleno en como hacer test unitarios.

Comentarios

Entradas populares