Sep 03 2008

GoogleTest

Categoría: Test UnitariosJuan @ 1:18 pm

Ahora que, de nuevo, Google está en boca de todo el mundo debido al lanzamiento de su nuevo navegador Chrome, quiero hablar de googletest o gTest como me gusta llamarlo. Que conste que no soy un seguidor acérrimo de Google y no uso todo lo que “saca” pero reconozco que algunas de sus creaciones son muy buenas y este es el caso concreto de gTest.

gTest es un entorno de pruebas unitarias para C++ que ya va por la versión 1.0.1 y que está continuamente bajo desarrollo. Además, la documentación es bastante aceptable.

Su instalación y uso tanto en Windows como en Linux es muy sencilla, basta con descargar el código, compilarlo y utilizar (enlazar) la librería generada en tu programa junto con incluir los ficheros de cabecera. El ejemplo más sencillo que se me ocurre es este:

#include <gtest/gtest.h>TEST (GrupoTest, Test1)
{
   ASSERT_TRUE (false) << “Esto va a fallar!”;
}

int main (int argc, char **argv)
{
   testing::InitGoogleTest (&argc, argv);
   return RUN_ALL_TEST();
}

La creación de pruebas es muy sencilla y no requiere tantas florituras como en otros entornos de test unitarios (véase, por ejemplo CppUnit). Sus principales ventajas son:

  • Soporta “fixtures” (uso de la misma configuración en distintas pruebas) a nivel de test como a nivel global.
  • Fallos fatales (ASSERT, cuando ocurren se sale de la función en ejecución) como no fatales (EXPECT, la ejecución sigue sin modificación)
  • Buen conjunto de macros de verificación (ASSERT y EXPECT)
  • Ejecutar las pruebas individualmente.
  • Ejecutar las pruebas según un patrón (por ejemplo, todas aquellas que contengan la palabra “memoria”)
  • Ejecutar varias veces la misma prueba o grupo de pruebas.
  • Informe de los resultados en texto o en XML.

Lo que ahora mismo le hecho un poco en falta es soporte para excepciones con ASSERT y EXPECT (algo así como ASSERT_THROWS). Para verificar una excepción en un test hay que hacer algo como, por ejemplo:

try {
   lo_que_sea_que_lanza_una_exception();
   ASSERT_TRUE (false) << "No ha habido excepción";
}
catch (MiException e) {
}

Además, el entorno carece de un sistema para limitar el tiempo de ejecución de un test o de un grupo de pruebas (por lo menos yo no lo he encontrado). Esto es muy práctico cuando se quiere evitar el tener un bucle infinito o mantener el tiempo de ejecución de las pruebas bajo un límite y, lo más importante, verlo cuanto antes.

La salida en texto (consola) del test más básico mostrado al principio es la siguiente:

gtest_output.jpg

Etiquetas: ,

Leave a Reply