Cuando haya ideado un diseño/idea general de cómo debería funcionar una parte de un sistema, ¿cómo decide por dónde empezar cuando realiza TDD o, mejor dicho, cómo decide comenzar su primera prueba?¿Con qué prueba unitaria comenzarías?
Respuesta
Supongamos que estoy codificando una clase llamada Oven
para hornear mis deliciosos objetos Pie
. Así es como me paso a través de la orden de prueba de unidad:
- ¿Qué tengo que hacer para una instancia del objeto? En este caso, probablemente sería
Oven oven = new Oven();
No hay prueba para esta, supongo. - ¿Cómo preparo el objeto para su uso?
oven.turnOn(int degrees)
suena bien, lo haré. ¿Cómo lo verifico? Mejor hazoven.getTemperature()
. Hay una prueba obvia. - bien, horno ya está lo suficientemente caliente y quiero hornear mi
Pie
. Para eso necesitooven.bake(Pie p)
así que lo haré. Pero ahora que? Quiero comprobar si el pastel está listo, pero en lugar de teneroven.isPieReady()
creo queoven.pastryStatus()
que devuelve cosas como "nada en el horno", "crudo", "casi hecho", "cocinado" y "carbonizado" suena bien y en general debería ser más extensible queoven.isPieReady()
así que lo haré.
Y así sucesivamente y así sucesivamente. Por lo tanto, haré mis pruebas en orden. Espero usar el objeto refinando la especificación a medida que avanzo. Al final, suelo terminar con una API bastante simple pero potente que hace lo que quiero. Después de probar mi API por unidad, corro la cobertura de mi código para ver lo que perdí y luego agregué pruebas adicionales para eso.
Me gustaría construir un conjunto de unidades para la funcionalidad/nivel más bajo más independiente. Una vez que tenga esas clases pasando cada prueba, puede continuar, asumiendo que funcionarán cuando lo solicite una funcionalidad más dependiente.
estas son las pautas genéricas que encuentro útil para dar prioridad a la unidad de pruebas:
1) Identificar los objetos de contorno (Win/WebForms, CustomControls etc).
2) Identificar los objetos de control (objetos de la capa de negocios)
3) Escribir los tests unitarios para el control de objetos métodos públicos invocadas por objetos de contorno. De esta forma, estarás seguro de que estás cubriendo los principales aspectos funcionales de tu aplicación.
Puede utilizar estas reglas para establecer la prioridad de las pruebas unitarias - a continuación, si es necesario micro-ensayo de otras cosas que usted puede hacerlo también en función de sus necesidades.
Cuando nos enfrentamos a una lista de pruebas para poner en práctica, tendrá categorías
- Trivial para poner a prueba, pero está seguro de que puede hacer esto.
- no trivial pero que está razonablemente seguro de conseguir que se haga.
- no trivial pero difícil ni idea de conseguir que se haga.
En este caso, elija uno del cubo Categoría2 porque proporcionará un conocimiento/aprendizaje máximo por unidad de tiempo invertido.Además, te hará progresar y aumentará tu confianza para acceder a las pruebas más difíciles de Category3.
Creo que obtuve esto de TDD By Example - Kent Beck. Eche un vistazo en caso de que tenga tiempo ... Recomendado.
interesante. En mi propia experiencia, encontré las pruebas triviales bastante efectivas en la aparición de muchos errores por un mínimo esfuerzo, pero buena comida para pensar. +1 – peterchen
No estoy diciendo 'ignorar las pruebas triviales' ... se necesitan las 3 categorías. :) Solo el orden de tomarlos. Categoría 2 ayuda a despejar la 'niebla de guerra' (para usar un término de juego) en mayor medida, mientras que al mismo tiempo no lo que le permite atascado o pegado con el bloque de TDD Coder. – Gishu
He estado enseñando una clase interna en TDD desde hace un tiempo, y muchos de los participantes comienzan probando todos los casos de error. Por muy relevantes que sean, esa no es la mejor manera de comenzar con imo.
Comience por configurar las pruebas, que son fáciles de implementar y aún le indican si se está moviendo en la dirección correcta con respecto a las funciones que está tratando de implementar. Entonces, si está creando una pila, asegúrese de verificar push y pop antes de probar los casos de error.
Recuerde que el objetivo de la prueba no es solo verificar el comportamiento sino también permitirle usar la interfaz del tipo bajo prueba. Si se siente mal escribir las pruebas, probablemente necesite cambiar la interfaz.
Una buena idea es hacer cada caso de prueba hacia atrás. Así que comience escribiendo la declaración de Assert. Este es el objetivo de la verificación para esta prueba. A continuación, agregue los pasos necesarios para llegar al punto en el que puede hacer lo que hace el Assert.
- 1. Prueba unitaria básica vs. Prueba unitaria
- 2. Prueba unitaria en CSLA? ¿Cómo? ¿Qué?
- 3. Prueba unitaria sin aserciones
- 4. ¿Qué significa para usted la prueba unitaria?
- 5. ¿Por qué falla la prueba unitaria con Spring 3.1 WebMvcConfig?
- 6. Prueba unitaria razor views
- 7. Prueba unitaria Método WCF
- 8. Problema de prueba unitaria con assertRaises
- 9. .NET 2.0 code - Prueba unitaria con MoQ
- 10. ¿Comenzarías a aprender Smalltalk?
- 11. Coffeescript + Prueba unitaria: variables globales?
- 12. Prueba unitaria MVC 4 RedirectToAction
- 13. no prueba unitaria utilizando Spring
- 14. resultados alternativos en prueba unitaria
- 15. ¿Cómo escribir una prueba unitaria?
- 16. Prueba unitaria para controladores anidados
- 17. introducción a la prueba unitaria en javascript
- 18. Manejo de TDD/fatiga de prueba unitaria
- 19. Java: manipulación de imágenes de prueba unitaria
- 20. prueba unitaria de Django en views.py
- 21. ¿Un ejemplo de prueba unitaria en C#?
- 22. Prueba de integración y prueba unitaria (WEB API mvc 4)
- 23. HttpClient con asp.net WebApi en escenario de prueba unitaria
- 24. archivos de compilación de prueba unitaria
- 25. Cómo hacer una prueba unitaria en pyCharm
- 26. Cómo inyectar PersistenceContext durante la prueba unitaria?
- 27. ASP.NET MVC - Prueba unitaria RenderPartialViewToString() con Moq framework?
- 28. ¿Es excesivo ejecutar la prueba unitaria con Valgrind?
- 29. Descubrimiento de la prueba unitaria Python con subcarpetas
- 30. ¿Cómo se puede depurar la prueba unitaria con MonoDevelop?
1 bien hecho, señor – annakata
¿Qué ocurre si se pone Cat C en el horno? ¿Qué hay de poner un pastel "carbonizado" o un pastel que no está listo para el horno? El límite y las pruebas de entrada no válidas son importantes. – Tester101
Esas son las pruebas individuales que refinan las especificaciones, por ejemplo testCantBakeACat() :) Pero sí, límite y no válidas las pruebas de entrada son una de las más importantes que hay y no se debe perder. – Esko