Prueba de su aplicación React Native (Parte 1)

Publicado el

(21 de diciembre de 2020)

Introducción

La mayoría de los desarrolladores encuentran las pruebas aburridas y difíciles de escribir, pero ¿sabes qué? Se necesita una gran habilidad y experiencia para saber cómo escribir pruebas significativas y fáciles de mantener. El conocimiento que obtenga al aprender a probar su código también cambiará la forma en que escribe el código en desarrollo. Este artículo debería ayudarlo a comenzar su viaje de pruebas.

Pautas para mejores pruebas

Estas son algunas de las pautas que aprendí después de investigar cómo otros desarrolladores prueban su código. Seguir estas pautas me facilitó la escritura y el mantenimiento de pruebas en todo el código.

1. No pruebes la implementación de tu código

Para entender por qué esto es importante, veamos un escenario. Suponga que escribió una función que toma n como entrada y genera el resultado de agregar el primer n números.

Supongamos que está probando getSumOfFirstN para n=2 afirmando que add se llama 2 times con los argumentos (0, 2) y (2, 1) respectivamente y la salida de getSumOfFirstN es 3.

Más tarde, descubrirá que hay una mejor manera de encontrar la suma de los primeros n números y reescriba el código anterior.

Tu prueba comenzará a fallar porque ya no estás llamando a add

Este fue un ejemplo sencillo, y eso es y puede parecer contrario a la intuición, pero he visto a muchos desarrolladores hacer exactamente este tipo de pruebas donde el error no es tan fácil de ver.

2. No permita que sus pruebas se conviertan en otra deuda tecnológica

Las pruebas son importantes, pero también debe entregar el código a las partes interesadas relevantes a tiempo. Si cada vez que escribe una nueva característica o modifica una existente, rompe sus viejos casos de prueba o termina gastando una cantidad significativa de su tiempo asignado en arreglar los viejos casos de prueba en lugar de crear las características requeridas, finalmente terminará eliminando todas las pruebas antiguas y el riesgo de que el proyecto falle en producción.

Seguir estas pautas debería ayudarlo a asegurarse de que sus pruebas sean fácilmente reparables o no se rompan en absoluto cuando cambie su base de código.

3. Cuando pruebe la IU, escriba pruebas de una manera que simule el comportamiento real del usuario.

Suponga que está probando si este botón se renderizó y funcionó como se esperaba o no, primero piense en cómo el usuario encontraría e interactuaría con este botón. Espero que vean el texto «Enviar» y luego lo presionen y eso es exactamente lo que simularíamos. En nuestro caso de prueba, primero buscaremos el texto «Enviar» y luego simularemos el evento «onPress» en él y luego afirmaremos lo que se suponía que debía hacer.

En algunos casos, puede que no sea así. fácil de identificar de forma única el componente al que desea apuntar, y en ese caso, puede usar testID prop, pero recuerde que no simulará el comportamiento completo del usuario si usa testID porque los usuarios no segmentan componentes según su testID.

¿Por qué es esto importante? ¿Por qué debemos intentar simular el comportamiento del usuario tanto como sea posible al probar la interfaz de usuario? Esto se debe a que, al final, será un humano el que interactuará con su interfaz de usuario y no una computadora, y si ve un «Hola» en su botón en lugar de un «Enviar», su caso de prueba debería fallar porque eso es algo que puede confundir al usuario final.

4. Las funciones puras son más fáciles de probar que las funciones impuras

Las funciones puras son funciones que siempre darán la misma salida para una entrada correspondiente, es decir, si una función pura bombea 2 para un 1 entonces siempre haría eso, mientras que las funciones impuras podrían bombear 2 en la primera llamada y luego bombear 5 en la segunda llamada.

Esto es útil para tenerlo en cuenta al escribir código. Las funciones impuras pueden volverse más fáciles de probar si el módulo que está introduciendo la «impureza» en tales funciones es burlable.

5.Use accesorios como entrada y aserciones en sus pruebas

Suponga que tiene un objeto de tipo empleado y tiene varias funciones operando en ellos, como una función para capitalizar el name, una función para verificar si el empleado es un adulto o no, etc.

Ahora, suponga que toma este objeto como entrada en todos sus casos de prueba.

Estos son sus datos ficticios o su «accesorio». En su primer caso de prueba que prueba si la función que escribe el nombre en mayúsculas está funcionando como se esperaba o no, usted afirma que su salida es igual a { ...employee, name: employee.name.toUpperCase() } y en su segundo caso de prueba, afirma si la función genera employee.age >= 18 o no, y así sucesivamente.

Es posible que se pregunte qué ventaja obtenemos al usar los dispositivos de esta manera. La respuesta es que se está facilitando la tarea de corregir rápidamente las pruebas en el futuro al escribir sus pruebas de esta manera.

Por ejemplo. ¿Qué pasa si queremos agregar otra propiedad maritalStatus en el objeto de empleado porque ahora todos nuestros empleados deben revelar su estado civil? Si en nuestro primer caso de prueba, afirmamos que la salida es igual a { name: "KARTIK", age: 25, sex: "Male", children: 0 } en lugar de { ...employee, name: employee.name.toUpperCase() }, nuestro caso de prueba se romperá. También se romperá si cambiamos el valor de name por otro. En otras palabras, nuestro caso de prueba no sería flexible en absoluto y, por lo tanto, tendría una mayor probabilidad de romperse debido a cambios no relacionados en el código base.

6. Escriba pruebas unitarias para componentes y funciones de utilidad

Estas son partes de su código que serán utilizadas por múltiples módulos. Por lo tanto, deben probarse para todas las posibles entradas / casos extremos porque no sabe cómo los otros módulos usarán estas funciones / componentes. Por lo tanto, estos no deberían tener ningún comportamiento inesperado.

7. Escribir pruebas de integración para pantallas

Es difícil escribir pruebas unitarias para pantallas porque, por lo general, estas dependen de una gran cantidad de componentes y otras bibliotecas de terceros como una tienda redux. Entonces, para escribir pruebas unitarias para pantallas, primero tendrá que simular todas estas dependencias, lo cual es mucho trabajo. Por eso es mejor escribir pruebas de integración en este caso.

7. Escriba pruebas E2E para probar código nativo

El código nativo no se ejecuta en un entorno de broma. Entonces, para probarlo, tendrá que usar una biblioteca como Detox.

8. Realice siempre pruebas de instantáneas para pantallas y componentes

Si realiza un cambio de estilo en un componente que está siendo utilizado por muchas otras pantallas / componentes, las pruebas de instantáneas fallarán hasta que actualice las instantáneas. Le ayudará a comprender qué otros módulos se vieron afectados por el cambio que realizó. Si está trabajando en equipo, realmente ayuda al revisor durante las revisiones de relaciones públicas a comprender qué módulos se vieron afectados por el cambio particular que realizó en el componente porque los cambios en las instantáneas de esos módulos se reflejan en su relaciones públicas.

Conclusión

Espero que este artículo le haya resultado útil y si lo que acaba de leer le confunde, no se preocupe. La segunda parte de esta serie será un tutorial sobre cómo configurar el entorno de prueba en React Native con ejemplos de código de pantallas de prueba, componentes y funciones, siguiendo las pautas que hemos establecido en esta primera parte.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *