Mostrando entradas con la etiqueta TDD. Mostrar todas las entradas
Mostrando entradas con la etiqueta TDD. Mostrar todas las entradas

abril 27, 2011

¿Es TDD la hermana pequeña de la validación formal?

Hace un tiempo, al crear el grupo de TDD en castellano, hacía esta pregunta del título. ¿Es TDD la hermana pequeña de la validación formal? Hay un artículo del gran E. W. Dijkstra, "Sobre la crueldad de verdaderamente enseñar ciencias de la computación" que me parece muy revelador tal y como hoy entendemos la ingeniería del software, y cómo se veían las cosas hace tan solo poco más de 20 años.
Básicamente Dijkstra proponía enseñar a los estudiantes de informática, como introducción en el primer curso, la validación formal de los programas sin siquiera tocar un ordenador para programar. Bastante sorprendente.
¿podremos un día verificar formalmente que un programa hace lo que esperamos que haga, y nada más? Lo que pasa, que el principal problema no es verificar, si no CONOCER, aprender, asimilar, conceptualizar lo que tiene que hacer.
Os dejo con este video, del 2001, con una pequeña entrevista a tan interesante personalidad.



Podeis encontrar todos sus manuscritos, algunos de ellos traducidos a castellano en la universidad de Texas.
Computer science is no more about computers
than astronomy is about telescopes
E. W. Dijkstra
Siempre me ha intrigado el verdadero sentido de esa frase...

marzo 07, 2011

Agilismo a nivel táctico

Hace unos días discutíamos entre los "javeros" de Biko2 sobre las mejores prácticas, herramientas, librerías, automatizaciones que cada proyecto debería llevar en busca de la verdad, o sea, la calidad perfecta :)

Se empezó a hablar mucho de cuestiones concretas, y divagamos un poco sobre algunas herramientas o prácticas a incorporar o reforzar, que para eso nos encanta discutir como al que más. Estas cuestiones las asocio al nivel táctico de aplicación del agilismo en una organización, maniobras en corto plazo que son directamente aplicables para conseguir un fin sobre el campo de batalla. Pero me dio la impresión de que nos perdimos en siglas y nombres, y desglośe un poco por niveles lo que hallaba importante. Os extraigo pues un pedacito del email que envie en ese momento a mis compañeros, sobre los niveles de actuación para la calidad, como desarrolladores en labores técnicas:

  • Programación: PMD o checkstyle (herramientas de análisis de código) nos ayudan a no cometer errores varios, aún teniendo que repasar las posibles reglas que pongamos. Pero cada linea que escribimos es una decisión que tomamos sobre la aplicación, y eso solo se resuelve con la inteligencia del desarrollador. Hay que saber cosas de SOLID, de gestión de excepciones, de gestión de logs,... etc. que NO SE PUEDEN AUTOMATIZAR.

  • Ecosistema: El ecosistema nos puede comprobar que no rompemos el build, que tenemos buena cobertura de tests, que tenemos infraestrucutra pra hacer TDD, buenas métricas del sonar, despliegues automáticos, la gestion de merges/branches.... pero todo esto,no hay manera que nos lo haga solo... solo depende de la inteligencia, y ahora, también, el trabajo duro del desarrollador. Hay que saber de integración continua, de gestión de ramas,...

  • Aplicación: A nivel aplicativo tenemos la definición de terminado-TER-MI-NA-DO, las pruebas de aceptación, o sea, la parte funcional. Aquí entra en juego lo anterior: la inteligencia y el trabajo duro, pero sobre todo, la responsabilidad y el compromiso del desarrollador, las ganas de hacer las cosas bien y emocionar al cliente.
Un saludo a mis colegas de Biko, que sé que me leen ;)

enero 26, 2011

Testeo defensivo, o que disparen a ese API

A raíz de una entrada de @sergioazo y su correspondiente conversación, he recordado una técnica que leí en algún sitio para minimizar los problemas en el trabajo con librerías externas de terceros en tu proyecto.
Se puede usar para varias cuestiones:
  • Comprender el funcionamiento real de una librería (no el esperado)
  • Defenderte frente a cambios en el comportamiento futuro de la librería
  • Documentar el uso de una librería, su API.
Se puede decir que vamos a generar test unitarios, en los que no podemos escribir el nombre del método de test hasta el final. Si hacemos TDD, el nombre del test deberá indicar que comportamiento queremos asegurar, y después programamos ese test. En este caso, podremos poner un nombre al método realmente coherente al test, cuando ya tenemos los assert ejecutando y comprobados en verde. Quizás coincida con lo esperado, o quizás no. Sugiero que se guarden los dos nombres, para comprender las diferencias encontradas, que probablemente también desconcierten al próximo programador que coja tu código que usa esa librería.

Si tenemos tests de los usos que hace nuestra aplicación de una librería, el cambio de versiones de la misma, puede ser testeado. Basta con ejecutar nuestra suite de integración, para que nos corrobore si la librería sigue funcionando tal y como esperamos.

Veamos un ejemplo. Imaginemos que tenemos un API tal que así:

public String guardaDocumento(String docType, byte[] data);
public byte[] obtenerDocumento(String docCode);

Y no tenemos más información, parece bastante obvio lo que hace, pero queremos asegurarnos, y sobre todo tener cuidados con los cambios con esa librería que se está desarrollando. Podemos hacer un test de la siguiente manera:

