2010-06-13 31 views
11

Soy nuevo en el enfoque de TDD, así que me pregunto si alguien experimentado esto podría iluminarme un poco. Me gustaría obtener algunas pistas sobre cómo usar la metodología UML y TDD juntas.TDD y UML juntos

He estado acostumbrado a: Diseñar con UML -> Generar clases de esqueleto (y luego mantenerlo sincronizado) -> Implementar y finalmente Probar. Debo admitir que la parte de prueba fue la peor, así que comencé a buscar algo más: TDD. Así que tengo un conocimiento general de qué se trata, pero antes de continuar, me interesa saber cómo va junto con el diseño de software, especialmente UML.

Entonces, cuando diseño/creo prueba por primera vez, ¿cómo puede UML encajar? ¿Sería posible diseñar clases primero, a partir de ellas crear clases esquemáticas, a partir de ellas generar pruebas Unitarias que serían "completadas" antes de la implementación real de las clases pregeneradas de UML, este enfoque rompería todo TDD? ¿O hay alguna otra forma que mantenga UML y TDD juntos?

Respuesta

6

Así que cuando diseño/creo prueba por primera vez, ¿cómo puede UML encajar?¿Sería posible diseñar clases en primer lugar, a partir a crear clases esqueleto, desde a generar pruebas unitarias que ser "llenos" antes real implementación de UML pregenerated clases, haría este enfoque ruptura TDD conjunto? ¿O hay alguna otra forma de que mantenga UML y TDD juntos?

Si crea una clase de esqueleto completa, suponiendo que quiere decir una clase con todos los métodos definidos pero vacíos, antes de escribir su primera prueba, diría que no está haciendo TDD, y perderá los beneficios de TDD. Como hacemos TDD - Test-Driven Diseño - nuestras pruebas de forma gradual nos llevan a los siguientes elementos - métodos y clases - que nuestro programa necesita. Si ha predeterminado, preespecificado en UML, cuáles son sus clases y métodos, una gran parte de su diseño ya está hecho, y o bien su desarrollo posterior está obligado a seguirlo, o bien habrá desperdiciado esfuerzos que el trabajo posterior anulará.

Puede haber maneras de usar tanto UML como TDD para el diseño, pero tal como lo ha descrito, está diseñando dentro de UML, antes de que TDD tenga alguna posibilidad. Eso no le dará todos los beneficios de TDD.

2

UML es la parte del diseño, por supuesto.

Solo lo usaría en el sistema con el que terminaba. Prestar clases de prueba en UML me parece ridículo.

Lo usaría para tener una idea general de lo que estaba creando. Luego comenzaría con TDD para implementarlo.

En cuanto a mantenerlo sincronizado, obtendría una herramienta UML que era capaz de importar y exportar. Me preocuparía más sobre el código y menos sobre UML. Es útil para capturar tus pensamientos y documentar más tarde, pero no mucho más. Siempre preferiría trabajar, probar código sobre diagramas cualquier día.

5

Si está diseñando clases usando UML, está diseñando lo que piensa se verá el código. Pero lo que crear usando TDD es la realidad.

Deje UML hasta el final para documentar los resultados del código creado con TDD.

+2

@Downvoter: no importa a menos que diga _por qué_ votó negativamente. –

+0

Las pruebas unitarias primero requieren que el desarrollador sepa qué necesita hacer la unidad. Parece útil entonces tal vez solidificar lo que piensas que debería ser el código para que al menos tengas una idea de cuáles podrían ser las responsabilidades de cada clase. Si terminan siendo algo completamente diferente al final, eso también está bien. Mientras no se piense que es inamovible, UML parece una buena manera de poner en marcha la pelota si no puede encontrar un lugar para comenzar. –

6

Mientras que algunas personas piensan que UML es una metodología de diseño, es ante todo una herramienta de comunicación. De ahí el nombre, lenguaje de modelado unificado. La idea es tener un vocabulario común (de formas) que puedas insertar en un libro y todos entenderán.

TDD por otro lado es una metodología de diseño, la forma de construir el sistema a partir de su interfaz y su consumidor, y solo luego agregar la implementación.

Una vez que su diseño ha surgido como resultado de la aplicación de TDD, puede comunicar ese diseño utilizando UML. Si no necesita comunicarse (como si fuera el único desarrollador), posiblemente no necesite UML.

Algunas personas piensan en el análisis de dominio (identificando sustantivos, verbos y adjetivos clave y construyendo un modelo ontológico básico) como parte de la metodología UML, reflejado en el caso de uso & ER diagramas ... Esto puede ser útil para hacer antes de saltar al ciclo rojo/verde/refactor de TDD. Por otra parte, estrictamente hablando, esto es DDD (Diseño Dirigido por Dominio), no UML per se.

