¿Te has encontrado alguna vez con la necesidad de probar el mismo componente con diferentes valores de entrada y salida? ¿Te gustaría evitar la repetición y la complejidad de escribir un test por cada caso posible? Si la respuesta es sí, entonces este artículo es para ti.
El otro día me encontraba en una situación donde necesitaba hacer el testeo de un componente sencillo: básicamente era un widget que manejaba el estado de una subscripción, y dependiendo del tipo de estado que tuviera, se debía renderizar un chip con un color, representando el estado asociado. Para quienes no tengan contexto de qué es un chip, es un elemento gráfico que muestra información breve y concisa, como es nuestro caso para el estado de la subscripción. El color del chip es importante porque ayuda a transmitir el mensaje de forma visual y atractiva, y puede influir en la percepción y la acción del usuario.
Este fue el escenario que me hizo formular la siguiente pregunta:
¿Es posible crear tests parametrizados en Flutter?
A fin de cuentas, los tests parametrizados son una técnica que nos permite ejecutar el mismo test con diferentes valores de entrada y salida, evitando tener que escribir un test por caso, ahorrando así tiempo, esfuerzo y duplicidad de código, cubriendo todos los casos posibles con menos riesgo de error.
Por esta razón, la situación en la que me encontraba era ventajosa para aplicarlo: tenía un input (en este caso el estado), el cual iba a determinar el output esperado (el color de la etiqueta).
La respuesta rápida es sí, puedes hacer tests parametrizados, así que sigue leyendo para ver como lo aplicamos.
Si te encuentras utilizando una versión de Dart superior a la 3.0, entonces lo más rápido y eficaz podría ser añadir el paquete de parameterized test en tu proyecto, inspirado en la misma funcionalidad que los tests parametrizados de JUnit 5.
En cambio, si te encuentras utilizando una versión de Dart inferior a la 3.0, no ves necesario añadir un paquete extra a tu proyecto, o no ves necesario generar esta dependencia, te explico como hacerlo manualmente.
Para esta situación, nos vamos a apoyar en la simpleza de Dart para construir su paquete de testing. Aquí, la función test()
puede ser llamada desde cualquier punto, lo cual incluye un loop u otra llamada a dicha función. Esto nos permite crear tests parametrizados sin necesidad de un paquete externo, pero también tiene algunas limitaciones, como por ejemplo, que debemos definir manualmente el mapa de valores de entrada y salida.
Veamos un ejemplo sencillo donde, para un estado, esperamos un color:
group("status should retrieve a color correctly when is:", () {
var fromActualStatusToExpectedColor = {
"Subscribed": Color.green,
"Cancelled": Color.red,
"Expired": Color.orange,
"Pending": Color.grey,
}
fromActualStatusToExpectedColor.forEach((status, expectedColor) {
test("$status -> $expectedColor", () {
final subscriptionStatusTag = SubscriptionStatusTag(status)
expect(subscriptionStatusTag.color, expectedColor)
})
})
})
Este código, crea un grupo de tests con el nombre: status should retrieve a color correctly when is
. Dentro de dicho grupo, definimos el mapa que asociará cada valor de entrada (status), con el valor de salida esperado (expectedColor). A partir de aquí, se itera sobre el mapa y se crea un test para cada par de valores, usando el nombre del test como “$status -> $expectedColor”
.
En cada test, se crea una instancia del componente con el valor de entrada, y se comprueba que el color del componente, sea igual al valor de salida esperado.
Y, por si te lo estabas preguntando, si uno de los test falla, veremos en el output de failed tests el caso erróneo, sin tener que indagar en todo el grupo.
En este artículo, hemos visto cómo crear tests parametrizados en Flutter, una técnica que nos permite simplificar y optimizar el testeo de componentes, que dependen de un valor de entrada para generar un valor de salida. Hemos visto dos formas de hacerlo: usando un paquete externo inspirado en JUnit 5, o usando la propia función test()
de Dart. Ambas formas tienen sus pros y sus contras, y dependen de la versión de Dart que estemos usando y de nuestras preferencias personales. Los tests parametrizados nos ofrecen muchos beneficios, como mejorar la legibilidad, la mantenibilidad, la reutilización y la escalabilidad de nuestros tests.
Espero que os haya sido útil ¡Hora de probar!
¿Quieres más? te invitamos a suscribirte a nuestro boletín para avisarte cada vez que recopilemos contenido de calidad que compartir.
Si disfrutas leyendo nuestro blog, ¿imaginas lo divertido que sería trabajar con nosotros? ¿te gustaría?
Pero espera 🖐 que tenemos un conflicto interno. A nosotros las newsletter nos parecen 💩👎👹 Por eso hemos creado la LEAN LISTA, la primera lista zen, disfrutona y que suena a rock y reggaeton del sector de la programación. Todos hemos recibido newsletters por encima de nuestras posibilidades 😅 por eso este es el compromiso de la Lean Lista