javisantana.com

Test unitarios en C++: guía rápida

Propongo un contexto real: estamos programando bajo una plataforma asquerosa difícil de trata, pongamos una PDA. Tenemos un módulo, por ejemplo una clase que carga un fichero de configuración, que queremos probar y no queremos crear un programa específico para PDA que use la clase, cargue un fichero que hemos tenido que copiar y luego muestre resultados. Es mucho más cómodo hacerlo haciendo un “make” desde la línea de comandos.

Hay diferentes frameworks para hacer test unitarios en C++, cada uno con sus ventajas, se puede ver un análisis (bastante pragmático) en games from whitin. Yo he escogido cppunitlite, por las siguientes razones:

- tiene todo lo que necesito: fixtures, asserts
- no tiene dependencias, se compila con un solo make y a funcionar
- apenas son 10 ficheros

Una vez bajado para arrancar a funcionar solo es necesario tener instalado un compilador. Para windows me gusta usar Mingw ya que además trae make. Además conviene tener instaladas las herramientas de línea de comandos de linux para windows (si no las tienes intaladas ya mereces un castigo).

Bueno, vamos a crear el primer test unitario (formateo patrocinado por el conversor a HTML de vim):
//
#define GLOBAL_CONFIGURATION “configuration.txt”
#define DEBUG_INFO
#include “lib/TestHarness.h”
#include “../../src/configuration.h”

class ConfigurationFixtureSetup : public TestSetup
{
public:
    void setup()
    {
        entries.push_back(conf_entry(“LOG_PROY_DATA”,0));
        entries.push_back(conf_entry(“GGA”,1));
        entries.push_back(conf_entry(“GGL”,1));
        entries.push_back(conf_entry(“RMC”,1));
        entries.push_back(conf_entry(“RMZ”,1));
        entries.push_back(conf_entry(“VTG”,0));
        entries.push_back(conf_entry(“GSA”,1));
        entries.push_back(conf_entry(“LOG_REAL_DATA”,0));
        entries.push_back(conf_entry(“SMOOTH_DIR”,0));
        entries.push_back(conf_entry(“RATE”,10));
        entries.push_back(conf_entry(“THRESHOLD_VEL”,0));
        entries.push_back(conf_entry(“SHOW_CALC_DIR”,0));
        entries.push_back(conf_entry(“SHOW_VELOCITY”,0));
        entries.push_back(conf_entry(“SHOW_SAT_INFO”,1));

    }

    void teardown()
    {
        entries.resize(0);
    }

    
protected:
    Configuration fixture;
    struct conf_entry
    {
        conf_entry(const char *n, int v):
        varName(n),
        value(v)
        {}
        const char* varName;
        int value;
    };
    std::vector<conf_entry> entries;
};

/**
*/
TESTWITHSETUP (ConfigurationFixture,Test_ReadConf)
{

    for(int i = 0; i <  entries.size(); ++i)
    {
        int value;
        CHECK(Configuration::GlobalConfiguration()->getValue(entries[i].varName, value));
        printf(“%s-> %d\n”,entries[i].varName, value);
        CHECK( value == entries[i].value);
        
    }

}

En resumen lo que hace es cargar un fichero de configuración y testear que todos los valores cargados son los esperados.

Es un test muy simple y se puede lanzar desde la línea de comandos después (o antes) de la compilación sin necesidad de meterlo en la PDA, que es un coñazo terrible.

Si de verdad quieres saber un detalle como hacer test unitarios en C++ recomiendo que leas Pruebas unitarias con C++, extenso y completo artículo de como hacer test en C++ con CPP unit escrito pon JM, un compañero de Unkasoft.

Como no hacer una solicitud de distribución

Sí, de nuevo esta semana otra solicitud de distribución que paso a reproducir eliminando los datos menos importantes:

”””
Buenos dias:

Estamos interesados en el sistema de guiado gps, somos concesionario de XXXXX XX para las provincias de Zamora y Leon, y vendemos recambios en toda España, quisiera que me pasasen informacion detallada a si como el precio que tendriamos para su comercializacion en nuestras tiendas.

Atentamente:

Fulanito J. de Tal
Subdirector de Algo importante
Direccion de Algo más importante aún
Grupo Internacionalísimo
“””

No me lo explico, no es él el que está interesado? ¿no debería tratar de comprarme? ¿no debería él hacer el esfuerzo por que yo estuviera interesado en hacer que ellos ganen dinero sin haber matado ni una neurona? ¿No somos nosotros los que estamos haciendo la parte difícil?

España es así amigos, haces el trabajo y luego otros quieren venderlo… no se dan cuenta que son muchos los que venden y pocos los que producimos? ¿se habrán dado cuenta que la ley de oferta y la demanda funciona?

Para empezar deberían haberme llamado por teléfono. Como bien dice Jesús de la Torre, si alguien está de verdad interesado en tu producto te llamao por teléfono y estas personas nisiquiera se han dignado a busca un teléfono de contacto o a poner alguno para contactar con ellos.

