Dentro del Motor: Cómo Funcionan los Modernos Runners de Pruebas JS y las Trampas que Ocultan

Bookmark
Rate this content

Los modernos test runners como Vitest y Jest nos sorprenden con características de siguiente nivel. Piensa en la concurrencia en el archivo, HMR, Chromium embebido, benchmarks de rendimiento - tú lo nombras. Sin embargo, detrás de todas estas maravillas se encuentra un laberinto de mecánicas de tiempo de ejecución que se adentran profundamente en el tiempo de ejecución de JavaScript. Estas dulces ventajas pueden convertirse rápidamente en un obstáculo, desde sutiles fallos de mocking hasta serios problemas de rendimiento. Entender estas máquinas no es solo un recorrido geek en el corazón de bibliotecas ingeniosas, sino también una comprensión perspicaz del V8 y la inferencia de código que te ahorrará horas de rascarte la cabeza y te ayudará a crear pruebas más reflexivas. ¿No te gustan las charlas teóricas? Genial, esta es para ti.

This talk has been presented at Node Congress 2025, check out the latest edition of this JavaScript Conference.

Yoni Goldberg
Yoni Goldberg
22 min
17 Apr, 2025

Comments

Sign in or register to post your comment.
  • Va Da
    Va Da
    P4
    ~200ms for 200 tests is not that fast, actually.
Video Summary and Transcription
Hola, estoy agradecido de que hayas elegido ver mi masterclass. Gracias. La semana pasada, tuve que ejecutar algunas pruebas unitarias mientras codificaba. El rendimiento empresarial puede ser impresionante. Tiene características muy interesantes y destacadas. Estos conjuntos de pruebas son excesivamente complejos. Es fácil encontrarse solucionando problemas durante horas. VTest tiene casi 200 opciones de configuración. Al explicar cómo funcionan las cosas, podemos responder preguntas sobre el uso de runners de terceros complejos frente al runner incorporado de node.js. Entender mejor ayuda a evitar obstáculos, solucionar problemas más rápido e identificar oportunidades para configurar las cosas mejor. La capa CLI realiza la validación y entrega a la clase VTest. Busca archivos de prueba, los ejecuta de manera eficiente utilizando un grupo de trabajadores y asegura la aislamiento para prevenir problemas con el estado sucio. VTest utiliza la biblioteca piscina para facilitar el trabajo con múltiples trabajadores y mejorar el rendimiento. Los trabajadores se preparan configurando los globals correctos, inicializando snapshots, decidiendo el archivo del runner de pruebas y comenzando la recolección de cobertura. Cada trabajador ejecuta todas las pruebas en un archivo y envía un mensaje RPC cuando ha terminado. La decisión de reutilizar o crear un nuevo trabajador se determina por la opción de configuración de aislamiento. Considera distribuir las pruebas entre más archivos para utilizar completamente la máquina. Elige entre proceso, hilo o VM como tipo de trabajador. En términos de aislamiento, puedes elegir entre usar un proceso, un hilo o una VM. El proceso es el más pesado en términos de costo de rendimiento, mientras que el hilo es más ligero. El rendimiento de la VM depende de aspectos más lentos conocidos como el acceso a globals. El proceso es la opción clásica para la estabilidad, pero el hilo tiene limitaciones y problemas conocidos. La VM tiene problemas de informes con fugas de memoria. Los resultados de las pruebas de referencia mostraron que usar múltiples procesos fue un 50% mejor para aplicaciones del mundo real, pero para pruebas unitarias, un proceso fue diez veces más rápido. El hilo fue ligeramente más rápido que el proceso, y la VM fue más lenta. El precio del aislamiento con tipos de trabajadores de proceso fue de aproximadamente tres minutos. Sin aislamiento, las pruebas duraron solo dos minutos, mucho más rápido, pero con algunas fallas. Los hilos mostraron resultados similares con algunas fallas. El riesgo de lidiar con problemas de pruebas aumenta sin aislamiento. Por defecto, las pruebas se ejecutan secuencialmente dentro de los trabajadores, pero puedes configurarlas para que se ejecuten en paralelo usando la palabra clave 'concurrent'. Sin embargo, las pruebas aún se ejecutan secuencialmente a pesar de especificar 'concurrent'. La concurrencia en VTest se basa en promesas y requiere trabajo asíncrono. Las pruebas unitarias se ejecutan secuencialmente y la concurrencia no tiene aislamiento. El mocking en una prueba afecta a otras pruebas que se ejecutan simultáneamente. Al elegir configuraciones de trabajadores, depende del contexto. La concurrencia en el archivo es mejor evitarla, y se recomienda el tipo de trabajador de proceso como predeterminado. El aislamiento es crucial en pruebas de integración pero no es obligatorio en pruebas unitarias. Dentro del trabajador, se maneja un archivo TypeScript, y pueden ocurrir fallas al hacer mocking de funciones. El mocking no funciona en el trabajador. El trabajador maneja archivos TypeScript y los transpila usando el servidor Vite. El servidor Vite reemplaza las importaciones y eleva el mocking. Vite introduce un nuevo cargador de módulos en el tiempo de ejecución. Vite elevó el mock a la primera línea en el código de transformación para hacerlo antes de la importación. Además, Vite cambia los mocks a importaciones dinámicas, asegurando que el mocking funcione. Vite intercepta llamadas a funciones a nivel de importación de archivo, pero no puede interceptar llamadas entre funciones en el mismo archivo. Mover la función dos a un archivo diferente o usar una exportación de objeto puede resolver este problema. La función uno llama a la función dos en el mismo contexto de objeto. Usa Spy para reemplazar funciones dentro del objeto. Vite ofrece una gama de plugins para diferentes funcionalidades. Puedes solucionar problemas de importación personalizando el tiempo de ejecución de Vite. El servidor Vite maneja la resolución de dependencias y la transformación. Considera usar el runner de pruebas incorporado o mockup para pruebas a pequeña escala. Obtén una mejor experiencia de pruebas con el tiempo de ejecución personalizado de Vite.

