- Por Valeria Di Francesco
- ·
- Publicado 03 Jun 2024
Estrategias de testing aplicadas a negocio
Cuando se trata de desarrollar software, el testing es una pieza fundamental que garantiza la calidad y la confiabilidad de un producto y puede tener..
Este es un seguimiento de una serie de publicaciones sobre anti patrones TDD. En el episodio anterior cubrimos: The mockery, The inspector, The generous leftovers y The local hero, esos son parte de 22 antipatrones, enumerados por James Carr.
En esta publicación de blog nos vamos a centrar en cuatro más, llamados: The nitpicker, The secret catcher, The dodger y The Loudmouth. Cada uno de ellos se enfoca en un aspecto específico del código que dificulta las pruebas y están de alguna manera conectados con los principiantes en TDD. Son patrones que se encuentran en aquellos que no tienen experiencia escribiendo aplicaciones guiadas por pruebas.
Además, según la encuesta, observamos que estos son cuatro de los anti patrones menos populares.
Si prefieres ver el workshop en el que hablamos sobre estos anti patrones te dejamos aquí un link al video.
La encuesta reveló previamente que el captador de secretos está en la 7ª posición de los antipatrones de tdd más populares.
El Secret Catcher es un viejo amigo mío. He visto este anti patrón en diferentes bases de código, y muchas veces lo comparo con la "prisa" con la que se necesita liberar funcionalidades.
Se le llama 'secreto' porque ignora que el código debe generar una excepción y, en lugar de manejarlo (catch), el caso de prueba simplemente lo ignora. El Secret Catcher también está relacionado con The Greedy Catcher que aún no hemos cubierto.
El siguiente ejemplo escrito en vuejs con el cliente apollo es un intento de representar tal escenario, donde el método parece estar bien y hace lo que se supone que debe hacer. En otras palabras, envía una mutación al servidor para eliminar el tipo de pago del usuario asociado y al final actualiza la interfaz de usuario para reflejar que:
La prueba javascript está escrita usando jest y la librería de pruebas. Aquí hay un desafío para ti, antes de seguir con el texto, ¿puedes detectar qué falta en el caso de prueba?
Comencemos por la afirmación que falta al final del caso de prueba. Si no te has dado cuenta el último paso que hace la prueba es esperar el evento click y listo. Para alguna función que elimina un método de pago de un usuario, sería una buena idea afirmar que se muestra un mensaje.
Además, el caso de prueba se basa en una configuración específica de que la mutación de graphql siempre funcionará. En otras palabras, si la mutación de graphql arroja una excepción en el código de producción, pero no hay ninguna señal de que se maneje. En este escenario, el caso de prueba depende de jest para informar del error, si lo hay.
Según los datos de la encuesta, el quisquilloso está en la octava posición de los anti patrones más populares de la tdd.
El quisquilloso, como dice la definición, se observa en las aplicaciones web donde la necesidad de afirmar la salida se centra en un objeto completo, en lugar de la propiedad específica necesaria. Esto es común para las estructuras JSON, como se muestra en el primer ejemplo.
El siguiente código afirma que se ha eliminado una aplicación. En este contexto, una aplicación es una entrada regular en la base de datos con la etiqueta "aplicación". Tengan en cuenta que este ejemplo en PHP se usa para afirmar el resultado exacto de la solicitud HTTP, nada más y nada menos.
En este sentido, esta prueba es frágil por una razón específica: si agregamos otra propiedad a la respuesta fallará quejándose de que el json ha cambiado. Para eliminar esas propiedades, tal falla sería útil. Por otro lado, agregar una nueva propiedad no debería ser el caso.
La "solución" sería reemplazar la idea "exacta" en esta afirmación para que sea menos estricta, como la siguiente:
El cambio aquí es afirmar que el fragmento deseado está en la salida, sin importar si hay otras propiedades en la salida, siempre que la deseada esté allí. Este simple cambio abre la puerta para alejarnos de la frágil prueba que teníamos en primer lugar.
Otra forma de no enfrentarse al quisquilloso es buscar las propiedades que deseas. El siguiente código es de un proyecto de código abierto que maneja el proceso de sining s3 para acceder a un recurso en amazon s3:
El código tiene tres aserciones para afirmar que tiene la propiedad deseada en lugar de verificar todas a la vez, independientemente de la salida.
Otro ejemplo de cómo abordar tales afirmaciones es el código extraído de un proyecto de código abierto que tiene como objetivo recopilar y procesar las cuatro métricas clave:
Una vez más, RestAssured busca propiedad por propiedad en la salida en lugar de comparar todo en la salida como se muestra en el primer ejemplo.
Los marcos de prueba suelen ofrecer dicha utilidad para ayudar a los desarrolladores a probar. Por ejemplo, en el primer escenario, Laravel usa la sintaxis assertJson/assertExactJson. El segundo caso usa chai para representar cómo afirmar propiedades específicas en un objeto. Por último, pero no menos importante, RestAssured es el que se usa para describir cómo lidiar con el quisquilloso en el ecosistema kotlin.
Según los datos de la encuesta el dodger se encuentra en la octava posición de los anti patrones tdd más populares.
El dodger, según mi experiencia, es el anti patrón más común cuando se comienza primero con las pruebas. Antes de profundizar en el ejemplo del código, me gustaría elaborar un poco más sobre por qué podría aparecer el dodger.
Escribir código de manera TDD implica redactar en primer lugar la prueba, para cualquier código. La regla es: comienza con una prueba reprobatoria. Hazlo pasar, y luego refactoriza. Tan simple como parece, hay algunos momentos específicos durante la práctica de este flujo en los que surge la pregunta, ¿qué debo probar?
Como dice la regla, el enfoque común es comenzar a escribir pruebas por una clase y una clase de producción, lo que significa que tendrás una relación 1-1. Entonces, la siguiente pregunta es: ¿qué tan pequeño debe ser el paso para escribir una prueba? Como este 'pequeño' depende del contexto, no está tan claro qué es un código de prueba mínimo para pasar al código de producción. Aunque hay algunos videos y practicantes que lo hacen muy fácil.
Esas dos preguntas, al comenzar a practicar TDD, son comunes y podrían conducir a la esquiva. Ya que se puso el foco en probar el código de implementación específico en lugar del comportamiento deseado. Para representar eso, toma el siguiente código de producción:
El objetivo aquí es validar este objeto Autor, para ser creado, la matriz dada debe contener datos válidos y, de lo contrario, se lanzará una excepción. Luego, el siguiente es el código de prueba:
Lo primero que noté al hojear el código es que si necesito cambiar la forma en que obtengo el nombre del autor (cambiar el nombre del método), es necesario cambiar el código de prueba, aunque el comportamiento deseado no ha cambiado, la validación todavía se requiere.
Otro enfoque sería reescribir el caso de prueba único, por múltiples casos de prueba, capturando la excepción deseada si se pasa un valor no deseado. Luego, encapsularlo en una clase de validación para evitar el acoplamiento del código de prueba y producción.
Según los datos de la encuesta, el bocazas se encuentra en la octava posición de los anti patrones tdd más populares .
Al desarrollar, es algo común agregar algunos rastros para ver si lo que está haciendo el código coincide con la comprensión del desarrollador. Podemos llamar a eso depuración, que a menudo se usa cuando un desarrollador necesita comprender una parte del código.
Los practicantes de TDD argumentan que una vez que se practica TDD, no se necesita ninguna herramienta de depuración, ya sea una declaración de impresión o agregando puntos de interrupción en el código. Entonces, qué pasa si no tienes tanta experiencia con TDD?
A menudo la respuesta es una combinación de ambos, la depuración y el uso de las pruebas para hablar contigo. Por ejemplo, el siguiente código muestra un código de prueba que puede manejar un error si recibe un código javascript no válido. Ten en cuenta que el código se utiliza para analizar el código javascript y actuar sobre su resultado:
La verificación es sencilla. Comprueba si la estrategia deseada no se llamó ya que el código es un código javascript no válido y también verifica si el resultado fue falso booleano. Veamos ahora cómo se ve la implementación de esta prueba:
Idealmente, al trabajar de forma TDD, el archivo console.log utilizado se burlaría desde el principio, ya que requeriría una verificación de cuándo fue llamado y con qué mensaje. Esta primera pista ya apunta a un enfoque que no es probar primero. La siguiente imagen muestra lo que causa el bocazas, aunque las pruebas son verdes, hay un mensaje de advertencia: ¿pasó la prueba?, ¿el cambio rompió algo?
Steve Freeman y Nat Pryce dan una idea de por qué el registro (como el console.log) debe tratarse como una función en lugar de un registro aleatorio que se usa por cualquier motivo.
El siguiente fragmento muestra una posible implementación que se burla de console.log y evita que se muestre el mensaje durante la ejecución de la prueba:
Con la consola burlada, ahora es posible afirmar el uso de la misma en lugar de imprimir la salida mientras se ejecutan las pruebas. La versión sin el bocazas sería la siguiente:
En esta publicación, revisamos cuatro anti patrones más que están relacionados con los desarrolladores que están comenzando con TDD. Éstos también son los anti patrones menos populares que surgieron en la encuesta, The secret catcher en 7º, The nitpicker, The dodge y the loudmouth en 8º.
Vimos que el receptor secreto es engañoso y parece estar probando lo que se supone que debe probar, pero en una inspección minuciosa detectamos la excepción del manejo fallido. El quisquilloso, por otro lado, apunta a pruebas frágiles, en las que la afirmación utilizada para probar se enfoca en más cosas de las que necesita.
El dodge es el clásico anti patrón cuando se empieza en TDD, lleva a una relación uno a uno entre el código de prueba y el de producción. Por último, pero no menos importante, el bocazas puede hacer que el desarrollador dude de si la prueba que está pasando es verde por la razón correcta, ya que la salida contamina la salida mientras se ejecutan las pruebas.
Con todo, llegamos a un punto en el que cubrimos más del 50% de los 22 anti patrones enumerados por James Carr. Estos cuatro agregaron a nuestro kit de herramientas más información mientras probaban aplicaciones de manejo.
Cuando se trata de desarrollar software, el testing es una pieza fundamental que garantiza la calidad y la confiabilidad de un producto y puede tener..
Si tienes mucha experiencia implementando el Desarrollo Guiado por Pruebas (TDD), tu plan de aprendizaje debería centrarse en profundizar tu..
Para un desarrollador con un nivel intermedio en Desarrollo Guiado por Pruebas (TDD), el objetivo es profundizar en la comprensión de los..
Suscríbete a nuestra newsletter para que podamos hacerte llegar recomendaciones de expertos y casos prácticos inspiradores