+0

Puede ser más costoso escribir una interfaz, luego algunas pruebas, finalmente comenzar a implementar el código para ver que omitió algo fundamental, luego debe cambiar su interfaz y las pruebas. Creo que podrías beneficiarte mucho al escribir algunos UML y crear las interfaces desde allí. –

12

El ciclo TDD es prueba, código, refactor, (repetir) y luego enviar. Como su nombre implica TDD, el proceso de desarrollo es impulsado mediante pruebas, específicamente que significa writing tests first antes de desarrollar o escribir código.


El primer párrafo es de carácter puramente definitorio ... desde cómo Kent Beck defines TDD ... o cómo Wikipedians generally understand TDD ... pensé que era necesario agotar el tema con esta definición, porque no estoy seguro de si todo el mundo está realmente discutir el mismo TDD o si otros realmente entienden las implicaciones de la [parte más importante o la] definición de TDD, las implicaciones de las pruebas de escritura primero. En otras palabras, creo que el enfoque de las respuestas a esta pregunta debería profundizar un poco más en TDD, en lugar de explicar un sesgo a favor/en contra de UML. La parte larga de mi respuesta se refiere a mi opinión sobre el uso de UML para admitir TDD ... UML es solo un lenguaje de modelado, ciertamente no requerido para hacer TDD; podría interferir si se aplica de forma inapropiada ... pero UML puede ayudar a comprender los requisitos para escribir pruebas, cómo el modelado puede ayudar a refactorizar si es necesario y cómo la recopilación de los artefactos del proceso acelera la documentación del código enviado. Me gustaría recibir cualquier comentario, crítica o sugerencia, pero no vote mi respuesta porque usted está de acuerdo o no con el primer párrafo ... el acrónimo de TDD es Desarrollo basado en pruebas, lo que significa desarrollo basado en pruebas. .


Escribiendo una prueba primero implica que el desarrollador entiende las especificaciones y requisitos PRIMERA ... obviamente, cualquier prueba que se escribe debe fallar hasta que el código se escribe, pero en TDD, la prueba de debe escribirse first - no puede hacer TDD sin estar enfocado en comprender una especificación de requisitos antes de escribir pruebas, antes de escribir el código. Hay situaciones donde los requisitos no existen en absoluto; la obtención de requisitos implica un poco de hackear una versión pre-pre-alfa para "tirar el barro a la pared para ver qué se pega" ... ese tipo de cosas no se deben confundir con el desarrollo, ciertamente no con el desarrollo basado en pruebas, básicamente es solo una forma de requisitos: la obtención de un dominio de aplicación poco conocido.

Los diagramas UML son una forma de requisitos de entrada para TDD. No es el único, pero probablemente sea mejor que las especificaciones escritas si hay personas con conocimiento en la creación de diagramas UML. A menudo es mejor trabajar con diagramas visuales para una mejor comunicación al explorar el dominio del problema [con usuarios/clientes/otros proveedores de sistemas] durante las sesiones de modelado de requisitos previos a la implementación ... donde simular el rendimiento es necesario para comprender realmente los requisitos (p. Ej.); a menudo es ideal si podemos trabajar con un lenguaje de especificación o herramienta CASE como Rhapsody o Simulink RT Workshop que puede ser ejecutable, modular y completo ... UML no es necesariamente parte de TDD, pero es parte de una síntesis de diseño de enfoque que implica gastar más esfuerzo entendiendo lo que se requiere primero antes de escribir cualquier código [y luego perder el tiempo intentando comercializar ese código a alguien que se preocupa]; en general, un mayor enfoque en la comprensión de los requisitos del sistema sienta las bases para unas iteraciones TDD ágiles, más eficientes y productivas.

La refabricación se trata de mejorar el diseño, limpiar el código de trabajo probado, para que sea más simple, más fácil de mantener. Desea ajustarlo tanto como sea posible para eliminar los enredos confusos en los que los errores podrían estar ocultos o podrían aparecer en versiones futuras; no se refactoriza porque un cliente lo necesita; Usted refactoriza porque es más barato enviar un código limpio en lugar de seguir pagando el costo de soportar/mantener el complejo desastre. Generalmente, la mayor parte de TDD está más enfocada en el código; pero, podrías emplear UML para mirar un alcance mayor o dar un paso atrás para ver el problema, p. creando un diagrama de Clase para ayudar a identificar pruebas [faltantes] o posibles refactorizaciones. Esto no es algo que tendría que ordenar o querer hacer de forma general, pero cuando sea apropiado.