1. Introducción a VTest

Short description:

Hola, estoy agradecido de que hayas elegido ver mi charla. Gracias. La semana pasada, tuve que ejecutar algunas pruebas unitarias mientras codificaba. El rendimiento empresarial puede ser increíble. Tiene características muy interesantes y sobresalientes. Estos conjuntos de pruebas son excesivamente complejos.

Hola, estoy agradecido de que hayas elegido ver mi charla. Gracias.

La semana pasada, tuve que ejecutar algunas pruebas unitarias mientras codificaba. Y cada vez que cambiaba algo en el código, la prueba se ejecutaba en la segunda pantalla. Tenía 200 pruebas, y se ejecutaban en 170 milisegundos. Wow. Eso fue tan increíblemente rápido. Como, podría parpadear y perderme la ejecución. El rendimiento empresarial puede ser increíble.

Ahora, no se trata solo de rendimiento. También tiene características muy interesantes y sobresalientes. Como, ¿sabías que puedes escribir una prueba con la misma sintaxis pero solo recibir alertas cuando tienes una regresión de rendimiento? Otro ejemplo, puedes ejecutar pruebas que harán verificación de tipos en tiempo de compilación y muchas otras características inusuales, hermosas, útiles. Pero todas estas maravillas tienen un precio. Estos conjuntos de pruebas son excesivamente complejos. Es muy fácil encontrarte solucionando problemas durante horas, por ejemplo, ¿por qué funcionó este walking? Y también tomar la decisión arquitectónica incorrecta debido a un conocimiento ineficiente sobre lo que está sucediendo allí dentro. Para darte un ejemplo, VTest tiene casi 200 configuraciones opciones. Puedes pasar días leyendo y tratando de entender todas tus opciones para comparar los runners de prueba integrados de node.js como solo 19.

2. Explorando la Ejecución de VTest

Short description:

Al explicar cómo funcionan las cosas, podemos responder preguntas sobre el uso de runners de terceros complejos frente al runner integrado de node.js. Entender mejor ayuda a evitar trampas, solucionar problemas más rápido e identificar oportunidades para configurar las cosas mejor. Nuestro viaje con VTest comienza cuando alguien escribe el comando para ejecutar pruebas. La capa CLI realiza la validación y pasa a la clase VTest. Busca archivos de prueba, los ejecuta de manera eficiente utilizando un grupo de trabajadores y asegura la aislamiento para prevenir problemas con el estado sucio.

