Más allá de React Testing Library: Probando bibliotecas de React (y código similar a bibliotecas)

Rate this content
Bookmark

Cuando se trata de probar el código de la biblioteca, el enfoque (¡generalmente asombroso!) de "Testing Library" rápidamente alcanza sus limitaciones: A menudo necesitamos probar rutas de código críticas para garantizar garantías adicionales, como un orden específico de cambios en el DOM o un número particular de renders.
Tan pronto como comenzamos a agregar Suspense a la imagen, incluso se vuelve casi filosófico:
¿Cómo contamos un render que se suspendió inmediatamente y cómo lo distinguimos de un render "comprometido"?
¿Cómo sabemos qué partes del árbol de Componentes se volvieron a renderizar?
En la base de código de Apollo Client, estamos utilizando el React Profiler para crear un flujo de eventos de render, lo que nos permite cambiar a un nuevo método de prueba basado en flujos.
Después de probar este enfoque internamente durante un año, lo hemos lanzado en una biblioteca que queremos presentar al mundo.
También miraré brevemente otros problemas "relacionados con las pruebas" muy fuera de lo común que hemos encontrado y compartiré nuestras soluciones:
Cómo probar bibliotecas que agrupan diferentes códigos para React Server Components, ejecuciones de SSR en streaming y el Navegador: Probando tus campos de `exports` cada vez más complejos y asegurando que todos esos entornos exporten la forma del paquete que esperas.
Incluso miraremos brevemente la renderización de componentes de React en diferentes entornos para probarlos de forma aislada, ya sea en Server Components, SSR en streaming o simulando la hidratación de flujos en el Navegador.

This talk has been presented at React Day Berlin 2024, check out the latest edition of this React Conference.

Lenz Weber-Tronic
Lenz Weber-Tronic
22 min
16 Dec, 2024

Comments

Sign in or register to post your comment.
Video Summary and Transcription
Mi charla se llama Más allá de Testing Library, Probando bibliotecas de React o código similar a bibliotecas. Queremos optimizar el código minimizando los re-renders, evitando el tearing y asegurando una renderización granular. React Testing Library puede no ser siempre la herramienta adecuada para bibliotecas o código similar a bibliotecas. Probamos para obtener resultados sincrónicos, pero hay casos donde pueden ocurrir re-renders no deseados e inconsistencias. Necesitamos evitar pruebas inestables y la propagación de errores. La nueva biblioteca Testing Library React Render Stream simplifica las pruebas al reemplazar envoltorios y afirmaciones complejas. Probamos múltiples componentes independientes y aseguramos la re-renderización correcta. Introducimos Suspense y la captura de instantáneas del DOM para probar la renderización granular. La prueba final proporciona una mayor confianza y cumple con todos los requisitos especiales.

1. Introduction to Beyond Testing Library

Short description:

Mi charla se llama Beyond Testing Library, Testing React Libraries or Library-like Code. Quiero optimizar el código minimizando los re-renders, evitando el tearing y asegurando un renderizado granular. React Testing Library puede no ser siempre la herramienta adecuada para bibliotecas o código similar a bibliotecas. Para dicho código, necesitamos considerar requisitos especiales. Echemos un vistazo a probar el hook useQuery en Apollo Client, articleQuery o reactQuery usando React Testing Library.

Hola a todos. Mi nombre es Lenz. Mi charla se llama Beyond Testing Library, Testing React Libraries or Library-like Code. Una breve palabra sobre mí. Mi nombre es Lenz Wiebertronik. Trabajo como Ingeniero de Software Senior en Apollo GraphQL. Y allí mantengo el cliente Apollo para la web. Pero en mi tiempo libre, también mantengo Redax Toolkit. Soy el autor de RTK Query. Y debido a mi TDAH, en realidad mantengo un montón de bibliotecas más pequeñas también. Puedes encontrarme en GitHub como FryNias, en Twitter como Fry, y no en la diapositiva, pero como Fry.dev en BlueSky.

