Pruebas de utilidades de línea de comandos

Rate this content
Bookmark

¿Alguna vez te has preguntado cuál es la mejor manera de probar tus utilidades de línea de comandos personalizadas? En esta charla, Florian Rappl te dará algunas ideas sobre lo que puedes hacer para verificar automáticamente tus herramientas CLI y evitar regresiones.

- Introducción: ¿Por qué probar las herramientas CLI?

- Desafíos: Contaminación del sistema de archivos, problemas de red y base de datos, variables de entorno

- Demostración: Mostrar problemas con una herramienta CLI de demostración - Soluciones: Implementación del plan de pruebas, elección del nivel adecuado de contenerización

- Demostración: Mostrar la solución utilizando la herramienta CLI anterior

- Conclusión

This talk has been presented at TestJS Summit 2022, check out the latest edition of this JavaScript Conference.

FAQ

SMAPIOK es una empresa con sede en Munich, Alemania, que se especializa principalmente en IoT y computación integrada. Están enfocados en proyectos de transformación digital, especialmente en aplicaciones web distribuidas.

Florian es un arquitecto de soluciones que trabaja en SMAPIOK. Además, es entusiasta del código abierto y ha sido galardonado como Microsoft MVP en el área de herramientas de desarrollo durante la última década.

Las utilidades de línea de comandos pueden ser difíciles de probar debido a la necesidad de manejar entradas y salidas en un entorno de terminal, además de coordinar procesos asíncronos y recursos como la red. También es importante probar su integración y funcionamiento correcto dentro de las aplicaciones.

Una estrategia es usar directorios temporales para cada prueba, lo que permite ejecuciones más rápidas y controladas. Otra es crear un directorio de plantilla que contenga todos los pasos necesarios para las pruebas y luego copiar este directorio para cada nueva prueba, reduciendo la redundancia y el tiempo de configuración.

Utilizan Jest como ejecutor de pruebas y Playwright para verificar la salida en un navegador. Las pruebas están escritas en TypeScript y se ejecutan en Azure Pipelines para un monitoreo y verificación continua.

Utilizan un asignador de puertos para asegurar que cada prueba obtenga un puerto libre, evitando conflictos de recursos. Además, emplean un administrador de recursos para manejar y limpiar servicios de manera confiable después de cada prueba.

Florian Rappl
Florian Rappl
34 min
03 Nov, 2022

Comments

Sign in or register to post your comment.
Video Summary and Transcription
Las utilidades de línea de comandos son importantes de probar porque actúan como un punto de intersección entre diferentes partes de una aplicación. El principal desafío en la prueba de utilidades de línea de comandos es el rendimiento, que se puede mejorar mediante el uso de directorios temporales. La gestión de puertos y recursos es crucial para evitar conflictos al ejecutar múltiples conjuntos de pruebas. El contexto de prueba garantiza que los procesos se ejecuten en el contexto correcto, incluido el uso de los directorios correctos. Ejecutar pruebas en diferentes configuraciones ayuda a identificar problemas de compatibilidad y proporciona una cobertura de prueba integral.
Available in English: Testing CLI Utilities

1. Introducción a la Prueba de Utilidades de Línea de Comandos

Short description:

Bienvenidos a la sesión, Prueba de Utilidades de Línea de Comandos. Las utilidades de línea de comandos son importantes de probar porque actúan como un punto de intersección entre diferentes partes de una aplicación. Pueden acceder a recursos de red e interactuar con el sistema localmente, lo que requiere una coordinación adecuada y un entorno controlado. Estos desafíos hacen que las utilidades de línea de comandos sean particularmente interesantes para la prueba. Por ejemplo, PyCLI es una utilidad que ayuda con tareas de desarrollo web como la creación de estructuras y la ejecución de procesos de depuración.

Bienvenidos a la sesión, Prueba de Utilidades de Línea de Comandos. Espero que estén tan motivados como yo para comenzar.

Antes de comenzar, echemos un vistazo a mi persona. Hola, soy Florian. Soy un arquitecto de soluciones en una empresa más pequeña con sede en Munich, Alemania, llamada SMAPIOK. Nos dedicamos principalmente a IoT y computación integrada y estamos especializados en proyectos de transformación digital, especialmente en aplicaciones web distribuidas. También soy un entusiasta del código abierto. ¿Qué significa eso? Bueno, he sido galardonado como Microsoft MVP en el área de herramientas de desarrollo durante la última década. Paso la mayor parte de mi tiempo trabajando en proyectos en el espacio de .NET, JavaScript, TypeScript y desarrollo web. Escribo muchos artículos y también he escrito un libro sobre micro frontends y actualmente estoy escribiendo otro libro sobre el desarrollo de aplicaciones frontend con NoJazz, así que asegúrense de conseguir una copia. Pero basta de hablar de mí, vamos directo al tema antes de que se nos acabe el tiempo.