Esta es mi esperanza hoy. Al explicar a ustedes cómo funcionan las cosas, podemos responder preguntas como si deberías usar estos runners de terceros complejos o usar uno más simple como el runner integrado de node.js. Y también al entender mejor, espero que puedas evitar trampas comunes, solucionar problemas más rápido, y también identificar oportunidades para configurar las cosas mejor y obtener más características de ello.

¿Listo para sumergirte en este agujero de conejo conmigo? Genial. Justo antes de eso, soy Emily Goldberg. Soy consultora de backend y pruebas. Trabajo con más de 50 empresas en todo el mundo, grandes nombres y startups en un garaje escribiendo pruebas simples de frontend y backend. Intento resumir todo el conocimiento y las prácticas que aprendí en mi repositorio de GitHub que en total fue visitado por más de 135,000 personas. Si quieres aprender más sobre cómo probar cosas avanzadas de backend modernas, entonces sé mi invitado en testjavascript.com.

Así que nuestro viaje comienza cuando alguien escribe VTest. El comando VTest para comenzar a ejecutar pruebas proporciona este patrón de globos para encontrar todos los archivos que comienzan con este prefijo. Y lo primero que sucede es que la capa CLI de VTest es activada, realiza principalmente una validación simple. Y luego se pasa a la gran clase VTest. Esta es una especie de clase Dios que tiene la referencia a la medida de los servicios. Y está orquestando este flujo. Para empezar, hará todo tipo de cosas casuales como instalar dependencias alrededor de la configuración global. Luego llamará a una clase de globos que buscará todos los archivos de prueba que coincidan con este patrón. Y el resultado de esto es, obviamente, una lista de archivos de TypeScript para ejecutar.

Ahora, VTest necesita ejecutar todos estos archivos. Naivamente, puede ejecutarlos todos uno por uno secuencialmente. Pero si cada uno toma un segundo, en total durará tres segundos. Y esto es un desperdicio en una máquina de múltiples núcleos. Otros problemas a tener en cuenta son la aislamiento. Cada archivo de prueba podría dejar rastros si todos se ejecutan en el mismo entorno de Node.js. Y por rastros, me refiero a cosas como cambiar variables de entorno, burlas, la caché de módulos, grupos de conexiones, y más. Luego, cuando se ejecute la siguiente prueba, podría enfrentar todos estos, todo este estado sucio y enfrentar problemas.

Así que VTest quiere hacerlo mejor. Y la forma en que funciona es tomando estos archivos y utilizando un grupo de trabajadores. Bajo el capó, utiliza una biblioteca llamada piscina, una futura que fue creada por Matteo Colina y James Nell. Y piscina facilita el trabajo con múltiples trabajadores. Te permite elegir si es un proceso o un hilo, y también permite reutilizar trabajadores existentes para un mejor rendimiento.

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

Solicitudes de Red con Cypress
TestJS Summit 2021TestJS Summit 2021
33 min
Solicitudes de Red con Cypress
Top Content
Cecilia Martinez, a technical account manager at Cypress, discusses network requests in Cypress and demonstrates commands like cydot request and SCI.INTERCEPT. She also explains dynamic matching and aliasing, network stubbing, and the pros and cons of using real server responses versus stubbing. The talk covers logging request responses, testing front-end and backend API, handling list length and DOM traversal, lazy loading, and provides resources for beginners to learn Cypress.
Pruebas de ciclo completo con Cypress
TestJS Summit 2022TestJS Summit 2022
27 min
Pruebas de ciclo completo con Cypress
Top Content
Cypress is a powerful tool for end-to-end testing and API testing. It provides instant feedback on test errors and allows tests to be run inside the browser. Cypress enables testing at both the application and network layers, making it easier to reach different edge cases. With features like AppActions and component testing, Cypress allows for comprehensive testing of individual components and the entire application. Join the workshops to learn more about full circle testing with Cypress.
Desarrollo Efectivo de Pruebas
TestJS Summit 2021TestJS Summit 2021
31 min
Desarrollo Efectivo de Pruebas
Top Content
This Talk introduces Test Effective Development, a new approach to testing that aims to make companies more cost-effective. The speaker shares their personal journey of improving code quality and reducing bugs through smarter testing strategies. They discuss the importance of finding a balance between testing confidence and efficiency and introduce the concepts of isolated and integrated testing. The speaker also suggests different testing strategies based on the size of the application and emphasizes the need to choose cost-effective testing approaches based on the specific project requirements.
Playwright Test Runner
TestJS Summit 2021TestJS Summit 2021
25 min
Playwright Test Runner
Top Content
The Playwright Test Runner is a cross-browser web testing framework that allows you to write tests using just a few lines of code. It supports features like parallel test execution, device emulation, and different reporters for customized output. Code-Gen is a new feature that generates code to interact with web pages. Playwright Tracing provides a powerful tool for debugging and analyzing test actions, with the ability to explore trace files using TraceViewer. Overall, Playwright Test offers installation, test authoring, debugging, and post-mortem debugging capabilities.
Cómo Bun Hace que Construir Aplicaciones React Sea Más Simple y Rápido
React Day Berlin 2022React Day Berlin 2022
9 min
Cómo Bun Hace que Construir Aplicaciones React Sea Más Simple y Rápido
Top Content
BUN is a modern all-in-one JavaScript runtime environment that achieves new levels of performance. It includes BUN dev, a fast front-end dev server, BUN install, a speedy package manager, and BUN run, a fast package runner. BUN supports JSX, has optimized React server-side rendering, and offers hot module reloading on the server. The priorities for BUN include stability, node compatibility, documentation improvement, missing features in BUN install, AST plugin API, native Windows support, Bundler and Minifier optimization, and easier deployment to production. BUN's AST plugin API allows for bundle-time JavaScript execution and embedding code, potentially inspiring new frameworks.