En general, ¿por qué estamos aquí? Es un poco difícil porque me encanta testing library. Creo que es increíble. Pero no siempre es la herramienta adecuada para mí como autor de bibliotecas porque React Testing Library prueba para consistencia eventual. Y en testing library, puede que no siempre quiera buscar eso porque las bibliotecas son un camino de código caliente y necesitamos optimizar para eso. Así que para las bibliotecas que escribo y tal vez también las bibliotecas que escribes, ya sea de código abierto o como una biblioteca interna compartida por múltiples equipos, o simplemente código similar a bibliotecas, podríamos tener algunos requisitos especiales que no son algo que normalmente probarías con React Testing Library. Entonces, ¿cuáles son estos? Bueno, primero, quiero asegurarme de que mi código no cause más re-renders de los absolutamente necesarios porque este es como el código que está en medio de todo. Quieres tener eso optimizado antes de comenzar a optimizar tu propio código. Así que hacemos nuestro mejor esfuerzo aquí.

Más allá del tema de los re-renders, otra cosa importante es el tearing. Eso significa que no queremos mezclar datos del presente con datos que podrían estar en la pantalla en el futuro o en el pasado. Así que dentro de un hook, eso podría significar que devolvemos un estado inconsistente. Dentro de un componente significaría que dos hooks podrían devolver un estado inconsistente entre sí. Y en toda tu aplicación, podría significar que un componente aquí muestra estado del futuro mientras que otro componente aquí abajo muestra estado del pasado. Y luego está la tercera cosa que quiero optimizar, que es el renderizado extremadamente granular. Solo quiero que el componente que es absolutamente necesario vuelva a renderizarse, y no sus padres o sus abuelos. Dicho esto, si tuviera un hook como useQuery en Apollo Client, articleQuery o reactQuery, ¿cómo lo probaría? Veamos un ejemplo con React Testing Library primero, y creo que esta es una prueba muy común, creo. Aquí, comenzaríamos a renderizar nuestro hook useQuery, y luego comenzaríamos a hacer afirmaciones sobre eso. Así que primero probaríamos este caso a la izquierda, loading debería ser true y data debería ser undefined. Y luego probamos este caso a la derecha, donde loading es false, pero data es hello world.

2. Testing for Synchronous Results

Short description:

Probamos cosas sincrónicas, pero hay casos donde otros factores podrían causar resultados positivos que queremos evitar. Por ejemplo, las llamadas a setState o usingExternalStore pueden causar re-renders no deseados. También hay casos de tearing donde loading es true pero data ya tiene el resultado final. Estas inconsistencias pueden llevar a que se muestren valores incorrectos.

La forma en que hacemos eso aquí es que probamos las cosas que se pueden probar sincrónicamente, y luego esperamos hasta que loading sea false, y luego probamos que data sea igual a hello world. Pero, por supuesto, este es el camino feliz, esta prueba siempre será positiva, pero otras cosas también podrían ser positivas y podríamos querer evitarlas. Así que veamos este caso, y ese es un caso muy común donde podríamos tener otra llamada a setState dentro de nuestro hook que realmente no se relaciona con la salida del hook, pero causa un re-render. Otro ejemplo sería una llamada a usingExternalStore que hace lo mismo. Queremos evitar eso, pero con este tipo de prueba, realmente no tenemos forma de determinar si fue el caso. Algo más sería un caso de tearing donde loading aún sería true, pero data también ya alcanzaría el resultado final. Así que aquí tenemos un valor de retorno inconsistente, y la forma en que probamos eso, simplemente se mantiene positivo porque solo probamos que loading sea false, y mientras tanto, data podría tomar cualquier valor. Eso podría incluso ir más allá, y loading también podría tomar un valor diferente. Así que en este caso, solo un montón de cachorros. Y data podría tener un valor completamente no relacionado, y no podríamos detectar eso con esta prueba o con la mayoría de las otras pruebas también.

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

Pruebas de Componentes con Cypress vs Biblioteca de Pruebas de React
TestJS Summit 2023TestJS Summit 2023
25 min
Pruebas de Componentes con Cypress vs Biblioteca de Pruebas de React
The Talk discusses the differences between Cypress component testing and React Testing Library (RTL). It highlights the benefits of using Cypress Component Testing, such as easier handling of complex components and a more stable testing experience in CI. The comparison between SignOn and Jest focuses on low-level spying and mocking capabilities. The comparison between Cypress Intercept and Mock Service Worker (MSW) examines their network spy and mocking capabilities. The Talk also emphasizes the superior developer experience and observability provided by Cypress component testing compared to RTL.

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