Entonces, ¿qué hace que las utilidades de línea de comandos sean difíciles de probar? ¿Qué hace que también sean atractivas de probar? Bueno, en primer lugar, quiero decir, CLI implica que se ejecutan en la línea de comandos, lo cual es bueno por un lado porque iniciar un proceso de terminal siempre es bastante fácil y en cierto sentido también fácil de trabajar, mucho más fácil que trabajar, por ejemplo, con una interfaz gráfica de usuario. Por otro lado, por supuesto, debes lidiar con algunas cosas como, por ejemplo, recibir la salida estándar o también colocar algunas entradas en el flujo estándar de entrada. Y, por supuesto, necesitas coordinar eso y tener tus procesos asíncronos correctamente. Las utilidades de línea de comandos a menudo proporcionan, digamos, un punto de intersección entre dos partes de una aplicación por lo que son bastante importantes de probar para que funcionen correctamente. Y confiamos mucho en las utilidades de línea de comandos, por lo que tenerlas funcionando de manera confiable siempre es lo que buscamos. De todos modos, estas utilidades de línea de comandos, al igual que cualquier otra aplicación, también pueden acceder a algunos recursos. Por ejemplo, por supuesto, recursos de red. Y sí, quiero decir, es posible que desees simular estos, es posible que necesites ejecutar servicios locales y también puede que necesites coordinar estos recursos. Así que eso es algo que debes tener en cuenta. También, por supuesto, con cada paso que das en una dirección de simulación, por supuesto, eliminas una fuente potencial de error para una ejecución posterior y deberás tenerlo en cuenta. Sin embargo, el área más importante es, por supuesto, lo que sucede localmente en el sistema. Por ejemplo, en el sistema de archivos, las operaciones de lectura y escritura deben estar correctamente aisladas. Si ejecutas especialmente múltiples pruebas en paralelo, no puedes simplemente ir a ciegas y decir lo que hacen estas utilidades que estoy probando es correcto, solo confío en que siempre funcionan en, no sé, directorios dedicados y que no hay condiciones de carrera o lo que sea, realmente ejecutándolos en paralelo. Y eso, por supuesto, se aplica a cualquier tipo de recurso del sistema al que accedan. Ya tenemos un conjunto de desafíos pero también un conjunto de cosas que hacen que las utilidades de línea de comandos sean particularmente interesantes para la prueba.

Muy bien, yendo un poco más allá y pensando en algunos desafíos que surgen en eso, ya hemos hablado sobre la entrada y salida. Servir contenido ya se mencionó brevemente solo para recordarles. Por ejemplo, digamos que lo que vamos a probar es el llamado PyCLI. Es una pequeña utilidad que ayuda con algunas tareas relacionadas con el desarrollo web. Una de ellas es la creación de estructuras, pero otra que harías bastante después de la creación de estructuras es ejecutar, por ejemplo, un proceso de depuración con ella.

2. Verificación de Puerto y Contenido, Manejo de Fragmentación

Short description:

La utilidad de línea de comandos abre un puerto y sirve contenido en ese puerto. Para garantizar la corrección, podemos hacer ping al puerto y usar utilidades como BlayWrite para acceder y verificar el contenido. La fragmentación es un desafío común donde la utilidad coloca contenido en varios directorios. Esto se puede evitar limpiando después de cada prueba y asegurando el aislamiento de las pruebas.

Y este proceso de debug en realidad abre un servidor web en tu máquina local. Ahora queremos, por supuesto, verificar que esto se haya abierto correctamente. Y, por supuesto, esta parte de la CLI que abre algún puerto es algo que debemos tener en cuenta. Ahora, ¿cómo nos aseguramos de que se haya abierto el puerto correcto, pero también, por supuesto, de que el contenido servido en el puerto sea correcto? Necesitas, por supuesto, tener todas esas preguntas respondidas.

En nuestro caso, lo que hicimos, por supuesto, es asegurarnos de tener solo un ping en el puerto, que el puerto esté activo, pero luego, lo que podemos hacer es usar utilidades como BlayWrite para acceder realmente al contenido, leerlo y verificarlo con, digamos, una fuente de expectativa para asegurarnos de que los recursos reservados sean los mismos.