Soy muy bruto y mucha gente me dice que debería contactar con alguien para distribuirlo, pero es que no me apetece, no me parece bien introducir intermediarios que no quieran hacer nada. Hasta ahora los únicos que me han propuesto algo decente y se han molestado han sido las personas de Argentina. Sé que las cosas no funcionan así, que posiblemente dentro de unos años me arrepentiré, pero es que me niego a entrar en esa dinámica. No sé hasta donde llegaremos así, quizas no muy lejos, pero no pasa nada, no tendré la espinita clavada de que una persona sin hacer nada se lleve un euro, máxima de la persona triunfandora en España. Me gustan las personas que trabajan duro por algo, sea para correr 100m. en 10 segundos o para conseguir cualquier soplapollez y esas son las que se merecen mi respeto.

Hace unos meses pensé que estabamos en pleno boom, pero me equivoqué, el boom aún no ha comenzado :D

Que pasa si te comes la rueda de un camión por la autovía...

Pues dos cosas:

- que el coche te queda así (está desmangado):

- que los HIJOS DE LA GRAN PUTÍSIMA del seguro te pones pegas para todo. Son unos HIJOS DE PUTA sin escrúpulos cabrones, eso dejando a un lado la incompetencia, llegando al límite de no saber ni leer lo que puse en el formlario web con el agente de la compañía.

“Suerte” que me toca renovar el seguro ahora para no volver a topar con gentuza de este tipo.

Cuando te comes una rueda de un camión ...

por la autovía lo que debes hacer es:

- ver si puedes seguir andando
- si puedes, ir por todas las salidas dela autovía mirando en los bares de camioneros a ver si hay algún camión con la rueda reventada.

Sí, ayer me comí una señora cubierta de un camión a 128km/h por la autovía, había esquivado perros, trozos de rueda, de metal, cajas y bicicletas, pero esta no pude verla a tiempo y prefería comermela antes de esquivarla (el suelo estaba mojado) a pesar de que cuando la vi pensé que iba con llanta y todo.

EL resultado: el radiador doblado, el aire acondicionado roto, no sé qué válvulas rotas, un antiniebla y todo el frontal. Por suete encontré al camionero e hicimos parte.

Estas cosas te hacen pensar que si hubiera sido una persona en vez de una rueda hoy posiblemente hubiera más de 0 muertos, pero tampoco puedes vivir con el miedo de que aparezca una persona en medio de una autovía. Da que pensar, pero es mejor pensarlo poco.

Mira que a veces pruebo a hacer alguna “macarrada” con el coche (siempre en caminos y zonas no transitadas) para intentar aprender a controlarlo por si algún día necesito saberlo, pero me da si pego un volantazo a 130 no controlo el coche ni loco.

Parece que no soy el único

Partes de un negocio: los escrúpulos

Cuando vamos a comprar algo que no conocemos, sobretodo cuando hay tecnología de por medio, te tienes que fiar del vendedor y un poco de las opiniones en internet (suelen estar bastante sesgadas).

Creo que para que un negocio vaya bien, perdón, para ganar dinero con él, tienes que tener pocos escrúpulos, esto es, lo que la gente denomina saber vender. Es muy común que si comentas los defectos de un producto y si encima te lo dice el propio vendedor termines por no venderlo (a veces esto también interesa). En mi opinión es porque la mayoría de la gente no sabe de la producción: todo tiene fallos, más jodidos o menos, más visibles, etc, pero es algo inherente a todo.. por mucho dinero que gastes, mucho tiempo que consumas, va a haber errores que te van a llegar.

Pongo el caso de la compra de un coche. Cuando vas a comprar un coche buscas un modelo que te guste, que se adecue a tu presupuesto, que se adapte a tus necesidades… entonces vas a internet y haces un recuento de errores frecuentes. Ya los conoces y sabes a lo que te enfrentas cuando lo compras, pero qué pasaría si en el concesionario te dijeran: “oye, a veces en primera da tirones, pero solo a revoluciones muy bajas”. Seguro que ya dudas.

A mi me gustaría, así como te cuentan todo lo bueno también te podrían comentar lo malo… pero eso nunca se hace. No soy ningún especialista, pero es muy fácil convencer a una persona para que compre algo, solo hay que saber un poco de su vida/negocio y ponerselo a huevo. En nuestro caso es muy fácil mirar rápidamente a la nave donde guarda todo el señor y ver qué máquinas tiene, si las ha comprado hace poco, donde las ha comprado, qué tipo de siembra hace (parece difícil, pero al final terminas haciendolo sin querer) y decirte todo lo buenísimo que es el producto para todo lo que tiene (ver anecdota abajo *). Sin embargo no tengo suficientes pocos escrúpulos y casi siempre termino contándoles donde falla, por qué, como está resuleto, etc. En mi opinión es bueno decir en qué falla algo, qué problemas tiene, pero la gente prefiere ver que lo que compra es perfecto. No soy nada partidario de vender las cosas, soy partidario de que te las compren convencidos de lo que compran, sabiendo los posibles fallos y las ventajas. Se reconoce rápidamente a una persona que sabe lo que quiere, incluso por teléfono.

(*) anécdota al respecto de lo anterior: un día estabamos enseñándole a un agricultor el sistema, no lo tenía nada claro, entonces me fijé en que las ruedas de su laguna eran de 225 mm de ancho (las de ese modelo vienen de fabrica con 205mm), lo que me hizo pensar que al tío le gustaba correr. Entonces le dije que en la PDA podría instalar un navegador con detector de radares. Al cabo de unas horas nos llamó para comprar uno :).