Ouracademy

Detestable: testing

El otro día me encontre con un post muy corto de Martin Fowler, quizá el más corto que he leido, sobre un término de testing, bien puntual pero potente. Aquí lo que decía, en su post:

(Aquí algo para que lo agregues a tu diccionario.)

Detestable (adjetivo): software que no es testeable (capaz de ser probado).

Ejemplos?

Esos códigos altamente acoplados, enredados, spaguetti 🍝....que ocasionan que los tests fallen de vez en cuando y que sin saber no sabemos porqué (esos test para nada deterministicos).

A nivel super pero super simple, como ejemplo podríamos poner una función que nos diga si hoy es de mañana, noche, tarde...

// C#
public static string GetTimeOfDay()
{
    DateTime time = DateTime.Now;
    if (time.Hour >= 0 && time.Hour < 6)
    {
        return "Night";
    }
    if (time.Hour >= 6 && time.Hour < 12)
    {
        return "Morning";
    }
    if (time.Hour >= 12 && time.Hour < 18)
    {
        return "Afternoon";
    }
    return "Evening";
}

Su prueba, podría ser algo como:

[TestMethod]
public void GetTimeOfDay_At6AM_ReturnsMorning()
{
    string timeOfDay = GetTimeOfDay();
    Assert.AreEqual("Morning", timeOfDay);
}

El error?, bueno dependiendo de la hora que ejecutes el test puede que funcione o falle, si ejecutas la prueba a las 8pm...fallara. Existen muchas formas de solucionarla, una configurando la hora del sistema a una hora fija (y claro lo mismo para cada if de GetTimeOfDay) u otra simplemente agregar como parametro la hora a la función GetTimeOfDay

Claro este es un ejemplo sencillo. Ahora imaginate esa función pero no como una función en sí sino como unas lineas parte de una función ABC de +1000 lineas...imaginate intentar crear el test para la función ABC. A eso le llamo detestable.

A menudo, estos tipos de problemas se dan por funciones altamente acopladas y gigantes (de cientos o miles de lineas de codigo) que manejan un valor global cambiante, ya sea una variable o método propio del lenguaje o una librería (como el DateTime.Now) o por el uso de propiedades de clases (static). Confieso, que esto me ha pasado un par de veces, aunque a Martin Fowler tambien y a muchos desarrolladores bien conocidos tambien, por lo que evito usar static, y sino eso no te convence de no usar static, bueno te dejo un video para que te convenza 😉

Referencias:

Cambios y revisiones:

18/12/2019: initial release

14/12/2019: new post detestable testing

Si te fue útil este artículo, por favor compártelo. Apreciamos los comentarios y el aliento.
Compartelo por:

Quiza te pueda interesar...

Unit Test: que no es?

Quieres saber si tu prueba es un unit test, bueno aca un test de lo que no es un unit test: • Si se conecta con una base de datos • Si se…

TestInvariant: TDD y DbC

Una idea que mezcla Test Driven Development (TDD) y Design by Contract (DbC).

CoreNLP: Un tutorial

Extrayendo entidades y relaciones de ciertas paginas web