Ahora, la fragmentación es algo que aparecerá con bastante frecuencia, lo que significa que una utilidad de CLI puede, digamos, colocar contenido que, por ejemplo, crea en un par de directorios. Y no quieres que eso suceda tan a menudo, porque en primer lugar, necesitas limpiar después de cada prueba. Y en segundo lugar, necesitas asegurarte de que la prueba, por supuesto, se mantenga aislada, ¿verdad? Que puedas ejecutar, por ejemplo, múltiples casos de prueba en paralelo o múltiples suites de pruebas. Y si no tienes control sobre dónde la utilidad que deseas probar coloca los archivos, podrías encontrarte con estas condiciones de carrera que mencioné anteriormente.

Check out more articles and videos

We constantly think of articles and videos that might spark Git people interest / skill us up or help building a stellar career

Despliegue Atómico para Hipsters de JavaScript
DevOps.js Conf 2024DevOps.js Conf 2024
25 min
Despliegue Atómico para Hipsters de JavaScript
This Talk discusses atomic deployment for JavaScript and TypeScript, focusing on automated deployment processes, Git hooks, and using hard links to copy changes. The speaker demonstrates setting up a bare repository, configuring deployment variables, and using the post-receive hook to push changes to production. They also cover environment setup, branch configuration, and the build process. The Talk concludes with tips on real use cases, webhooks, and wrapping the deployment process.
Pruebas de rendimiento efectivas para su servidor con Autocannon
TestJS Summit 2021TestJS Summit 2021
36 min
Pruebas de rendimiento efectivas para su servidor con Autocannon
Top Content
Tamar is an experienced code writer and architect with expertise in Node.js. Performance testing can be confusing, but understanding terms like throughput and the 99th percentile is crucial. The 99th percentile is important for making commitments and ensuring customer satisfaction. AutoCanon is a powerful tool for simulating requests and analyzing server performance. It can be installed globally or used as a library in Node.js. Autocannon is preferred over Gatling for performance testing and can be integrated with end-to-end tests in Cypress.
Pruebas de integración encantadoras con Testcontainers
TestJS Summit 2022TestJS Summit 2022
21 min
Pruebas de integración encantadoras con Testcontainers
Top Content
Testing is crucial for development and production, with integration tests becoming more popular. Test containers is a library that integrates with Docker to create reliable test environments. It is flexible and can be used with various frameworks and test libraries. The IDE setup involves configuring the container and connecting it to the application. Test containers can be used for complex operations and allows running tests with real dependencies.
Regresión Visual con Puppeteer, Playwright y Cypress
TestJS Summit 2021TestJS Summit 2021
9 min
Regresión Visual con Puppeteer, Playwright y Cypress
Top Content
Hello, I'm Rainer Haneckamp, a trainer and consultant at Angular Architects. In this talk, we'll explore visual regression testing using tools like Puppeteer, Playwright, and Cypress. We'll learn how to use Storybook and Puppeteer with Jest for visual regression testing. We'll also see how Jest and Playwright can be used together for visual regression testing. Finally, we'll discover how to use Cypress for visual regression testing. Thank you for watching!
¿Playwright puede hacer esto?
TestJS Summit 2022TestJS Summit 2022
23 min
¿Playwright puede hacer esto?
Playwright is a powerful tool for end-to-end testing, offering support for all major browsers and platforms. It provides features like parallelization, built-in waiting, and assertions. Playwright allows for running tests on multiple browsers with a single command and has functionality for generating tests and performing visual regression testing. It also enables the manipulation of the network layer and loading internals of web pages. Best practices include using short and idempotent scripts, splitting user account flows into separate tests, and cleaning up after each test case.
La Guía del Desarrollador Perezoso: ¿Cómo Automatizar las Actualizaciones de Código?
DevOps.js Conf 2022DevOps.js Conf 2022
22 min
La Guía del Desarrollador Perezoso: ¿Cómo Automatizar las Actualizaciones de Código?
Code automations can save time and effort in development tasks. There are tools and examples available for automating tasks like updating dependencies and code formatting. Automation allows teams to focus on valuable work and improves overall performance. Deciding when to automate depends on the impact and type of code. The last automated task discussed was applying translation updates to multiple projects.

Workshops on related topic

