Flutter - Prueba

Las pruebas son una fase muy importante en el ciclo de vida de desarrollo de una aplicación. Asegura que la aplicación sea de alta calidad. Las pruebas requieren una planificación y ejecución cuidadosas. También es la fase del desarrollo que lleva más tiempo.

El lenguaje Dart y el marco Flutter brindan un amplio soporte para las pruebas automatizadas de una aplicación.

Tipos de pruebas

Generalmente, hay tres tipos de procesos de prueba disponibles para probar completamente una aplicación. Son los siguientes:

Examen de la unidad

La prueba unitaria es el método más sencillo para probar una aplicación. Se basa en asegurar la corrección de un fragmento de código (una función, en general) o un método de una clase. Pero, no refleja el entorno real y, posteriormente, es la menor opción para encontrar los errores.

Prueba de widget

La prueba de widgets se basa en garantizar la exactitud de la creación, representación e interacción del widget con otros widgets como se esperaba. Va un paso más allá y proporciona un entorno casi en tiempo real para encontrar más errores.

Pruebas de integración

Las pruebas de integración implican pruebas unitarias y de widgets junto con un componente externo de la aplicación como base de datos, servicio web, etc. Simula o se burla del entorno real para encontrar casi todos los errores, pero es el proceso más complicado.

Flutter brinda soporte para todo tipo de pruebas. Proporciona soporte extenso y exclusivo para pruebas de widgets. En este capítulo, discutiremos en detalle las pruebas de widgets.

Prueba de widget

El marco de prueba de Flutter proporciona el método testWidgets para probar widgets. Acepta dos argumentos:

  • Descripción de la prueba
  • Código de prueba
testWidgets('test description: find a widget', '<test code>');

Pasos involucrados

La prueba de widgets implica tres pasos distintos:

  • Renderice el widget en el entorno de prueba.

  • WidgetTester es la clase proporcionada por el marco de prueba de Flutter para construir y renderizar el widget. El método pumpWidget de la clase WidgetTester acepta cualquier widget y lo representa en el entorno de prueba.

testWidgets('finds a specific instance', (WidgetTester tester) async { 
   await tester.pumpWidget(MaterialApp( 
      home: Scaffold( 
         body: Text('Hello'), 
      ), 
   )); 
});
  • Encontrar el widget, que debemos probar.

    • Flutter framework proporciona muchas opciones para encontrar los widgets renderizados en el entorno de prueba y generalmente se denominan Finders. Los buscadores más utilizados son find.text, find.byKey y find.byWidget.

      • find.text busca el widget que contiene el texto especificado.

find.text('Hello')
      • find.byKey encuentra el widget por su clave específica.

find.byKey('home')
      • find.byWidget encuentra el widget por su variable de instancia.

find.byWidget(homeWidget)
  • Asegurarse de que el widget funcione como se esperaba.

  • El marco Flutter proporciona muchas opciones para hacer coincidir el widget con el widget esperado y normalmente se denominan Matchers . Podemos usar el método de espera proporcionado por el marco de prueba para hacer coincidir el widget, que encontramos en el segundo paso con nuestro widget esperado al elegir cualquiera de los emparejadores. Algunos de los comparadores importantes son los siguientes.

    • findOneWidget: verifica que se encuentre un solo widget.

expect(find.text('Hello'), findsOneWidget);
    • findNothing: verifica que no se encuentren widgets

expect(find.text('Hello World'), findsNothing);
    • findWidgets: verifica que se encuentre más de un widget.

expect(find.text('Save'), findsWidgets);
    • findNWidgets: verifica que se encuentre N número de widgets.

expect(find.text('Save'), findsNWidgets(2));

El código de prueba completo es el siguiente:

testWidgets('finds hello widget', (WidgetTester tester) async { 
   await tester.pumpWidget(MaterialApp( 
      home: Scaffold( 
         body: Text('Hello'), 
      ), 
   )); 
   expect(find.text('Hello'), findsOneWidget); 
});

Aquí, representamos un widget MaterialApp con texto Hello usando el widget Text en su cuerpo. Luego, usamos find.text para encontrar el widget y luego lo emparejamos usando FindSOneWidget.

Ejemplo de trabajo

Creemos una aplicación simple de aleteo y escribamos una prueba de widget para comprender mejor los pasos involucrados y el concepto.

  • Crea una nueva aplicación de flutter, flutter_test_app en Android Studio.

  • Abra widget_test.dart en la carpeta de prueba. Tiene un código de prueba de muestra como se indica a continuación:

testWidgets('Counter increments smoke test', (WidgetTester tester) async {
   // Build our app and trigger a frame. 
   await tester.pumpWidget(MyApp()); 
   
   // Verify that our counter starts at 0. 
   expect(find.text('0'), findsOneWidget); 
   expect(find.text('1'), findsNothing); 
   
   // Tap the '+' icon and trigger a frame. 
   await tester.tap(find.byIcon(Icons.add)); 
   await tester.pump(); 
   
   // Verify that our counter has incremented. 
   expect(find.text('0'), findsNothing); 
   expect(find.text('1'), findsOneWidget); 
});
  • Aquí, el código de prueba tiene las siguientes funcionalidades:

    • Renderiza el widget MyApp usando tester.pumpWidget.

    • Asegura que el contador sea inicialmente cero usando los emparejadores findOneWidget y findNothing.

    • Encuentra el botón de incremento del contador usando el método find.byIcon.

    • Toca el botón de incremento del contador utilizando el método tester.tap.

    • Se asegura de que el contador se incremente usando findOneWidget y coincidencias findNothing.

  • Toquemos nuevamente el botón de incremento del contador y luego verifiquemos si el contador aumenta a dos.

await tester.tap(find.byIcon(Icons.add)); 
await tester.pump(); 

expect(find.text('2'), findsOneWidget);
  • Haga clic en el menú Ejecutar.

  • Haga clic en pruebas en la opción widget_test.dart. Esto ejecutará la prueba e informará el resultado en la ventana de resultados.