Ya sabes, hay una cierta ansiedad que se arrastra cuando echas un vistazo a un código base en el que recién estás comenzando a trabajar, solo para darte cuenta de que es un vasto desierto inexplorado. No se ha escrito ni una sola prueba para protegerse contra lo inesperado.
Es como caminar sobre una cuerda floja sobre un abismo, sabiendo que un solo paso en falso podría hacer que todo su proyecto se desplome en el caos.
Si trabajó en un código base con 0 pruebas, sabe que puede ser una tarea abrumadora pensar en cubrir todo el código base con pruebas desde cero donde actualmente no existe ninguna.
El proceso exige un esfuerzo casi hercúleo: tendría que analizar cada función, método y componente, hacer una lluvia de ideas sobre todos los posibles casos extremos, estructurar el código del conjunto de pruebas y hacer que todo funcione sin problemas.
Y eso sin mencionar el tiempo que lleva alcanzar una cobertura significativa. Estamos hablando de semanas, tal vez meses, antes de que pueda sentarse y decir: "Sí, hemos alcanzado el 80% o el 90% de cobertura".
Es por eso que estoy emocionado de compartir en lo que he estado trabajando durante los últimos meses. Este viaje nos lleva a un lugar donde el reino de las pruebas automatizadas se encuentra con el mundo mágico de la IA. Conozca a Pythagora, una herramienta de desarrollo de código abierto que está a punto de convertirse en su nuevo mejor amigo.
A lo largo de esta publicación de blog, le mostraré cómo iniciar las pruebas automatizadas con Pythagora , que aprovecha el poder de la IA para generar pruebas para todo su código base, todo con un solo comando CLI y, con suerte , llevar su código base al 80% – 90 % de cobertura de código en un solo día .
Todos conocemos el dicho: “Roma no se construyó en un día”. Lo mismo podría decirse de un conjunto de pruebas completo y efectivo. Es un proceso meticuloso y exigente, pero una vez que ha atravesado este camino rocoso, la sensación de logro es profunda.
Recorramos juntos los pasos necesarios para crear un conjunto de pruebas desde cero y alcanzar esa codiciada cobertura de código del 80 % al 90 %.
En la primera etapa, eres como un pintor frente a un lienzo en blanco. El mundo está lleno de posibilidades y eres libre de crear una obra maestra.
Su obra maestra, en este caso, implica elegir los tipos de pruebas que desea escribir, encontrar el marco de prueba adecuado para usar y adoptar las mejores prácticas adecuadas para su entorno específico.
¿Está considerando pruebas unitarias, pruebas de integración, pruebas E2E o una combinación de las tres?
Si bien esta configuración inicial a menudo se ve como la parte "fácil", de ninguna manera es un paseo por el parque. Se requiere tiempo, investigación y quizás algunas tazas de café para tomar decisiones informadas.
Una vez que tenga su estructura básica en su lugar, es hora de arremangarse y profundizar en el meollo del asunto. Ahora, deberá revisar todo su código base, una función a la vez, y escribir pruebas para cada una. Su tarea aquí es asegurarse de que sus pruebas toquen todas las líneas de código dentro de cada función, método o componente.
Esta tarea es similar a explorar un intrincado laberinto. Debe atravesar todos los caminos, doblar cada esquina y asegurarse de que no quede piedra sin remover.
Escribir estas pruebas es un paso detallado que requiere mucho tiempo. No se trata solo de escribir unas pocas líneas de código; se trata de comprender el propósito de la función, su salida esperada y cómo interactúa dentro de su aplicación.
Después de la ronda inicial de pruebas, puede respirar aliviado. Espera, sin embargo; todavía queda una pieza importante del rompecabezas. Es hora de sumergirse en el salvaje e impredecible mundo de los casos extremos .
Es posible que esta parte no aumente el porcentaje de cobertura de su código, pero es crucial para probar la solidez y la resistencia de su código.
Estas llamadas pruebas negativas ayudan a evaluar cómo reacciona su código a varias entradas, particularmente aquellas en los márgenes del comportamiento esperado. Desde entradas vacías hasta valores que superan los límites de sus tipos de datos, estas pruebas están diseñadas para imitar el comportamiento del usuario en el mundo real, donde los usuarios a menudo tienen la habilidad de llevar su código en direcciones que nunca creyeron posibles.
Crear un conjunto de pruebas desde cero es una tarea hercúlea. Pero tenga la seguridad de que cada esfuerzo que realiza es un paso hacia la creación de una aplicación más robusta, confiable y resistente.
Y recuerda, no estás solo. Todos hemos estado allí, y con una herramienta como Pythagora, el viaje no es tan desalentador como parece.
Por otro lado, con Pythagora, lo que puedes hacer es ingresar:
npx pythagora --unit-tests --path ./path/to/repo
Pythagora navegará a través de todos los archivos en todas las carpetas, evocando pruebas unitarias para cada función que encuentre. Ahora, puede sentarse y relajarse o ir a almorzar y dejar que funcione por un tiempo hasta que termine de escribir las pruebas.
Vale, pero espera, ¿qué diablos es Pitágora?
Siempre soñé con un mundo en el que se pudieran crear pruebas automatizadas para mí. Pero la realidad no es tan simple. Nadie conoce su código como usted lo hace, por lo que es un desafío para otros redactar pruebas automatizadas efectivas para él. Los resultados a menudo no están a la altura de lo que lograría usted mismo.
Sin embargo, todo cambió cuando ChatGPT entró en escena. Mientras jugaba con esta tecnología, me encontré preguntándome: "¿Podríamos aprovechar el poder de ChatGPT para escribir pruebas automatizadas?"
Me picó la curiosidad, profundicé más, experimentando con sus capacidades, y lo que descubrí me dejó boquiabierto.
ChatGPT demostró una capacidad increíble para comprender el código, ofreciendo un vistazo de una nueva vía prometedora en las pruebas automatizadas.
Y así nació una idea para Pitágora.
Pythagora es una herramienta de desarrollo de código abierto, diseñada con una misión en mente: hacer que las pruebas automatizadas sean autónomas . Imagino un mundo en el que los desarrolladores, como tú y yo, podamos centrarnos en crear funciones sin empantanarnos en el fango de la redacción de pruebas y el mantenimiento.
Para lograr esta visión, está utilizando GPT-4.
Actualmente, Pythagora tiene la habilidad de escribir pruebas unitarias y de integración. Sin embargo, a los efectos de esta publicación de blog, nos concentraremos en su capacidad para generar pruebas unitarias.
Para instalar Pythagora, solo necesita hacer npm i pythagora
. ¡Eso es todo! Pitágora está ahora a su servicio.
Una vez que Pythagora esté instalado, deberá configurarlo con una clave API. Puede ser una clave API de OpenAI o una clave API de Pythagora.
Para usar una clave API de OpenAI, debe ejecutar el siguiente comando:
npx pythagora --config --openai-api-key <OPENAI_API_KEY>
Es importante tener en cuenta que, si elige usar su propia clave API de OpenAI, debe tener acceso a GPT-4.
Alternativamente, puede obtener una clave API de Pythagora desde este enlace . Una vez que lo tengas, configúralo con el siguiente comando:
npx pythagora --config --pythagora-api-key <PYTHAGORA_API_KEY>
Si prefiere generar pruebas para un archivo específico, use:
npx pythagora --unit-tests --path ./path/to/file.js
Y si tiene una función particular en mente, use:
npx pythagora --unit-tests --func <FUNCTION_NAME>
Abramos la cortina y echemos un vistazo a la sala de máquinas. ¿Qué mueve a Pitágora?
En su esencia, Pythagora funciona como un intrépido explorador que se adentra en el intrincado laberinto de su base de código. Primero, asigna todas las funciones que se exportan desde sus archivos para que pueda llamarlas desde dentro de las pruebas.
Obviamente, si una función no se exporta, no se puede llamar desde fuera de su archivo. Por cierto, después de generar pruebas un par de veces, te hará pensar en tu código base y cómo puedes estructurarlo mejor para que se puedan generar más pruebas.
Una vez que identifica las funciones exportadas, Pythagora da otro paso en la madriguera del conejo: investiga cada función a su vez, buscando cualquier función adicional llamada dentro.
Imagínelo como el arqueólogo de su base de código, limpiando suavemente las capas de polvo para exponer las conexiones y dependencias ocultas.
En otras palabras, busca todas las funciones que se llaman desde dentro de la función que se está probando para que GPT pueda obtener una mejor comprensión de lo que hace una función, para la cual se escriben las pruebas.
Armado con esta información, Pythagora se prepara para utilizar el poder de la IA. Empaqueta el código recopilado y lo envía a la API de Pythagora. Aquí, ocurre la magia real: se elabora meticulosamente un aviso y se entrega al modelo GPT.
Esta interacción entre el código, la API y el modelo de IA da como resultado la generación de un conjunto completo de pruebas unitarias, listas para implementarse y ponerse a trabajar.
Tanto el servidor API como las indicaciones utilizadas son de código abierto. Están disponibles para que profundices, analices e incluso contribuyas si así lo deseas. Puede encontrar el servidor API de Pythagora aquí , mientras que las indicaciones y los ingredientes clave en la creación de pruebas unitarias se encuentran en esta carpeta .
Una vez que Pythagora escribe todas las pruebas solicitadas, es hora de que saltes y comiences a revisarlas. Este es un paso vital en el proceso; es importante saber qué se ha creado y asegurarse de que todo se alinee con sus expectativas.
Recuerde, Pythagora crea pruebas basadas en Jest. Entonces, para ejecutar todas las pruebas generadas, simplemente puede ejecutar:
npx jest ./pythagora_tests/
Ahora, una palabra de precaución: Pitágora todavía está en sus primeras etapas. Al igual que con todos los proyectos jóvenes, es probable que tenga algunos contratiempos en el camino. Por lo tanto, es posible que encuentre pruebas fallidas en sus ejecuciones iniciales.
No te desanimes; considera esto como parte del viaje. Con su revisión y las mejoras continuas de Pythagora, estas pruebas fallidas pronto serán cosa del pasado.
Y no olvidemos el lado positivo. Incluso con estos problemas iniciales en etapa inicial, Pythagora puede llevarlo a un lugar donde su base de código tiene una cobertura de prueba sustancial, potencialmente de hasta el 90% .
El proceso de revisión, especialmente para bases de código más grandes, puede demorar algunas horas. Recuerde, no solo está mirando las pruebas que pasó, sino también las que fallaron. Es crucial comprender cada prueba que está enviando a su repositorio. El conocimiento es poder, después de todo.
Después de una revisión exhaustiva y posibles ajustes, está listo para hacer su movimiento final: enviar las pruebas generadas a su repositorio. Con este último paso, habrá integrado con éxito un sólido conjunto de pruebas unitarias en su proyecto.
Y todo esto se logra con el poder de Pitágora y unas pocas líneas de comando en tu terminal.
Muy bien, ahora que desperté su interés, profundicemos en las cosas reales: ejemplos tangibles de Pitágora en acción. Para el propósito de nuestra demostración, seleccionamos un conocido proyecto de código abierto, Lodash .
Ejecutar solo un comando de Pythagora fue suficiente para generar la friolera de 1604 pruebas, logrando una impresionante cobertura de código del 91 % de todo el repositorio de Lodash. Pero no es solo la cantidad de pruebas lo que es impresionante.
De estos, 13 pruebas descubrieron errores reales dentro de la rama maestra de Lodash.
Si tiene curiosidad por comprobarlo usted mismo, hemos bifurcado el repositorio de Lodash y hemos añadido las pruebas generadas por Pythagora. Siéntase libre de explorarlos aquí .
Ahora, echemos un vistazo más de cerca a una de las pruebas que detectó un error furtivo:
test(`size({ 'a': 1, 'b': 2, 'length': 9 })`, () => { expect(size({ 'a': 1, 'b': 2, 'length': 9 })).toBe(3); // test returns 9 });
En esta prueba, se supone que la función size
de Lodash devuelve el tamaño de un objeto JSON. Pero GPT agregó una clave llamada length
, un pequeño truco para ver si Lodash podría devolver el valor de esa clave en lugar del tamaño real del objeto.
Parece que Lodash se enamoró de esta artimaña, ya que la prueba falló al devolver '9' en lugar del esperado '3'.
Este es un ejemplo fantástico de cómo Pythagora, impulsado por GPT, se destaca en descubrir casos complicados que fácilmente podrían pasar desapercibidos.
Al generar una gran cantidad de casos de prueba tan complejos de forma automática, Pythagora puede ser su compañero de confianza, ayudándole a descubrir y corregir errores que quizás nunca hubiera previsto.
Bueno, ahí lo tenemos, compañeros desarrolladores. Nos hemos embarcado en un gran viaje hoy, atravesando los territorios desconocidos de una base de código sustancial sin pruebas y regresando con un conjunto automatizado de pruebas creadas por nuestra confiable herramienta impulsada por IA, Pythagora.
Ha aprendido que incluso frente a un código base desalentador y sin pruebas, no hay necesidad de desesperarse. La tarea de crear un conjunto sustancial de pruebas ya no tiene que ser una ardua tarea.
Hemos sido testigos de la magia de Pythagora mientras examinaba una conocida biblioteca de código abierto, Lodash, y generaba 1604 pruebas que cubrían un asombroso 91 % del código base .
Vimos cómo Pythagora no se trata solo de cantidad, sino también de la calidad de las pruebas. No se trata solo de crear pruebas porque sí, sino de encontrar de manera inteligente casos extremos y errores que de otro modo podrían haber pasado desapercibidos.
Pythagora desenmascaró 13 errores reales en la rama maestra de Lodash, un testimonio del poder de la IA en las pruebas de software.
Ahora, debería tener una comprensión más clara de por qué las herramientas de prueba impulsadas por IA como Pythagora no son solo un lujo, sino una necesidad en el panorama de desarrollo acelerado de hoy.
Entonces, ya sea que esté lidiando con un proyecto existente sin pruebas o comenzando uno nuevo y buscando establecer un marco de prueba sólido desde el principio, recuerde que no está solo.
Pythagora está aquí para tomar las riendas, ayudándolo a generar pruebas significativas con facilidad y ahorrándole un tiempo valioso que puede dedicar mejor al desarrollo de excelentes funciones.
Gracias por acompañarme en este viaje y no veo la hora de ver cómo utiliza Pythagora en sus proyectos. ¡Feliz codificación!
PD: si esta publicación le resultó útil, significaría mucho para mí si protagonizara el repositorio Pythagora Github , y si prueba Pythagora, háganos saber cómo le fue en [email protected]