Pruebas automatizadas de accesibilidad con jest-axe y Lighthouse CI
TestJS Summit 2021TestJS Summit 2021
85 min
Pruebas automatizadas de accesibilidad con jest-axe y Lighthouse CI
Workshop
Bonnie Schulkin
Bonnie Schulkin
¿Incluyen tus pruebas automatizadas verificaciones de accesibilidad? Este masterclass cubrirá cómo comenzar con jest-axe para detectar violaciones de accesibilidad basadas en código, y Lighthouse CI para validar la accesibilidad de las páginas completamente renderizadas. Ninguna cantidad de pruebas automatizadas puede reemplazar las pruebas manuales de accesibilidad, pero estas verificaciones se asegurarán de que tus probadores manuales no estén haciendo más trabajo del necesario.
Automatización de pruebas utilizando WebdriverIO
TestJS Summit 2022TestJS Summit 2022
163 min
Automatización de pruebas utilizando WebdriverIO
Workshop
Kevin Lamping
Kevin Lamping
En este masterclass, cubro no solo lo que WebdriverIO puede hacer, sino también cómo lo utilizarás día a día. He construido los ejercicios en torno a escenarios del mundo real que demuestran cómo realmente configurar las cosas. No es solo "qué hacer", sino específicamente "cómo llegar allí". Cubriremos los fundamentos de las pruebas automatizadas de UI para que puedas escribir pruebas mantenibles y útiles para tu sitio web y/o aplicación web.
JS Automatización de Pruebas de Seguridad para Desarrolladores en Cada Compilación
TestJS Summit 2021TestJS Summit 2021
111 min
JS Automatización de Pruebas de Seguridad para Desarrolladores en Cada Compilación
WorkshopFree
Oliver Moradov
Bar Hofesh
2 authors
Como desarrollador, necesitas entregar rápido y simplemente no tienes tiempo para pensar constantemente en seguridad. Aún así, si algo sale mal, es tu trabajo arreglarlo, pero las pruebas de seguridad bloquean tu automatización, crean cuellos de botella y solo retrasan las versiones... pero no tiene por qué ser así...

El escáner de seguridad de NeuraLegion, enfocado en los desarrolladores, Dynamic Application Security Testing (DAST), permite a los desarrolladores detectar, priorizar y remediar problemas de seguridad de manera TEMPRANA, en cada confirmación, sin falsos positivos/alertas, sin ralentizarte.

¡Únete a esta masterclass para aprender diferentes formas en que los desarrolladores pueden acceder a Nexploit y comenzar a escanear sin salir de la terminal!

Recorreremos la configuración de principio a fin, mientras configuramos un pipeline, ejecutamos pruebas de seguridad y analizamos los resultados.

Tabla de contenidos:
- Qué es realmente DAST (Dynamic Application Security Testing) enfocado en los desarrolladores y cómo funciona
- Ver dónde y cómo encaja un DAST moderno y preciso en el CI/CD
- Integrar el escáner Nexploit de NeuraLegion con GitHub Actions
- Comprender cómo se pueden probar las aplicaciones modernas, las API y los mecanismos de autenticación
- Hacer un fork de un repositorio, configurar un pipeline, ejecutar pruebas de seguridad y analizar los resultados
Automatización de pruebas de seguridad para desarrolladores en cada compilación
GraphQL Galaxy 2021GraphQL Galaxy 2021
82 min
Automatización de pruebas de seguridad para desarrolladores en cada compilación
WorkshopFree
Oliver Moradov
Bar Hofesh
2 authors
Como desarrollador, necesitas entregar rápido y simplemente no tienes tiempo para pensar constantemente en seguridad. Aún así, si algo sale mal, es tu trabajo arreglarlo, pero las pruebas de seguridad bloquean tu automatización, crean cuellos de botella y solo retrasan las versiones, especialmente con graphQL... pero no tiene por qué ser así...

El escáner de seguridad de NeuraLegion, enfocado en los desarrolladores, permite detectar, priorizar y remediar problemas de seguridad de manera temprana, en cada confirmación, sin falsos positivos o alertas, sin ralentizarte.

Únete a esta masterclass para aprender diferentes formas en las que los desarrolladores pueden acceder al escáner de seguridad de NeuraLegion y comenzar a escanear sin salir de la terminal!

Recorreremos la configuración de principio a fin, mientras configuramos un pipeline para un objetivo GraphQL vulnerable, ejecutamos pruebas de seguridad y analizamos los resultados.

Tabla de contenidos:
- Qué es realmente el escáner de seguridad de NeuraLegion enfocado en los desarrolladores (Dynamic Application Security Testing) y cómo funciona
- Ver dónde y cómo encaja un escáner moderno y preciso enfocado en los desarrolladores en el CI/CD
- Integrar el escáner de NeuraLegion con GitHub Actions
- Comprender cómo se pueden probar las aplicaciones modernas, GraphQL y otras API y mecanismos de autenticación
- Hacer un fork de un repositorio, configurar un pipeline, ejecutar pruebas de seguridad y analizar los resultados