¿Qué son las escuelas TDD de Londres y Chicago?

77

He estado escuchando sobre el estilo de Londres vs. el estilo de Chicago (a veces llamado estilo de Detroit) de Test Driven Development (TDD).

Grupo de usuarios de programación extrema de Utah:

  

Interaction-style TDD también se conoce como mockist-style , o London-style después del club de los Extreme Tuesday de Londres donde se hizo popular. Por lo general, se contrasta con el estilo Detroit o clásico   TDD, que es más basado en el estado.

Taller de Jason Gorman :

  

El taller cubre tanto la escuela de Chicago de TDD (basada en el estado   pruebas de comportamiento y triangulación), y la escuela de Londres , que   se enfoca más en pruebas de interacción, burla y TDD de extremo a extremo, con   énfasis particular en Responsibility-Driven Design y en Tell,   El enfoque de Don't Ask para OO recientemente popularizado por Steve Freeman's   y el excelente creciente software orientado a objetos de Nat Pryce guiado por   Pruebas libro.

¿La publicación TDD clásica o "London School"? por Jason Gorman fue útil, pero sus ejemplos me confundieron, porque usa dos ejemplos diferentes en lugar de un ejemplo con ambos enfoques. ¿Cuáles son las diferencias? ¿Cuándo usas cada estilo?

    
pregunta Arturo Herrero 06.12.2011 - 21:42

2 respuestas

68

Suponga que tiene una clase llamada "libro mayor", un método llamado "calcular" que usa una "Calculadora" para realizar diferentes tipos de cálculos según los argumentos pasados a "calcular", por ejemplo "multiplicar (x, y)" o "restar (x, y)".

Ahora, suponga que desea probar lo que sucede cuando llama a ledger.calculate ("5 * 7").

La escuela London / Interaction le haría afirmar si se llamó a Calculator.multiply (5,7). Los diversos marcos de simulacros son útiles para esto, y puede ser muy útil si, por ejemplo, no posee el objeto "Calculadora" (suponga que es un componente o servicio externo que no puede probar directamente, pero sí lo hace. sabe que tiene que llamar de una manera particular).

La escuela de Chicago / State le haría afirmar si el resultado es 35. Los marcos jUnit / nUnit están generalmente orientados a hacer esto.

Ambos son pruebas válidas e importantes.

    
respondido por el Matthew Flynn 06.12.2011 - 23:33
27

El artículo Mocks no son talones , de Martin Fowler es una buena introducción al tema.

Según el estilo de diseño que elija (y los principios de diseño sobre los cuales construye sus programas), hay al menos dos formas de ver un objeto:

  1. Como una unidad que realiza cálculos basados en entradas. Como resultado de este cálculo, el objeto puede devolver un valor o cambiar su estado.
  2. Como un elemento activo que se comunica con otros elementos en el sistema mediante el paso de mensajes.

En el primer caso, está interesado en lo que sale del procesamiento o en qué estado queda el objeto después de ese procesamiento. Aquí es donde los métodos como assertEquals() entran en la imagen. En este caso, no importa mucho qué otros objetos estuvieran involucrados en el procesamiento, qué métodos se llamaron, etc. Este tipo de verificación se denomina verificación basada en estado y es el estilo "clásico".

En el segundo caso, como la mayoría de los objetos ni siquiera devuelven ningún resultado (por ejemplo, los métodos void en Java), le interesa más cómo se comunican los objetos entre sí y si pasan los mensajes correctos en las circunstancias impuestas por la prueba Estas interacciones generalmente se verifican con la ayuda de marcos simulados. Este tipo de verificación se llama verificación basada en el comportamiento o en la interacción. Una de sus implicaciones es la técnica llamada Behavior Driven Development, mediante la cual desarrollas una clase asumiendo que sus colaboradores ya existen (incluso aunque todavía no existan), por lo que puedes codificar contra sus interfaces.

Tenga en cuenta que esta no es una opción ni / ni otra. Puede tener un estilo de diseño que combine ambos enfoques para obtener lo mejor de cada uno.

    
respondido por el Otavio Macedo 06.12.2011 - 23:27

Lea otras preguntas en las etiquetas