Flutter Testing — mis consejos y buenas prácticas

Cesar Vega
Comunidad Flutter
Published in
3 min readJan 2, 2021

Este artículo es una traducción de un artículo publicado originalmente en inglés por Paulina Szklarska en Medium. Por favor, visita el siguiente enlace y recomienda el artículo original si te gusta el contenido:

¡Hola! Hoy me gustaría compartir algunos consejos sobre cómo escribir pruebas en Flutter. Algunos dicen que los exámenes de escritura te hacen más lento, pero no es cierto si sabes cómo escribirlos eficientemente. Hay algunas buenas prácticas sobre cómo lograrlo en básicamente todos los idiomas y marcos de trabajo. En este artículo les mostraré algunas de ellas en Flutter.

Si quieren aprender primero algunos conceptos básicos sobre las pruebas de Flutter, los animo a que visiten el sitio web de Flutter. Allí encontrarán una explicación de las pruebas de unidad, de widgets y de integración. De lo contrario, ¡comencemos con los consejos de hoy!

Seguir Given-When-Then

¿Estás familiarizado con el enfoque Given-When-Then? Es un estilo para formular sus pruebas. Con esa idea, se inicia una prueba describiendo el estado inicial (por ejemplo, un usuario dado, “Given”, se encuentra autenticado), luego se describe lo que debe suceder (por ejemplo, cuando, “When”, un usuario pulsa sobre un botón), y finalmente se describe el estado o resultado esperado (por ejemplo, entonces “Then” el usuario observa que esta autenticado al observar en el mensaje). De esta manera, se pueden separar claramente las condiciones, las acciones y los resultados y se puede ver cuál es el objetivo de cada prueba.

Además, ¡también puedes usar ese concepto en el nombre de la prueba! Así es como puede verse en Flutter:

testWidgets(
‘GIVEN user is logged in ‘
‘WHEN user taps on a button ‘
‘THEN info is shown’, (tester) async {

// given
when(user.isLoggedIn).thenReturn(true);

// when
await tester.pumpWidget(Home());
await tester.tap(find.byType(FlatButton));
await tester.pump();

// then
expect(find.text(‘I\’m logged in!’), findsOneWidget);
});

Nota: Si no sabes lo que significa when(…).thenReturn(…), puedes seguir leyendo para aprender sobre mockito. ¡Es un requisito indispensable para las pruebas!

Usar Mockito

Si aún no conoces a Mockito, se convertirá en tu mejor amigo en las pruebas. Mockito es una biblioteca que permite simular los comportamientos de las clases. ¿Por qué podrías necesitar eso? El caso de uso más simple es, por supuesto, cualquier cosa que consuma tiempo y recursos, como llamadas a la API, operaciones de base de datos, carga de recursos de la red, etc. Esos servicios pueden llevar un tiempo y no siempre se puede predecir su resultado, por lo que realmente no los quieres en tus pruebas. ¡Imagina que realizas una prueba que falla al azar porque tienes una mala conexión a Internet!

Aquí es donde el mockito se vuelve muy útil. Puedes usarlo para simular el comportamiento de cualquier clase que quieras y devolver el comportamiento esperado. Por ejemplo:

when(apiClient.fetchKittyNames()).thenReturn([‘Lilly’, ‘Bella’,’Coco’]);when(databaseManager.saveProduct()).thenReturn(true);when(resourceProvider.getImage()).thenThrow(Exception());

De esta manera puedes comprobar todas las posibilidades en tus pruebas con un control total sobre las dependencias externas. Bastante cool, ¿verdad?

Sin embargo, no es sólo para operaciones de larga duración. Puedes usar Mockito para todas tus dependencias. Veamos el ejemplo anterior con el usuario conectado. Si queremos probar diferentes comportamientos basados en el estado del usuario, tenemos que pasar el Usersimulado al widget Home:

testWidgets(
‘GIVEN user is logged in ‘
‘WHEN user taps on a button ‘
‘THEN info is shown’, (tester) async {

// given
final user = UserMock();
… // when
await tester.pumpWidget(MaterialApp(home: Home(user: user)));

});

Donde UserMock es una nueva clase creada fuera de la prueba con un mockito:

class UserMock extends Mock implements User {}

Y así podemos controlar si el usuario está conectado o no y comprobarlo en nuestra prueba:

testWidgets(
'GIVEN user is logged in '
'WHEN user taps on a button '
'THEN info is shown', (tester) async {

// given
final user = UserMock();
when(user.isLoggedIn).thenReturn(true);

// when
await tester.pumpWidget(MaterialApp(home: Home(user: user)));
await tester.tap(find.byType(FlatButton));
await tester.pump();

// then
expect(find.text('I\'m logged in!'), findsOneWidget);
});

Puedes consultar el código fuente completo en mi GitHub:

¡Eso es todo por hoy! Espero que este post haya aclarado el tema de la prueba en Flutter para ustedes. Si todavía necesitan más información, los animo a que profundicen en la documentación de Flutter (español), donde pueden encontrar muchos artículos y tutoriales útiles. ¡Gracias por leer!👋

Twitter: https://twitter.com/esFlutter

Telegram: https://t.me/flutter_dart_spanish

Slack: http://bit.ly/FlutterDevsEnEspa

https://twitter.com/Inticaya

--

--

Cesar Vega
Comunidad Flutter

Systems Engineer, postgrade in Software Development, postgrade in Information Security