- 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..
El Test Driven Development (TDD) es una práctica utilizada por la mayoría de desarrolladores para ofrecer código de calidad a través de ciclos cortos de feedback (fail-pass-refactor).
Kent Beck popularizó esta metodología y se convirtió en un estándar del sector. Iniciarse en TDD no es fácil y mantenerlo correctamente para que el test suite se ejecute con rapidez es aún más complicado. Las bases de código que abordan problemas de negocio requieren una gran cantidad de código y, por tanto, un gran conjunto de tests. Como describe este informe, la industria en general tiene un proceso de automatización de pruebas inmaduro que conduce a procesos de feedback muy lentos.
En Codurance somos conscientes de ello y por eso intentamos impulsar buenas prácticas que ayuden a elevar el nivel de calidad en la industria del software. Por ejemplo, en el episodio 31 de Codurance Talks, Javier Martínez Alcántara, Alasdair Smith y José Enrique Rodríguez Huerta hablan sobre las claves para construir una buena cultura de testing.
En ese sentido, James Carr elaboró una lista de anti-patrones a evitar y a tener en cuenta para no caer en la trampa de los tests que generan bases de código demasiado grandes (y llevan a procesos de feedback muy lentos). Dave Farley repasó algunos de ellos en su canal de youtube y me hizo darme cuenta de que tenía que difundir este tema. Este post está inspirado en el video de Dave Farley, en un compañero de Codurance que hizo un workshop sobre anti patrones TDD ;) y también para compartir los datos obtenidos en la encuesta sobre antipatrones TDD realizada recientemente.
Antes del meetup, hicimos una encuesta para recopilar datos sobre los anti patrones TDD en la industria y que profesionales de todo el mundo nos dieran su opinión. Obtuvimos 22 respuestas y los datos muestran que los profesionales que respondieron la encuesta trabajaron para proyectos en Latino América: Argentina, Brasil y México y en Europa: Francia, Hungría, Irlanda, Portugal, España y Rumania.
También descubrimos que los lenguajes de programación más populares con los que los encuestados trabajan profesionalmente son:
Verás que la mayoría de los ejemplos utilizados en las siguientes secciones también están en javascript. Creemos que de esta manera será más fácil llegar a una audiencia más amplia y retribuir a quienes respondieron la encuesta. Por otro lado, también vemos otros lenguajes que aparecen en la encuesta que no son tan populares: Ruby, Rust y Groovy.
También encontramos que los profesionales generalmente aprenden TDD de manera informal, lo que significa que a partir de las respuestas, más del 50% de ellos aprendieron TDD solo a través de vídeos, libros o tutoriales que han encontrado en internet. Siguiendo la misma tendencia, solo el 50% de las empresas comprenden los pros y los contras de TDD y lo utilizan como práctica.
Según los datos de la encuesta, excessive setup es el tercer antipatrón TDD más popular.
Con excessive setup me refiero a debido a la "no práctica" de TDD desde el principio y también a la falta de práctica de calistenia de objetos; también se aplicaría a la programación funcional. Aún así, por el momento, me quedaré con la programación orientada a objetos.
El enfoque clásico para excessive setup es cuando desea probar un comportamiento específico en tu base de código. Se vuelve difícil debido a las muchas dependencias que necesitas crear de antemano (como clases, dependencias del sistema operativo, bases de datos, básicamente cualquier cosa que quite la atención al objetivo de la prueba).
En este punto, sabemos que estamos creando una aplicación nuxt e inyectando diferentes mocks. Entonces, el siguiente bit pega todo junto:
El número excesivo de parámetros para probar la función es tan grande que si alguien (o yo mismo) comenzamos a escribir un nuevo caso de test, nos olvidaríamos de inyectar en la función para recibir el resultado deseado.
Dave Farley muestra otro ejemplo de Jenkins, un proyecto ci / cd de código abierto. Él describe un caso de test particular que construye un navegador web para afirmar que la URL que se está utilizando es de desarrollo:
Él argumenta que el caso de test crea un cliente web para afirmar la URL, que podría haber sido una llamada de objeto regular y afirmar el valor devuelto, evitando la creación del cliente web.
La excessive setup puede mostrarse en diferentes contextos. Para una situación dada, la pregunta es: ¿estamos enfocados en probar el fragmento de código que necesitamos o estamos dedicando tiempo a configurar el escenario? Si la respuesta es hacia la segunda opción, entonces tienes un candidato para ser excesivo.
Es el cuarto antipatrón TDD más popular según los datos de la encuesta. The liar es uno de los anti-patrones más comunes que puedo recordar en mi vida profesional practicando TDD. Enumeraría al menos esas dos razones para detectar estos problemas entre las bases de código:
Volviendo al anti-patrón, este test pasaría sin quejarse, "el mentiroso". El enfoque correcto es esperar a que la función asíncrona termine su ejecución y darle control jest sobre la ejecución del flujo nuevamente; esto se hace invocando un parámetro que inyecta Jest al ejecutar los test. En el ejemplo de código que sigue, este parámetro se llama "done".
Según los datos de la encuesta, the gigant es el quinto anti patrón TDD más popular.
The gigant también es un signo de falta en el diseño del código base. El diseño de código también es un tema de discusión entre los profesionales de TDD. Sandro Mancuso habló sobre la relación entre TDD y un buen diseño: ¿TDD realmente conduce a un buen diseño?
A diferencia de excessive setup, diría que este anti-patrón también puede ocurrir mientras se desarrolla en una forma TDD. Por ejemplo, Javier Chacana exploró los conceptos de TPP (Transformation Priority Premise) que muestran pequeñas transformaciones realizadas en el código fuente para evitar reflejar el código de prueba con el código de producción. The gigant a menudo se relaciona con la God class, lo que va en contra de los principios SOLID..
En TDD, the gigant a menudo se relaciona con muchas afirmaciones en un solo test case, como lo describe Dave Farley en su video. El mismo archivo de test utilizado por nuxtjs en la excessive setup muestra señales del "gigante". Inspeccionando el código más de cerca, vemos quince afirmaciones para un solo caso de prueba:
De acuerdo con la encuesta el slow poke es el sexto tdd anti-patterns mas popular. Me recuerda a pokemon, y al igual que la criatura, el empuje lento reduce la eficiencia del conjunto de test. Por lo general, pone en ejecución el conjunto de test y tarda más en finalizar y dar feedback al desarrollador.
Una de las causas es el time-related code, que es difícil de manejar en un caso de test; Implica manipularlo de diferentes formas.
Por ejemplo, si estamos tratando con sistemas de pago, nos gustaría activar alguna rutina para lanzar un pago a fin de mes. Para eso, necesitaríamos una forma de manejar el tiempo y verificar una fecha específica (el último día del mes) y una hora (¿en algún lugar alrededor de la mañana? ¿Tarde?). En otras palabras, necesitamos una forma de manejar el tiempo y lidiar con él sin la necesidad de esperar hasta el final del mes para ejecutar el test, o peor aún, ¿dejarías la prueba ejecutándose durante un mes para recibir feedback?
El código relacionado con el tiempo conduce al no determinismo, como ya se mencionó en la sección The lier. Pero, por suerte, hay una manera de superar esta situación con mocks.
Avanzar hacia las pruebas de integración o end-to-end tests también puede transformar la suite de pruebas en una tarea difícil de ejecutar, lo que lleva muchas horas o incluso días. Este enfoque también está relacionado con el cono de helado en lugar de la pirámide de la prueba. En un escenario ideal, tendría como base más unit test, algunas pruebas de integración e incluso menos pruebas end-to-end.
En mi experiencia, el slow poke viene en dos modos diferentes:
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..
Los equipos de desarrollo de muchas organizaciones han adoptado las revisiones de código como una de sus prácticas básicas. Aunque parece algo muy..
La clave del crecimiento organizacional no solo reside en tener un producto o servicio excepcional, sino también en el entorno en el que se..
Suscríbete a nuestra newsletter para que podamos hacerte llegar recomendaciones de expertos y casos prácticos inspiradores