El último paso, 'enviar' es un paso serio ... 'barco' no es una abreviatura para "tirarlo por la pared y olvidarlo, porque un buen código no necesita ayuda" o "abandonar y esperar que no hay más iteraciones ". Desde una perspectiva financiera o comercial, el envío es el paso más importante de TDD, porque es donde le pagan. El envío implica un "cambio de marchas" porque incluye integración de sistemas, preparación para soporte y mantenimiento, preparación para la próxima ronda de desarrollo, etc. El uso principal de los diagramas UML será comunicar [en términos abstractos] cómo funciona el código lo que hace ... UML es útil porque, con suerte, los diagramas son un artefacto de los requisitos y procesos de desarrollo; no es necesario comenzar desde cero cuando el código se envía ... como herramienta de comunicación, UML sería apropiado para reducir los errores de integración sistemas de múltiples módulos, proyectos más grandes que podrían involucrar módulos escritos en diferentes idiomas, redes de sistemas integrados donde diferentes compañías debe colaborar en sistemas críticos para la seguridad, pero necesita que la abstracción sea tacaña o protectora de su "conocimiento propietario".

Igual que debe evitar el uso de un martillo grande en situaciones en las que un destornillador pequeño es apropiado O no va a llegar a ninguna parte pidiendo a todos los desarrolladores que estandaricen el uso de Emacs como editor. A veces la vista no vale la pena ascender: no querrás siempre arrastrar la pancarta de UML o ser conocido como el tipo que siempre estaba presionando a UML ... particularmente no en situaciones donde no hay sustituto para escribir pruebas o leer código. Si se atiene a las situaciones apropiadas, no debe temer utilizar UML como lenguaje de comunicación en todas las situaciones en las que el idioma lo ayude.

5

¿O hay alguna otra forma que mantenga UML y TDD juntos?

UML y TDD adaptarse maravillosamente juntos:

  1. hacer el diseño inicial en UML - no tiene por qué ser,
  2. crear las pruebas independientes vacías completa, simplemente consistente. Este paso también podría automatizarse
  3. Todas las pruebas se producirá un error en un primer momento, como es requerido por TDD (debido a que el código generado a partir de UML no tiene ningún código)
  4. empezar a escribir ensayos para cada clase
    1. de inicio con las clases de los cuales no tiene una gran cantidad de asociaciones si confía en su arquitectura de software y habilidades UML (no, no está haciendo cascada, pero a veces simplemente sabe lo que está haciendo, ya conoce el dominio de la aplicación o ha utilizado conocimiento experto en el paso 1)
    2. Comience con las clases que tienen muchas asociaciones ("clases centrales") si NO confía en su comprensión del dominio de la aplicación - esto hará que sea más fácil de eliminar lo antes posible las decisiones de diseño malas, porque se dará cuenta de ellos tan pronto como sea posible
  5. ... Las pruebas siguen sin
  6. En paralelo a cada unidad que se está probando (paso 4), escriba la implementación dentro de los cuerpos de métodos vacíos. NO modifique ninguna clase, interfaz o nombre de método o firma de parámetro. Sólo se le permite añadir ayudante métodos privados, no más
  7. Si en el paso 6 (que se ejecuta en conjunto con el paso 4) se da cuenta de que necesita para hacer cambios en el diseño:
    1. Ir al paso 1 y refine el UML, luego genere el código nuevamente (las buenas herramientas UML no sobrescribirán su implementación). Atención: evitar la introducción de nuevas clases. Desee finalizar el paso 13 dentro de unas pocas semanas
    2. volver a ejecutar las pruebas y arreglar los ya falta de lo cual fueron previamente OK
    3. Continuar con lo que dejaron en el paso 6
  8. vaya al paso 6 si no se todas las pruebas de clase pasan
  9. Proceder a pruebas de componentes, paquetes y subsistemas
  10. Añadir despliegue en UML e implementarla en el entorno de integración (http://en.wikipedia.org/wiki/Development_environment_%28software_development_process%29)
  11. Proceder a las pruebas de integración
  12. pasar por la etapa de prueba/control de calidad
  13. pasar por el usuario Pruebas de Aceptación
  14. Reiterar los pasos anteriores según sea necesario (de acuerdo a su proceso de desarrollo iterativo)
  15. ... Pasan los meses
  16. distribuir la versión 1.0. 0 a la producción

No intente llegar a muchas decisiones de diseño en el paso 1 o después de las reiteraciones del paso 1 (refinando el diseño). Desea finalizar el paso 13 en la primera iteración después de algunas semanas.