Probando React Hooks con Confianza

Rate this content
Bookmark

La charla se presentará como una historia de refactorización: comenzará desde el componente desordenado e inprobable, lo cubrirá con una prueba de humo frágil y luego mostrará cómo mover toda la lógica del componente React a un hook personalizado y probar este hook. Se presentarán patrones para probar cosas como useState, efectos y Apollo.

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

FAQ

Radoslav Stankov es el jefe de ingeniería en Product Hunt y actualmente reside en Bulgaria.

Las presentaciones de Radoslav Stankov están vinculadas en una página en línea donde puedes revisar todas las diapositivas y el código presentado.

El tema principal de la charla es sobre la prueba de hooks con confianza, enfocándose en cómo automatizar la prueba sin adentrarse en el desarrollo impulsado por pruebas.

Radoslav sugiere comenzar con pruebas simples, usar la biblioteca de pruebas de React, y considerar la refactorización y extracción de hooks personalizados para simplificar la lógica y facilitar las pruebas.

Se puede usar una biblioteca de pruebas de React hooks para configurar y probar las funcionalidades del hook, como la acción de agregar, asegurando que los valores se actualicen correctamente.

Radoslav ha dejado de hacer pruebas unitarias de React frecuentemente, enfocándose más en probar la lógica de los hooks y utilizando pruebas de extremo a extremo para asegurar el funcionamiento de los flujos de trabajo completos.

Para las pruebas de extremo a extremo, Radoslav utiliza herramientas como Cypress o Capybara, las cuales permiten probar flujos de trabajo completos y son efectivas para identificar errores más complejos.

Radoslav Stankov
Radoslav Stankov
7 min
15 Jun, 2021

Comments

Sign in or register to post your comment.
Video Summary and Transcription
La charla trata sobre la prueba de hooks en una aplicación de React. El orador comienza mostrando una aplicación de React no probada y comienza a probarla con una prueba de marcador de posición simple. Se enfatiza la importancia de refactorizar y probar hooks personalizados, con la recomendación de usar la biblioteca de hooks de React y lograr una cobertura de prueba completa. Las pruebas unitarias de los componentes de React pueden no ser valiosas, ya que la complejidad radica en el código del hook. En su lugar, se recomienda realizar pruebas de extremo a extremo con herramientas como Cypress.

1. Introducción a la Prueba de Hooks

Short description:

Hola a todos. Mi nombre es Radoslav Stankov. Hoy vamos a hablar sobre la prueba de hooks con confianza. Voy a mostrarles esta aplicación de React sin probar. Podemos comenzar con una prueba simple y pequeña. Esta es solo una prueba de marcador de posición para asegurarnos de que cuando refactorizamos, no rompamos algo.

Hola a todos. Mi nombre es Radoslav Stankov. Pueden encontrarme en línea aquí. Soy el jefe de ingeniería en Product Hunt y actualmente me encuentro en Bulgaria. Si quieren ver mis presentaciones, están aquí. Todas las diapositivas y el código están vinculados a esta página para que puedan revisarlos más tarde.

Hoy vamos a hablar sobre la prueba de hooks con confianza. Existe una gran división entre el desarrollo impulsado por pruebas y la prueba automatizada, como podrán ver durante esta presentación. En mi charla, solo mencionaré cómo automatizar la prueba. No me adentraré en el desarrollo impulsado por pruebas y cosas relacionadas. Nuevamente, las palabras son baratas y no tengo muchas, así que les mostraré algo de código.

Les voy a mostrar esta aplicación de React sin probar. Es solo una pequeña aplicación de calculadora. Este es el código de la aplicación. Si se fijan, hay mucho código. Es una aplicación bastante simple, pero hay mucho código. ¿Cómo lo probamos? ¿Cómo sabemos que funciona? Podemos comenzar con una prueba simple y pequeña. Para la prueba pequeña, podemos agregar esos atributos de datos de prueba, para que podamos seleccionar los elementos, podemos usar la biblioteca de pruebas de React y podemos crear esta prueba simple y pequeña donde obtenemos la biblioteca de pruebas de React. Por lo general, cuando hago pruebas, me gusta tener esos ayudantes porque en general odio escribir cinco funciones una tras otra. Así que simplemente digo, ok, haz clic en este ID de datos. Y para mi prueba, este es otro pequeño truco que hago si necesito cambiar el nombre del componente y quiero volver y cambiar el nombre de la prueba. Así que aquí acabo de crear una prueba simple y pequeña. Simplemente funciona. Así que solo estoy probando, ceros vacíos, haciendo clic en más uno, uno, más dos, eliminar dos, evaluar y reiniciar. Básicamente, asegurándome de que este componente funcione. Esto es algo que haría normalmente para probar si las cosas funcionan manualmente. Esta es solo una prueba de marcador de posición. No es una prueba realmente buena. Como, la voy a eliminar al final, pero esto me asegura de que cuando refactorizo, no rompo algo. No es una prueba muy buena porque no sigue las cuatro fases de una buena prueba.

2. Refactorización y Prueba de Hooks Personalizados

