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