Introducción a Testing🧪en React⚛️
Jest + React Testing Library + Puppeteer



Qué vamos a ver?
1 - Qué es testing y por qué deberíamos hacerlo?
2 - Tipos de tests
3 - Qué es Jest y RTL y Puppeteer
4 - Setup para una App React usando create-react-app
5 - Cómo escribir un test
6 - Queries, matchers y otros
7 - Mockeo
8 - E2E
Qué es testing (y qué no es)
Por qué deberíamos hacerlo?
-
Una herramienta para prevenir bugs durante el desarrollo y no después
-
Asegurar el funcionamiento apropiado de funciones, componentes y flujos en nuestra app
-
Una manera de evitar romper código ya funcional sin darnos cuenta al modificar algo en ése u otro componente relacionado
-
Una manera de evitar salir a producción con un código defectuoso sin darnos cuenta y que el usuario se entere al toparse con el problema
✔️ Testing es:
Qué es testing (y qué no es)
Por qué deberíamos hacerlo?
❌ Testing no es:
-
Una garantía absoluta ni un seguro infalible
-
Una tarea automática
-
Un reemplazo de QA
-
Responsabilidad únicamente de QA
-
Solo una manera de "encontrar bugs" y arreglarlos en post
Testing es una manera de darnos confianza en el código que escribimos
Tipos de tests y para qué sirve cada uno

Imagen - Kent C. Dodds - TestingJavascript.com
🏃 Rápidos
💵 Baratos
🙂 Simples
🦥 Lento
💸 Caro
🤔 Complejo
Tipos de tests y para qué sirve cada uno

Imagen - Kent C. Dodds - TestingJavascript.com
Typescript, linters, formateadores
Partes pequeñas e independientes, funciones, componentes aislados
Módulos que usan esas partes pequeñas.
Validar que funcionen bien entre sí.
Emular cómo el usuario usará la aplicación. Validar flujos
🦥 Lento
💸 Caro
🤔 Complejo
🏃 Rápidos
💵 Baratos
🙂 Simples
💯Qué es el code coverage?💯
Una manera de ver de forma "analítica" la cobertura de nuestros tests sobre la totalidad de nuestros programas

Qué es Jest, React testing library y Puppeteer
Corre los tests
Da resultados
Lógica de tests
Condiciones
Simula interacciones de usuario en el navegador

Chai

Cypress

Jasmine

Mocha

Puppeteer

Jest

Jest
Test Runner
Lib Aserciones
Headless Browser
Qué es Jest, React testing library y Puppeteer
Test Runner
Lib Aserciones
Headless Browser
Corre los tests
Da resultados
Lógica de tests
Condiciones
Simula interacciones de usuario en el navegador

Puppeteer

Jest

Jest
Qué es Jest, React testing library y Puppeteer
Librería de Queries

Selectores
Interacciones
Utilidades

Setup para una app React con CRA

✔️ Jest
✔️ React Testing Library
✔️ User Event
✔️ Script para ejecutar
Que viene con CRA?
Setup para una app React con CRA
➕ jest-environment-jsdom-sixteen
➕ jest-runner-groups: 1.1.0,
➕ puppeteer: ^3.0.4,
Que hace falta agregar?

Setup para una app React con CRA
Scripts! 📜📜📜

Setup para una app React con CRA
setupTests.js 💻

Sintaxis de un Test

Grupo de test
Imports (componente, libs)
Test
Sintaxis de un Test

Renderizo componente
Hago una selección
Hago una aserción sobre mi selección
Test Suites

Es una colección de tests que juntos prueban una funcionalidad más grande
Skip y Only


💡Ambos son aplicables también a los bloques "describe"💡
Pautas para escribir buenos tests
-
Analizar previo a escribir el test qué es lo que quiero testear
-
Definir objetivos y funcionalidades claras.
-
Escribir el test para que falle y corregir.
Definir listado de tests previo a comenzar
Tener claro qué es lo que quiero que pase y que no pase
Ya escribí mi primer test.
Donde lo guardo?

-
Respetar estructura de carpetas
-
Archivo .spec o .test
-
Jest busca todas las carpetas con estructura __tests__ por default
-
Puedo configurar otra sintaxis de ser requerido
-
Puedo configurar formatos de archivo de ser requerido
Queries y Matchers


Accesibilidad y Testing

Los tests se deberían acercar lo más posible a cómo van a interactuar lxs usuarixs con el sitio
Si no puedo seleccionar algún elemento con alguno de éstos queries, básicamente mi aplicación no es accesible por lo que debería realizar alguna modificación.
Como último recurso están los test IDs pero son elementos no-interactivos ni captados por screen readers o herramientas de accesibilidad, es la última opción.
💡https://testing-library.com/docs/guide-which-query💡
Snapshot testing
Sirve para comparar cambios en el renderizado de un componente contra un "registro" de cómo se debería ver

Renderiza el componente virtualmente y guarda una copia de texto.
Al ejecutar un nuevo test hace un diff entre ambos y si hay algún cambio marca el error.
Es importante no depender únicamente de éste tipo de tests. Es una herramienta más. (Pero es mejor que nada)
Simulando Acciones de usuario
🖱️🖱️ La utilidad de la Testing Library, userEvent nos permite simular eventos de manera mucho más cercana a cómo el usuario 🖱️🖱️

Nos permite elegir inputs:
- click
- dblClick
- async type
- upload
- clear
- selectOptions
- tab
💡 Es un replanteo de la opción "nativa" de TL que es fireEvent. UserEvent simula de manera mucho más acertada las acciones 💡

Rerender nos permite actualizar props de un componente desestructurando la función al renderizar
💡 RTL nos brinda utilidades para el testeo asincrónico que son porteos directos @testing-library/dom 💡
Testeo de eventos asincrónicos ↪️/ actualización de props en un componente
Testeo de eventos asincrónicos ↪️/ actualización de props en un componente

Act nos permite simular como react registra cambios en componente y esperar a que se hayan hecho las modificaciones de estado asincrónicas antes de continuar
No está limitado a re-renderizado de componentes, también se usa para realizar eventos y acciones que disparen un cambio asincrónico en el componente
💡 RTL nos brinda utilidades para el testeo asincrónico que son porteos directos @testing-library/dom 💡
👻 Mockeo de Funciones y librerías 👻
Jest nos permite mockear liberías y funciones internas (por ej "fs" de node) y externas ("react-redux", "react-router-dom")para agilizar los tests y que sean más robustos.💪
Nos permite tener control de la entrada y salida de data haciendo que un componente no dependa de algo externo para poder ser testeado.

E2E con Puppeteer

Todo es contenido asincrónico de pedidos ida-vuelta entre puppeteer y la instancia de chromium manejado con async/await
Puppeteer tiene su propia API con selectores basados en querySelector del navegador
💡Hay una extensión de la Testing Library para puppeteer: pptr-testing-library💡
Utilidades globales de Jest
beforeAll, afterAll, beforeEach y afterEach
Jest cuenta con utilidades globales que nos permiten ejecutar código repetitivo en nuestras Test Suites
💡Éstas utilidades tienen scope de bloque, por lo que importa el posicionamiento de las mismas dentro/fuera de los bloques describe💡


Referencias y bibliografía 📚
Recursos y Herramientas📚

Introducción a Testing en ReactIntroducción a Testing en React
By guido732
Introducción a Testing en ReactIntroducción a Testing en React
Charla introductoria a setup y testing con React usando Jest + React Testing Library + Puppeteer
- 715