Short description:

Entonces, ¿por dónde deberíamos empezar ahora? Lo primero que podemos hacer es limpiar el código a través de la refactorización. Podemos extraer la lógica grande y pesada en un hook simple y probarlo usando la biblioteca de hooks de React. Después de una prueba exhaustiva, podemos refactorizar el hook para usar useReducer y lograr una cobertura de prueba completa. Las pruebas unitarias de los componentes de React pueden no ser valiosas, ya que la complejidad radica en el código del hook. En su lugar, se recomienda realizar pruebas de extremo a extremo con herramientas como Cypress.

Entonces, ¿por dónde deberíamos empezar ahora? Lo primero que podemos hacer es limpiar el código. Lo que podemos hacer es una refactorización. Me gusta llamarlo extracción de hooks personalizados. Esta es una de mis características favoritas de los hooks, que es que puedes realmente arrancar hooks desde otros hooks y crear estas interfaces muy agradables.

Así que aquí toda esta lógica grande y pesada puede ser extraída en un simple hook, y este hook puede darte, ok, esto es lo que se guarda en la memoria de la calculadora y cuáles son las acciones. Y nuevamente, el código del hook es simplemente copiar y pegar, funciona. Entonces, ¿cómo vamos a probar este hook personalizado? Este es el siguiente paso que debemos hacer.

Para testing este hook personalizado, existe esta buena biblioteca llamada biblioteca de pruebas de React hooks, que te permite probar fácilmente el hook y lo que me gusta hacer es tener una función llamada emit hook, que básicamente oculta la configuración de boilerplate del hook. Y por ejemplo, quiero probar la acción de agregar. Entonces, para la acción de agregar, simplemente configuramos el hook, agregamos un valor y verificamos que después de que se recargue el hook, hemos actualizado nuestro valor y podemos básicamente probar, ok, si tengo dos dígitos, se suman, y puedes hacer todas las pruebas para eso, para eliminar es muy similar. Configuras el hook, simplemente lo llamas, tienes esta bonita función de llamada donde encapsulas esto y tienes todo esto. Y nuevamente, es un poco largo y te proporcionaré el enlace a las diapositivas al final para que puedas profundizar más.

Y ahora que tenemos esta prueba, que prueba muy a fondo nuestro hook con todos sus casos límite, con todas sus soluciones, podemos comenzar a refactorizar este hook. Lo que vamos a terminar al final de este gran montón de código es básicamente refactorizar este hook para usar solo un simple useReducer donde decimos, ok, tenemos una función reductora y al final tenemos las mismas acciones: agregar, eliminar, reiniciar, evaluar. Y esto es nuevamente el alcance del reductor. Es un poco más complejo. Es un poco más dividido, pero esto realmente prueba nuestra calculadora y realmente tenemos una cobertura de prueba completa. Y nuevamente, el código de esta presentación está en esta dirección para que puedas hacer clic y ver los detalles. Lo he dividido en pasos para que puedas ver todos los pasos de refactorización. Y un par de notas finales que quiero mencionar aquí es que al final, en realidad elimino todo ese código de la prueba de humo. No lo necesito. Lo que he encontrado en la práctica es que generalmente, cuando escribo componentes de React, son o muy simples, como obtienen algunos data y renderizan cosas, por lo que no hay mucho valor agregado en probarlos como una prueba unitaria. O la mayor lógica y la mayor parte de mis pruebas está en el código del hook. Por lo general, ese es el lugar donde se encuentra gran parte de la complejidad de mi sistema. Así que generalmente dejé de hacer pruebas unitarias de React. Y lo que intento hacer a nivel de pruebas unitarias es simplemente probar la función simple, como por ejemplo, podría probar solo el reductor, puedo probar solo el hook por sí mismo y no probar los componentes de React. La forma en que estoy seguro de que los componentes de React funcionan es a través de pruebas de extremo a extremo con algo como Cypress o algo como Capybara, que prueba realmente todo mi flujo de trabajo porque rara vez he encontrado errores en mi sistema que se refieran solo al componente de React en sí. Por lo general, los errores provienen de hooks muy complejos o cuando tenemos componentes de clase. Así que sí, eso es básicamente lo que quería compartir con ustedes hoy. Gracias por acompañarme.

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

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.
El Arte de las 'Vistas Humildes': Probando Aplicaciones React Native de Manera Inteligente
TestJS Summit 2023TestJS Summit 2023
32 min
El Arte de las 'Vistas Humildes': Probando Aplicaciones React Native de Manera Inteligente
This Talk discusses the challenges of testing in React and React Native applications, particularly with regards to barcode scanning. It explores the violation of separation of concerns in React and proposes the use of the HumbleObject model to simplify testing and improve code cleanliness. The MVP model is also introduced as a way to separate UI state and logic from the component. The importance of following patterns, standardization, and teaching principles is emphasized, along with the benefits of using custom hooks to share business logic. The potential of AI tools in code refactoring is mentioned as well.
Quizá No Necesitemos Pruebas de Componentes
Vue.js Live 2024Vue.js Live 2024
26 min
Quizá No Necesitemos Pruebas de Componentes
Component testing is a gray area between integration and unit testing. The demo app focuses on the cart component and writing test cases for Playwright component test and VTest. The first cart test encounters a bug with the invisible method in View Test.
Pruebas de Componentes con Vitest
TestJS Summit 2023TestJS Summit 2023
29 min
Pruebas de Componentes con Vitest
This Talk explores the challenges of choosing and learning testing frameworks, emphasizing the importance of planning, automation, and prioritizing unit testing. The VTEST framework is introduced as a fast and stable option for unit testing JavaScript and TypeScript code, with a focus on logic and mocking external dependencies. The Talk also covers testing React hooks, integration testing with TestingLibraryReact, component testing, and achieving code coverage. Best practices include performing accessibility tests, planning tests before coding, and using data test IDs for stability.
¡Es una trampa! - Trampas comunes en las pruebas y cómo solucionarlas
TestJS Summit 2021TestJS Summit 2021
20 min
¡Es una trampa! - Trampas comunes en las pruebas y cómo solucionarlas
This Talk explores the pain points and best practices in software testing, emphasizing the importance of simplicity and comprehensibility in test design. It discusses techniques such as the three-part rule for test titles, the triple-A pattern for test structure, and the use of clear and descriptive names in tests. The Talk also highlights the traps of testing implementation details and using fixed waiting times. The speaker encourages teamwork and learning from experience to improve testing practices.
Cómo detectar defectos de accesibilidad durante las pruebas unitarias y E2E
TestJS Summit 2021TestJS Summit 2021
7 min
Cómo detectar defectos de accesibilidad durante las pruebas unitarias y E2E
This Talk provides ways to catch accessibility defects during testing, including adding accessibility testing to a website for Studio Ghibli using React, NX, Jazz, JazzX, Cypress, and CypressX. The importance of unitizing components and conducting end-to-end testing with Cypress and CypressX is emphasized to ensure accessibility. The process of setting up CypressX testing is explained, highlighting the use of typings and the CypressX support file. These tools make it easier for developers to avoid accessibility bugs during development.

