Tengo un proyecto que estoy construyendo que tengo que cambiar un método para comportarme ligeramente diferente. Tengo varias pruebas unitarias ya construidas contra ese método, pero tendré que agregar más para cubrir el nuevo comportamiento que voy a agregar. ¿Es una buena forma cambiar/agregar esas pruebas primero antes de cambiar el código, o cambias tu código, arreglas las pruebas rotas y añades las nuevas pruebas para cubrir el nuevo comportamiento?Si cambia el código que tiene una prueba de unidad en contra, ¿cuál cambia primero?
Respuesta
Es mejor actualizar las pruebas primero y dejarlas que fallen y luego volver atrás y actualizar el código hasta que pase la prueba. A.K.A Desarrollo impulsado por prueba o Primer desarrollo de prueba.
Si sigue las prácticas de TDD, primero debe actualizar sus pruebas. Tendrás casos de prueba rotos que deberían ser corregidos cuando arregles tu código.
Lo que hago es codificar primero y luego crear pruebas después. Dado que podría tener un caso en el que programe su prueba para que funcione de alguna manera y luego, cuando lo haga, se dará cuenta de que no puede hacer eso. Por lo tanto, deberá cambiar las pruebas nuevamente.
En mi experiencia, esto conduce a que las pruebas estén sesgadas hacia el código escrito, en lugar de los requisitos. Escribir las pruebas primero es la mejor manera de obtener las pruebas adecuadas, y las pruebas adecuadas son muy útiles para obtener el código correcto. –
Pueden ser sí. Así que es algo que busco. Lo que pruebo son todas las rutas de código. –
Escribir pruebas después del código conlleva la suposición implícita de que el código es correcto. Si esta es su suposición, escribir la prueba es una pérdida de tiempo. En casos triviales, esto incluso puede ser una suposición segura, pero a) Supongo que se trata de una gran cantidad de casos no triviales en su trabajo diario, yb) si el código es tan trivial, escribir pruebas para ello es probablemente no un uso sabio de tu tiempo Primero, las pruebas de escritura * definen * el comportamiento correcto, en lugar de un sello de goma "PASS" después del hecho. – bradheintz
Si está realizando la primera prueba de desarrollo, como mínimo debe escribir una nueva prueba que justifique el cambio. El cambio podría romper las viejas pruebas y podría corregirlas después de que las vea fallar, si el cambio es accesorio a la prueba. Sin embargo, si usted sabe que la prueba se utilizó para probar el comportamiento antiguo y solo tiene que cambiar para el nuevo comportamiento, no hay razón para no solo cambiar esa prueba en lugar de escribir una nueva.
No vale la pena el esfuerzo (en mi opinión) para averiguar qué pruebas van a romper con el cambio y cambiarlas todas primero porque el corredor de prueba le dirá eso después de realizar el cambio.
EDITAR (en respuesta al comentario): Prefiero escribir la prueba primero, pero ese es el estilo TDD. En ese caso, el diseño de las unidades de prueba. También hay un ritmo y un patrón para ese tipo de desarrollo (rojo-verde-refactor). A la inversa, es más la forma de prueba de la unidad pura, ya has diseñado e implementado lo que deseas, ahora lo estás probando. No hay nada de malo en eso, es un enfoque de desarrollo diferente y la elección no depende de la existencia de otras pruebas. En realidad, es un enfoque de desarrollo en general.
En mi caso particular, las pruebas antiguas deberían seguir funcionando tal como están escritas. Simplemente estoy agregando un conjunto adicional de funciones a un método particular que no se desencadena por ninguna prueba existente, por lo que tengo que escribir nuevas pruebas para cubrir eso. ¿Escribirías esas pruebas primero, o harías el cambio y luego codificaras las nuevas pruebas? Estoy dando por hecho que todas las viejas pruebas deberían funcionar. – Jason
La buena noticia es que no tiene que darlo por hecho; puede ejecutar las pruebas. Como el proceso TDD me resulta útil en mi propio trabajo, sugiero que primero escriba las pruebas: defina de forma cuantitativa qué quiere que haga el código antes de implementarlo. Ver mi respuesta para más detalles. – bradheintz
Personalmente prefiero escribir la funcionalidad primero y luego hacer las pruebas unitarias (si corresponde a la funcionalidad específica). Si es algo que realmente no vale la pena probarlo, generalmente me lo salteo. He descubierto que, por lo general, es una pérdida de tiempo agregar una prueba unitaria al código all
que usted escribe. Ciertamente hay un lugar donde es muy útil tenerlo, pero eso difícilmente se extiende a todo tu código.
Es fácil detectar la productividad desperdiciada cuando se refactura algo, y darse cuenta de que se han roto la mitad de las pruebas unitarias que realmente no agregan ningún valor para empezar; ya que una falla se habría detectado fácilmente en primer lugar. Entonces todo ese esfuerzo es una pérdida de tiempo. Si trabaja en un entorno en el que no hay incentivos para entregar rápido y adaptarse rápidamente, entonces creo que es factible tener toneladas de pruebas unitarias. De lo contrario, simplemente aumentó sus costos de una manera completa sin agregar mucho más valor a sus usuarios.
Si rompe la mitad de sus pruebas, no está refactorizando; estás haciendo cambios funcionales. Refactorizar no cambia el comportamiento observable del software. – bradheintz
Admitiré que a veces hago trampa. Si un cambio es tan simple que puedo conocer el resultado con certeza, algunas veces cambiaré el código y luego realizaré las pruebas. Como si estuviera multiplicando un número por una constante, y todo lo que estoy haciendo es cambiar la constante, continuaré con el cambio y actualizaré el caso de prueba más adelante.
Sin embargo, si estás haciendo algo un poco más complejo, te aconsejo que sigas la ortodoxia TDD y primero cambies la prueba. Define lo que quieres hacer antes de hacerlo.Además, recomendaría poner nuevas pruebas después de las pruebas preexistentes, de modo que las pruebas relacionadas con la funcionalidad existente que desea preservar se ejecuten primero, asegurándole que no ha roto nada (o alertándolo lo antes posible que tienes).
+1 por honestidad y pragmatismo. –
- 1. Código EF Primero: Recrear la base de datos si el modelo cambia
- 2. Código primero contra base de datos Primero
- 3. Prueba de unidad en el programa que tiene muchas macros
- 4. Si se cambia el contenido en CKEditor
- 5. Tiene una unidad/prueba de integración sin afirmar que exista?
- 6. Problema que cambia innodb_log_file_size
- 7. unidad que prueba una unidad de trabajo
- 8. ¿Cómo se cambia el controlador predeterminado de prueba para una prueba de pepino en Capibara?
- 9. dotnet dll descompila y cambia el código
- 10. Prueba de unidad código matemático
- 11. Javascript para detectar si el usuario cambia la pestaña
- 12. ¿Prueba si una clase tiene un atributo?
- 13. ¿Por qué display_errors cambia el código de estado HTTP?
- 14. C# UserControl Propiedad visible que no cambia
- 15. Prueba de unidad C#, cómo realizar una prueba mayor que
- 16. ¿Cómo se prueba/cambia el código no probado y no comprobable?
- 17. Código de prueba de unidad que obtiene la hora actual
- 18. Prueba de unidad de dependencia de código
- 19. Cómo le digo a Git que tiene movimientos/cambia el nombre incorrectos (falsos positivos)
- 20. jquery texto cambia cuando la entrada cambia
- 21. rcov cobertura cambia drásticamente con -xrefs
- 22. . Prueba de unidad .NET - Mejores prácticas para ocultar costuras de prueba en el código de versión
- 23. ¿Cambia dinámicamente el contenido de una vista en NSSplitView?
- 24. Android UID de seguridad que cambia UID
- 25. Unidad de prueba de código privado
- 26. ¿CTCarrier mobileNetworkCode cambia en roaming?
- 27. Ejemplos de prueba de unidad?
- 28. Oracle SYS_GUID no cambia
- 29. Unidad de prueba Código que llama a VirtualPathUtility.ToAbsolute
- 30. Cambia el código de estado que Nginx devuelve cuando el unicornio está ocupado
s/hopefully/definitely/ –
La palabra fue elegida con la intención :) –