Workshops on related topic

Diseñando Pruebas Efectivas con la Biblioteca de Pruebas de React
React Summit 2023React Summit 2023
151 min
Diseñando Pruebas Efectivas con la Biblioteca de Pruebas de React
Top Content
Featured Workshop
Josh Justice
Josh Justice
La Biblioteca de Pruebas de React es un gran marco para las pruebas de componentes de React porque responde muchas preguntas por ti, por lo que no necesitas preocuparte por esas preguntas. Pero eso no significa que las pruebas sean fáciles. Todavía hay muchas preguntas que tienes que resolver por ti mismo: ¿Cuántas pruebas de componentes debes escribir vs pruebas de extremo a extremo o pruebas de unidad de nivel inferior? ¿Cómo puedes probar una cierta línea de código que es difícil de probar? ¿Y qué se supone que debes hacer con esa persistente advertencia de act()?
En esta masterclass de tres horas, presentaremos la Biblioteca de Pruebas de React junto con un modelo mental de cómo pensar en el diseño de tus pruebas de componentes. Este modelo mental te ayudará a ver cómo probar cada bit de lógica, si debes o no simular dependencias, y ayudará a mejorar el diseño de tus componentes. Te irás con las herramientas, técnicas y principios que necesitas para implementar pruebas de componentes de bajo costo y alto valor.
Tabla de contenidos- Los diferentes tipos de pruebas de aplicaciones de React, y dónde encajan las pruebas de componentes- Un modelo mental para pensar en las entradas y salidas de los componentes que pruebas- Opciones para seleccionar elementos DOM para verificar e interactuar con ellos- El valor de los mocks y por qué no deben evitarse- Los desafíos con la asincronía en las pruebas de RTL y cómo manejarlos
Requisitos previos- Familiaridad con la construcción de aplicaciones con React- Experiencia básica escribiendo pruebas automatizadas con Jest u otro marco de pruebas unitarias- No necesitas ninguna experiencia con la Biblioteca de Pruebas de React- Configuración de la máquina: Node LTS, Yarn
Detox 101: Cómo escribir pruebas de extremo a extremo estables para su aplicación React Native
React Summit 2022React Summit 2022
117 min
Detox 101: Cómo escribir pruebas de extremo a extremo estables para su aplicación React Native
Top Content
Workshop
Yevheniia Hlovatska
Yevheniia Hlovatska
A diferencia de las pruebas unitarias, las pruebas de extremo a extremo buscan interactuar con su aplicación tal como lo haría un usuario real. Y como todos sabemos, puede ser bastante desafiante. Especialmente cuando hablamos de aplicaciones móviles.
Las pruebas dependen de muchas condiciones y se consideran lentas e inestables. Por otro lado, las pruebas de extremo a extremo pueden dar la mayor confianza de que su aplicación está funcionando. Y si se hace correctamente, puede convertirse en una herramienta increíble para aumentar la velocidad del desarrollador.
Detox es un marco de pruebas de extremo a extremo en caja gris para aplicaciones móviles. Desarrollado por Wix para resolver el problema de la lentitud e inestabilidad y utilizado por React Native en sí como su herramienta de pruebas E2E.
Únete a mí en esta masterclass para aprender cómo hacer que tus pruebas de extremo a extremo móviles con Detox sean excelentes.
Prerrequisitos- iOS/Android: MacOS Catalina o más reciente- Solo Android: Linux- Instalar antes de la masterclass
Masterclass de Pruebas de API con Postman
TestJS Summit 2023TestJS Summit 2023
48 min
Masterclass de Pruebas de API con Postman
Top Content
WorkshopFree
Pooja Mistry
Pooja Mistry
En el panorama siempre en evolución del desarrollo de software, garantizar la fiabilidad y funcionalidad de las API se ha vuelto primordial. "Pruebas de API con Postman" es una masterclass completa diseñada para equipar a los participantes con los conocimientos y habilidades necesarios para sobresalir en las pruebas de API utilizando Postman, una herramienta poderosa ampliamente adoptada por profesionales en el campo. Esta masterclass profundiza en los fundamentos de las pruebas de API, avanza a técnicas de prueba avanzadas y explora la automatización, las pruebas de rendimiento y el soporte multiprotocolo, proporcionando a los asistentes una comprensión holística de las pruebas de API con Postman.
Únete a nosotros para esta masterclass para desbloquear todo el potencial de Postman para las pruebas de API, agilizar tus procesos de prueba y mejorar la calidad y fiabilidad de tu software. Ya seas un principiante o un probador experimentado, esta masterclass te equipará con las habilidades necesarias para sobresalir en las pruebas de API con Postman.
Monitoreo 101 para Desarrolladores de React
React Summit US 2023React Summit US 2023
107 min
Monitoreo 101 para Desarrolladores de React
Top Content
WorkshopFree
Lazar Nikolov
Sarah Guthals
2 authors
Si encontrar errores en tu proyecto frontend es como buscar una aguja en un pajar de código, entonces el monitoreo de errores de Sentry puede ser tu detector de metales. Aprende los conceptos básicos del monitoreo de errores con Sentry. Ya sea que estés ejecutando un proyecto de React, Angular, Vue, o simplemente JavaScript “vainilla”, mira cómo Sentry puede ayudarte a encontrar el quién, qué, cuándo y dónde detrás de los errores en tu proyecto frontend.
Nivel de la masterclass: Intermedio
Testing Web Applications Using Cypress
TestJS Summit - January, 2021TestJS Summit - January, 2021
173 min
Testing Web Applications Using Cypress
Top Content
Workshop
Gleb Bahmutov
Gleb Bahmutov
Esta masterclass te enseñará los conceptos básicos para escribir pruebas end-to-end útiles utilizando Cypress Test Runner.
Cubriremos la escritura de pruebas, cubriendo cada característica de la aplicación, estructurando pruebas, interceptando solicitudes de red y configurando los datos del backend.
Cualquiera que conozca el lenguaje de programación JavaScript y tenga NPM instalado podrá seguir adelante.
Mejores Prácticas para Escribir y Depurar Pruebas de Cypress
TestJS Summit 2023TestJS Summit 2023
148 min
Mejores Prácticas para Escribir y Depurar Pruebas de Cypress
Top Content
Workshop
Filip Hric
Filip Hric
Probablemente conozcas la historia. Has creado un par de pruebas y, como estás utilizando Cypress, lo has hecho bastante rápido. Parece que nada te detiene, pero luego - prueba fallida. No fue la aplicación, no fue un error, la prueba fue... ¿inestable? Bueno sí. El diseño de la prueba es importante sin importar la herramienta que utilices, incluyendo Cypress. La buena noticia es que Cypress tiene un par de herramientas bajo su cinturón que pueden ayudarte. Únete a mí en mi masterclass, donde te guiaré lejos del valle de los anti-patrones hacia los campos de pruebas estables y siempre verdes. Hablaremos sobre los errores comunes al escribir tu prueba, así como depurar y revelar problemas subyacentes. Todo con el objetivo de evitar la inestabilidad y diseñar pruebas estables.