Workshops on related topic

Aprende a utilizar Composables: La navaja suiza de los desarrolladores de Vue
Vue.js Live 2024Vue.js Live 2024
163 min
Aprende a utilizar Composables: La navaja suiza de los desarrolladores de Vue
Workshop
Juan Andrés Núñez Charro
Juan Andrés Núñez Charro
Los Composables (funciones de composición) son funciones con estado/sin estado que pueden aprovechar la API de reactividad de Vue, desacoplándola de los componentes.Este cambio de perspectiva abre la posibilidad de abordar escenarios comunes de una manera nueva y creativa. En este masterclass, aprenderás cómo resolver problemas típicos que enfrenta cada desarrollador de Vue, utilizando composables:
- Almacenamiento de datos;- Comunicación entre componentes;- Funciones de utilidad (DOM, API, etc);Y más.
Introducción a React Native Testing Library
React Advanced 2022React Advanced 2022
131 min
Introducción a React Native Testing Library
Workshop
Josh Justice
Josh Justice
¿Estás satisfecho con tus suites de pruebas? Si dijiste que no, no estás solo, la mayoría de los desarrolladores no lo están. Y hacer pruebas en React Native es más difícil que en la mayoría de las plataformas. ¿Cómo puedes escribir pruebas en JavaScript cuando el código JS y nativo están tan entrelazados? ¿Y qué diablos se supone que debes hacer con esa persistente advertencia de act()? Ante estos desafíos, algunos equipos nunca logran avanzar en las pruebas de su aplicación de React Native, y otros terminan con pruebas que no parecen ayudar y solo requieren tiempo adicional para mantener.
Pero no tiene que ser así. React Native Testing Library (RNTL) es una excelente biblioteca para pruebas de componentes, y con el modelo mental adecuado puedes usarla para implementar pruebas de bajo costo y alto valor. En este taller de tres horas aprenderás las herramientas, técnicas y principios que necesitas para implementar pruebas que te ayudarán a lanzar tu aplicación de React Native con confianza. Saldrás con una visión clara del objetivo de tus pruebas de componentes y con técnicas que te ayudarán a superar cualquier obstáculo que se interponga en ese objetivo.aprenderás:- Los diferentes tipos de pruebas en React Native, 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 de texto, imagen y código nativo para verificar e interactuar con ellos- El valor de las simulaciones y por qué no se deben evitar- Los desafíos con la asincronía en las pruebas de RNTL y cómo manejarlos- Opciones para manejar funciones y componentes nativos en tus pruebas de JavaScript
Requisitos previos:- Familiaridad con la construcción de aplicaciones con React Native- Experiencia básica en la escritura de pruebas automatizadas con Jest u otro framework de pruebas unitarias- No necesitas experiencia previa con React Native Testing Library- Configuración de la máquina: Node 16.x o 18.x, Yarn, ser capaz de crear y ejecutar con éxito una nueva aplicación Expo siguiendo las instrucciones en https://docs.expo.dev/get-started/create-a-new-app/