sábado, septiembre 19, 2015

Pruebas unitarias como actividad de diseño

Hace ya como quince años que escribí una librería muy sencilla que llamé AutoTest. La escribí en Visual C# 1.0 y .NET Framework 1.0 por ahí entre 2000 y 2001. Me hizo falta pues en ese tiempo no supe de la existencia de ninguna librería para pruebas unitarias en .NET. Me hizo falta para diseñar software pues desde esa época ya estaba yo «infectado de pruebas». La infección, como a muchos otros diseñadores de software de aquella época, me ocurrió al exponerme a dos experiencias: (1) la lectura del artículo por Kent Beck y Erich Gamma con las palabras «Test infected» en el título, (2) la lectura y participación en las campales discusiones en la lista de distribución por correo electrónico de Object Technology User’s Group (OTUG) hospedada por la ya desaparecida Rational Corp. Discusiones donde personajes como Grady Booch, Kent Beck, Robert C. Martin, Steve Mellor, etc., polemizaban sobre métodos sistemáticos de análisis y diseño, sobre eXtreme Programming en general y Test-first programming en particular (ahora mejor conocida como Test-Driven Development, TDD), y sobre otras escuelas de pensamiento en diseño profesional de software.

AutoTest fue mi herramienta en ese tiempo para escribir pruebas unitarias a priori automatizas en .NET y con ello expresar varios tipos de expectativas de mis diseños. Expectativas que verificaba por demanda de manera ejecutable y automática. A esa técnica luego empecé a llamar: la realización de una «especificación funcional ejecutable».

Antes de AutoTest ya había ocurrido mi infección por escribir pruebas unitarias como un medio para diseñar software; es decir, a priori: no como validación y verificación de algo ya existente (a posteriori) sino como medio para empezar a pensar el diseño de la interfaz pública del software que aún no existe. Tiempo antes mi infección ya me había hecho tomar la versión CppUnit para Visual C++ de Michael Feathers —a su vez inspirada en la versión inicial de JUnit de Erich Gamma y Kent Beck— y adaptarla para el Borland C++Builder 4.0 de aquel 1999.

Con “contagio” o “infección” me refiero a que una vez que entendí y experimenté la técnica de diseñar software por medio de pruebas unitarias, entonces decidí de manera irrevocable que no había vuelta atrás pues me había topado con algo para lograr un siguiente nivel de calidad y profesionalismo en diseño de software. Además, el artículo «Test infected», ya mencionado, se refiere más o menos a esto mismo.

Olvidé que en ese tiempo había publicado una breve nota al respecto de AutoTest. La escribí antes de que existiera Blogger.com y en aquel entonces la publiqué en mi primer espacio en Internet: AutoTest - Unit testing framework.

En un proyecto personal en la actualidad salió el tema de los riesgos de confiar demasiado en herramientas que intentan “hacer todo por ti” y, por supuesto, salió a colación el manuscrito del Profesor Edsger Wybe Dijkstra donde mencionó algo al respecto. No tenía a la mano mi colección base de referencias, así que hice una búsqueda para localizar en Internet dicho manuscrito y en los resultados apareció mi nota de hace casi quince años.