public void deberiaDevolverElMismoDocumentoPorCodigo(){
Repositorio repositorio = new Repositorio();
String docCode = repositorio.guardaDocumento("tipo1", "Hola Mundo".getBytes());
assertArrayEquals("Hola Mundo".getBytes(),
repositorio.obtenerDocumento(docCode));

}
Pero, este test, tan simple como almacenar un documento y obtenerlo de nuevo, se queda en rojo. ¿por qué? Por que resulta que el código necesita después, no es el mismo código que devuelve
Por lo que finalmente tras unas pruebas (o un telefonazo a alguien harto de tus preguntas) llegamos a la conclusión, que el código que necesita el "obtenerDocumento" es la concatenación del tipo de documento y el código devuelto al guardarlo.
Por tanto, modificamos el test, y después modificamos el nombre del test.

/**
* was:deberiaDevolverElMismoDocumentoPorCodigo
*/
@Test
public void deberiaDevolverElMismoDocumentoPorTipoDocumentalYCodigo(){
Repositorio repositorio = new Repositorio();
String docCode = repositorio.guardaDocumento("tipo1", "Hola Mundo".getBytes());
assertArrayEquals("Hola Mundo".getBytes(),
repositorio.obtenerDocumento("tipo1" + docCode));
}
¿conseguimos con esto los objetivos inicialmente planteados?

(nota:basado en hechos reales)

noviembre 26, 2010

Coderetreat y TDD, en Donosti

El sabado estuve en el #coderetreat de Donosti. Contamos con la presencia de Enrique Comba, que hizo de maestro de ceremonias, planteando el problema y dándonos los pasos a seguir para las prácticas en cada iteración.
Os animo desde aquí a que os organiceis un evento de estos dónde podais, en realidad no hace falta traer a ninguna estrella, solo tener ganas de aprender un día, y de pasarlo bien.

Ha sido un día muy interesante, practicando un poco de programación, con TDD. Me he dado cuenta, primero, de que estaba muy oxidado, y segundo, de que tengo mucho que practicar para comprender en profundidad las implicaciones de TDD. Por que hacer bien TDD implica programar bien, preguntándote en cada momento por qué estás poniendo el código que estás escribiendo, y entendiendo las razones del diseño.

Lo que hicimos este día fue intentar resolver el juego de Conway. Es un problema sencillo de entender, pero con suficiente complejidad para que pueda salir un bonito diseño orientado a objetos, merezca más de una discusión trabajando el diseño desde TDD.

Las dos primeras itearaciones, que eran libres, sin "putadillas" sugeridas por Enrique, creoq ue casi todos empezamos a diseñar o un Tablero, un universo, unas celdas, etc... hubo quien diseño a un dios contemplando el juego :)
Mi principial descubrimiento es que empezabamos a hacer TDD desde un punto del problema en el que para empezar los tests habíamos tomado decisiones de diseño de modelado del problema. Sí, antes de empezar siquiera con los tests.
Esto ya me puso nervioso y en la segunda iteración, con @sharpbites propuse empezar por lo que sería el inicio, una interfaz del juego, que resolviese el asunto. Un test de aceptación, vamos, más en la linea (creo) de un enfoque BDD. Y nos atascamos, vaya si nos atascamos. ¿por qué? Por que intentábamos llegar a la solución que teníamos en la cabeza. En general, a todos nos resultaba más facil empear desde niveles inferiores de la solución, con un enfoque bottom-up.

Enrique propuso una solución que me convenció, pero que tendré que poner en práctica unas cuantas veces. Se trata de partir del test de aceptación, de la definición del problema (top-bottom), y realizar un rápido desarrollo que nos lleve a una primera solución, aunque sea grosera. Después, hacer el bottom-up e ir completando los desarrollos que falten para tener la certeza de tener suficientes casos de prueba y un buen diseño generado.

Lo que conseguimos es tener enseguida una primera versión, y después fortalecer el diseño y desarrollo con el detalle.



Definitivamente, fue un día muy aprovechado, por compartir experiencias con otra gente, y por aprender algo de cada uno de ellos. Tendremos que hacer más de estas por la Zona Norte :), no os las perdais, seguid informados en Agile-Spain.
Gracias a todos los asistentes, y a Gailen por patrocinar el evento, que pudimos comer de gorra! ;)

enero 11, 2010

Libro de TDD en castellano

El primer libro sobre Desarrollo Guiado por las Pruebas (TDD) en castellano acaba de ver la luz. Carlos Ble junto a algunos colaboradores ha editado un libro más que recomendable para cualquiera que esté interesado en esta metodología de desarrollo, o en las metodologías ágiles en general.
Es un libro que además aporta conocimientos generales de diseño basado en objetos, o metodologías ágiles. Hace un repaso con ejemplos de cómo desarrollar con TDD, e introduce el desarrollo guiado por las pruebas de aceptación (ATDD).
Sin duda un libro que debes descargar, es de libre distribución, y estudiar con profundidad. Seguro que aún mejor si se lo compras o le haces una pequeña donación :), que merece la pena. Yo he tenido el placer de poder seguir el proceso de creación del libro como pequeño revisor, y el material creado por Carlos es muy bueno, espero impaciente su próximo libro ;)

Aprovecho para recordaros la existencia del grupo de TDD en castellano!

marzo 25, 2009

Scrum y TDD

En realidad este post es solo dos anuncios ;)

Y os cuento, que nosotros estamos en fase de adopción de TDD, y ya trabajando con Scrum. La adopción de TDD no es sencilla, y actualmente estamos invirtiendo en mejorar nuestros desarrollos de testeo unitario, para después cambiar el chip-o más bien invertir- del orden de desarrollo. Pasito a paso, pero seguros.