Escritura de pruebas unitarias en el medio

14

¿La unidad está probando un trato del 100% o no?

Estaba navegando por mis antiguos proyectos y comencé a agregar funciones, esta vez con pruebas unitarias. Sin embargo, ¿en última instancia, esto no tiene valor si voy a reutilizar componentes anteriores que no tienen pruebas unitarias?

¿Necesito escribir pruebas unitarias para todas las clases anteriores y no molestarme en absoluto, o está bien escribir solo pruebas unitarias para las cosas nuevas que estoy agregando?

Lionel
fuente

Respuestas:

14

Cualquier prueba unitaria es mejor que ninguna. Entonces no es un trato de todo o nada.

En su caso, dado que Test Driven Development no ha sido la norma, se preguntará cómo son útiles las pruebas.

Desea asegurarse de que cualquier código futuro que escriba no rompa ninguna funcionalidad (actual) , y ahí es donde sus casos secundarios son útiles. Si pasan las pruebas bien escritas, lo más probable es que no haya dañado nada. El próximo desarrollador que venga le agradecerá las pruebas y la documentación.

Con lo que puede comenzar es si tiene una arquitectura en capas bien dividida, recoge los niveles de acceso a datos y trabaja hacia arriba (hacia el nivel de interfaz de usuario) con las pruebas. Si el proyecto tiene un modelo de dominio, es el candidato más probable para TDD, ya que es probable que tenga la mayor parte de la lógica. Si el nivel de servicio (o lógica de negocios) solo está haciendo una llamada al nivel de Acceso a dominio / datos, no tiene sentido hacer el nivel de Servicio en la forma TDD. Esas son pruebas esponjosas y no tienen mucho valor.

Agregado a una herramienta de cobertura de código como Emma, ​​y ​​puede monitorear constantemente la mejora en la cobertura general de la prueba.

JoseK
fuente
3

He trabajado en una base de código muy grande que inicialmente no tenía pruebas unitarias. Siguiendo algunas prácticas, ahora (después de varios años) tenemos la mayor parte del código base cubierto por las pruebas.

Todos los códigos nuevos deben tener pruebas unitarias.

Todos los códigos modificados deben tener pruebas unitarias añadidas.

La forma en que agregamos pruebas de forma segura al código antiguo sin romperlo es principalmente mediante el siguiente enfoque básico:

Elija una pequeña sección de código para la que necesite cambiar la funcionalidad.

  1. Intente crear pruebas de integración de nivel de sistema para rodear el código. Debido a la complejidad combinatoria de las pruebas a este nivel, estas pruebas solo formarán una prueba de "humo" para detectar errores importantes.
  2. Introduzca las interfaces que necesita para poder probar el código que está cambiando. Utilice las técnicas de refactorización que consisten en secuencias de cambios muy pequeños en los que tiene una alta confianza, son correctas. Intente utilizar el soporte de herramientas cuando sea posible. Puede hacerlo, por ejemplo, moviendo / extrayendo el método que está cambiando a su propio objeto. Revise sus cambios regularmente para que pueda revertir. Revise regularmente por pares cómo realizó los cambios revisando el historial de control de revisiones.

    Intente reducir al mínimo los cambios necesarios para romper las dependencias que le impiden agregar pruebas.

  3. Escriba pruebas en la medida de lo posible para cubrir la funcionalidad del código que va a cambiar. Regístrese regularmente y revise por pares todos los cambios.
  4. Escriba pruebas para la nueva funcionalidad / cambio de funcionalidad.
  5. Implemente la funcionalidad (este es su ciclo TDD normal)
  6. Asegúrese de refactorizar las áreas que ha cubierto por las pruebas (red-green-refactor).

Descubrimos que cuanto más hacíamos esto, más fácil se volvía. Como cada vez que vuelves a la base de código, es un poco mejor.

Hemos visto una caída masiva en la cantidad de errores que llegan a nuestros probadores de control de calidad. Dado que las regresiones de funcionalidad ahora son casi desconocidas, creo que valió la pena el esfuerzo para nosotros.

flamingpenguin
fuente
2

(por la falta de capacidad para comentar) Creo que es mejor que no hacer ninguna prueba. No todos los fragmentos deben ser probados, pero solo lo que el programador utilizará eventualmente. Probar las funciones de utilidad que utiliza internamente es bueno, pero no es obligatorio si accede a todo a través de una API limpia después.

phant0m
fuente
2

Si las cosas viejas han estado funcionando bien durante años, crear las pruebas unitarias ahora no es obligatorio a menos que cambie algo en las cosas viejas. De todos modos, escribir pruebas unitarias para las nuevas partes no tiene ningún sentido. Las nuevas partes son las más propensas a contener errores, y también son las partes más propensas a ser cambiadas o refactorizadas.

usuario281377
fuente
+1 "las partes nuevas son las que tienen más probabilidades de contener errores"
MIA
Eso depende de la complejidad del proyecto. "Trabajar bien" generalmente significa "no se ha roto recientemente" o "no se ha roto de la manera que alguien mencionó" ... no sugiere que siempre tenga que escribir pruebas unitarias para el código existente, pero no asuma que funciona correctamente o según lo previsto, tampoco.
Dave DuPlantis
1

Puede comenzar a cubrir su código actual y, si tiene algo de tiempo para gastar, comenzar a cubrir la funcionalidad principal del código antiguo. También puedes pedirle a tu PM algún tiempo extra para eso =)

Alexey Anufriyev
fuente
0

¿La unidad está probando un trato del 100% o no?

¡Absolutamente no! Comience a probar el nuevo código que está agregando. Verá enormes beneficios al hacerlo, incluso si algunos de los componentes más antiguos no tienen pruebas. Como tiene que lidiar con uno de esos componentes, o encontrar un error en él, escriba una prueba. Con el tiempo obtendrá más del código anterior bajo prueba.

Marcie
fuente