2008-11-23 6 views
6

Tengo un proyecto en el que he estado utilizando TDD y pruebas unitarias como "prensas de software". En esencia, traduzco los requisitos en pruebas que verifican que el código cumpla con los requisitos. Rara vez tengo que volver atrás y editar las pruebas unitarias, que más bien es el punto: solo se debe modificar el código "real". Por el momento, hay 900 pruebas unitarias.¿Cómo adaptó sus pruebas unitarias para hacer frente a los requisitos cambiantes?

Ahora algunos de los requisitos han sido modificados por los propietarios de oro. Dado que los requisitos anteriores están tan codificados en las pruebas unitarias existentes, parece que cambiarlos para cumplir con los nuevos requisitos sería invitar al desastre. ¿Cómo se adaptan las suites de pruebas unitarias para manejar este tipo de cambio?

Respuesta

2

Dado que los requisitos anteriores son tan thorougly codificado en los pruebas unitarias existentes, parece que cambiándolos a se ajustan a las nuevas exigencias que ser una invitación al desastre.

¿Alguna razón específica por la que usted podría pensar así? Siento un poco de miedo o es solo 'no lo rompa cuando está funcionando'

Sucede el cambio. En ese caso, significa más tiempo de trabajo-dinero. Si la empresa no tiene problemas, tampoco debería (a menos que el cronograma sea inhumano :). Si la especificación ha cambiado,

  • asegúrese de que la versión de trabajo se ha registrado.
  • Repita el paso 1 sólo para estar seguro.
  • escanee su banco de pruebas. Encuentra los que necesitas sacar. Encuentra los que necesitan cambiar Encuentre nuevas pruebas que necesita comprender. Use una hoja de papel en blanco para tomar notas
  • Ahora proceda con una prueba a la vez. A menos que no haya estado siguiendo el principio DRY/Once y solamente una vez, cualquier cambio que deba realizar debe realizarse en un solo lugar. Si no es así, usted debe haber reprogramado antes .. pero no es demasiado tarde .. extracto de código en un solo lugar antes de hacer el cambio
  • Repita el paso anterior hasta el hecho
5

Por definición, el unit-tests no replica los requisitos para la aplicación. Describen los requisitos para un módulo. Esa es una diferencia, el módulo puede reutilizarse incluso en una aplicación con diferentes requisitos o no se utiliza en absoluto. Por lo tanto, los requisitos cambiantes no afectan a las pruebas unitarias reales (excepto que debe escribir nuevas para los módulos nuevos o abandonar las pruebas antiguas para módulos que ya no son necesarios para los requisitos modificados).

Por otro lado: acceptance-tests se ocupan de los requisitos en el nivel de la aplicación. Entonces, creo que hablas de pruebas de aceptación.

Agregaría los nuevos requisitos como nueva prueba de aceptación. Pero para los viejos hay que mirar a través de ellos, cómo se ven invalidados por los requisitos modificados.

+0

un cambio de prueba de aceptación 'puede' provocar una avalancha de cambios en la prueba unitaria detrás de su implementación. Creo que eso es a lo que apunta el OP. – Gishu

+0

Los requisitos que cambian normalmente le permiten usar sus módulos de manera diferente y agregar nuevas funcionalidades o módulos nuevos. – Mnementh

4

Agregaría las nuevas pruebas y las haría pasar. Luego, mira qué pruebas se han roto como resultado. Si cree que las pruebas antiguas están en contradicción con las nuevas pruebas, es posible que deba eliminar las pruebas anteriores. De lo contrario, modifique el código para que también pasen las pruebas antiguas.

2

En esencia traduzco los requisitos en las pruebas que verifican que el código se ajusta a los requisitos

Aunque estoy de acuerdo con la respuesta de Mnementh, esto, para mí, es el comentario llave. Si las pruebas son una versión traducida de los requisitos, entonces si los requisitos han cambiado, las pruebas deben cambiar.

O están probando algo que no cumple con los requisitos del cliente.

Como se informó que John Maynard Keynes dijo: "Cuando los hechos cambian, cambio mi opinión. ¿Qué hace, señor?"

Creo que hay una situación análoga aquí. Sus hechos han sido cambiados para usted

0

Tengo dos respuestas a su pregunta, una filosófica y la otra táctica.

En el aspecto filosófico, es importante tener en cuenta las pruebas unitarias como código. Eso significa que todos los rasgos normales del buen código son generalmente apropiados para buenas pruebas: revelación intencional, eliminación de duplicaciones, etc. Muchas, tal vez la mayoría, de las fallas que he visto con las pruebas unitarias han llegado porque las personas no han tratado sus pruebas de esta manera, pero en lugar de simplemente codificarlos y nunca volver a visitarlos para ver si deberían ser refactorizados.

En mi experiencia, si ha llegado al punto en que las pruebas de su unidad son un obstáculo para cambiarlo es porque tiene una deuda técnica en sus pruebas.

Así que mi sugerencia táctica es que antes de intentar cambiar sus requisitos, busca refactorizar sus pruebas. Cada prueba debe tener una única razón para aprobar/reprobar, y el comportamiento fuera de eso debe ser en código compartido. Esto significa que para cualquier cambio de comportamiento dada tendrá dos lugares para cambiar las pruebas:

  1. La prueba de que realmente valida que el comportamiento
  2. Los lugares que el comportamiento se utiliza en código compartido accesorio

Puede encontrar este artículo útil: Grow Your Harness Naturally. Realmente se trataba de un arnés de prueba reutilizable para las pruebas funcionales, pero las ideas me resultan muy útiles también en las pruebas unitarias.

1

Si las pruebas unitarias ya no coinciden requisitos, entonces no deberían estar allí; después de todo, ¡todo lo que ahora le dicen es que su código cumple con los requisitos que ya no existen!

Siempre que tenga un cambio en los requisitos que debe alterar las pruebas que representan los requisitos modificados y verificar que la prueba ahora fallan (wheras previamente todos pasaron, a la derecha;?))

Entonces alterar su código fuente para que las pruebas reescritas ahora pasan.

Cuestiones relacionadas