Anuncios

Bienvenidos sean a este post, hoy veremos un tipo de test.

Anuncios

Una unidad es un componente individual en una aplicacion mas grande o compleja. Por lo general, una unidad tiene su propia interfaz de usuario, tal como una funcion,, clase, o un modulo entero. El testing de unidad es un metodo de testeo de software usado para determinar si una unidad de codigo se comporta en los terrminos de sus requerimientos de diseño. Sus principales caracteristicas son las siguientes:

  • Es pequeño y simple, simple de escribir y correr, y nos permite determinar algunos problemas en el inicio del ciclo de desarrollo y poder solucionarlos
  • Como esta aislado de las dependencias, se pueden correr multiples casos en paralelo
  • Los manejadores de test de unidad nos ayudan a entender la interfaz de la unidad
  • Nos ayuda enormemente en los tests de integracion y aceptacion cuando unidas chequeadas son integradas mas tarde
  • Normalmente es preparado y desarrollado por desarrolladores
Anuncios

Si bien podemos escribir un paquete de test de unidad desde cero pero porque querer reinventar la polvora si ya existen muchas herramientas. Estas se denominan UTF (Unit Testing Frameworks) y algunos de los mas populares son: Boost.Test, CppUnit, GoogleTest, Unit++, y CxxTest. Algunas de las caracteristicas que ofrecen estos son las siguientes:

  • Se requiere una minima cantidad de trabajo para crear un nuevo test
  • Dependen de librerias estandares y se pueden cruzar entre plataformas, dando portabilidad a estos
  • Estos soportan accesorios, esto pemite reutilizar la misma configuracion para objetos en diferentes test
  • Estos manejan muy bien excepciones y «crasheos», pero UTF puede reportar una excepcion aunque no un crash (detencion inesperada)
  • Tiene buena funcionalidad de assert, esto significa que un fallo de assert procede a mostrar la ubicacion del codigo fuerte y el valor de las variables donde ocurrio
  • Soporta varios tipos de salida y estos pueden ser analizados por personas
  • Soporta conjuntos de test, y a su vez estos pueden contener varios test diferentes
Anuncios

Vamos a analizar como trabajar con Boost, porque este soporta tres tipos de variante de uso: the single-header only, the static library y shared library. Esto incluye cuatro tipos de test: test sin parametros, test conducidos por datos, test con plantillas y test parametrizados. Para usarlo necesitamos seguir estos pasos:

  1. Definir el nombre de nuestro de programa de test, sera usado en los mensajes de salida
  2. Elige una de las variantes de uso antes citadas
  3. Elige y agrega un tipo de test en el conjunto de test o test suite
  4. Realizar comprobaciones de correccion en el codigo probado
  5. Iniciar el codigo bajo test antes de cada tipo de test
  6. Personalizar la manera en como se mostraran las fallas del test
  7. Controla la conducta de ejecucion del modulo de test creado, tambien conocido como configuracion de ejecucion (runtime configuration)
Anuncios

Vamos a analizar algunos de estos pasos mediante el siguiente codigo:

#define BOOST_TEST_MODULE mi_test
#include <boost/test/included/unit_test.hpp>

BOOST_AUTO_TEST_SUITE( mi_suite )

BOOST_AUTO_TEST_CASE(test_caso_1) {
 char x = 'a';
 BOOST_TEST(x);
 BOOST_TEST(x == 'a');
 BOOST_TEST(x == 'b');
}

BOOST_AUTO_TEST_CASE( test_caso_2 )
{
  BOOST_TEST( true );
}


BOOST_AUTO_TEST_CASE( test_caso_3 )
{
  BOOST_TEST( false );
}

BOOST_AUTO_TEST_SUITE_END()
Anuncios
Anuncios

Primero definimos el nombre de nuestro test y luego importaremos el modulo de boost para poder trabajar con los test. La siguiente linea define al conjunto o suite de test. Lo siguiente sera agregar tipos de test a nuestro conjunto, para todos los casos usamos a BOOST_AUTO_TEST_CASE. Por un tema de practicidad usamos este porque permite declarar y registrar un tipo de test en el conjunto. En el primero, definimos una variable con un valor y luego chequearemos tres condiciones del estado de la variable. En el primer caso, verifica que tenga un valor, el segundo si posee un valor determinado y en el tercer caso con otro valor. En cada uno de los test le pasamos un nombre para identificarlo correctamente al momento de hacer el reporte. En el segundo test devolvemos un true y en el tercer test devuelve un false. La ultima linea se encarga de cerrar el conjunto y que podamos comenzar a utilizarlo.

Anuncios

Si lo compilan, nos devolvera un error porque no tenemos todo lo necesario para trabajar con boost. Para ello, debemos ejecutar el siguiente comando::

$ sudo apt-get install libboost-all-dev
Anuncios

Esto instalara todos los modulos necesarios desde el repositorio de debian, lo mismo aplica para otras distros de linux, y si todo salio bien pueden proceder a compilarlo. Ahora no debe devolver ninguna falla, y si lo ejecutan tendremos la siguiente salida:

$ ./depurar
Running 3 test cases...
depurar.cpp(10): error: in "mi_suite/test_caso_1": check x == 'b' has failed ['a' != 'b']
depurar.cpp(21): error: in "mi_suite/test_caso_3": check false has failed

*** 2 failures are detected in the test module "mi_test"
$
Anuncios

Pueden ver que nos informo que se van a correr tres tipos de test. En el reporte nos muestra que fallo en dos de los tres, esto es asi porque el test termina encontrado una condicion falsa por lo tanto considera que fallo. En el primer test es porque x no tiene el caracter b y en el tercero porque pasamos un false directamente. El segundo test al devolver un true se considera como exitoso. Este test que utilizamos contempla los pasos del 1 al 4, si necesitan saber mas sobre los pasos restantes les recomiendo visitar la siguiente pagina:

https://www.boost.org/doc/libs/1_70_0/libs/test/doc/html/index.html

Anuncios

En resumen, hoy hemos visto a test de unidad, que es, como se compone, algunas herramientas para poder usarlas, y un ejemplo para ver como trabaja. Espero les haya resultado de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios

Donación

Es para mantenimento del sitio, gracias!

$1.50