Flattern - Testen

Das Testen ist eine sehr wichtige Phase im Entwicklungslebenszyklus einer Anwendung. Es stellt sicher, dass die Anwendung von hoher Qualität ist. Das Testen erfordert eine sorgfältige Planung und Ausführung. Es ist auch die zeitaufwändigste Phase der Entwicklung.

Das Dart-Sprach- und Flutter-Framework bietet umfassende Unterstützung für das automatisierte Testen einer Anwendung.

Arten von Tests

Im Allgemeinen stehen drei Arten von Testprozessen zur Verfügung, um eine Anwendung vollständig zu testen. Sie sind wie folgt -

Unit Testing

Unit-Tests sind die einfachste Methode zum Testen einer Anwendung. Es basiert auf der Sicherstellung der Richtigkeit eines Codeteils (einer Funktion im Allgemeinen) einer Methode einer Klasse. Es spiegelt jedoch nicht die reale Umgebung wider und ist in der Folge die geringste Option, um die Fehler zu finden.

Widget-Test

Das Testen von Widgets basiert auf der Sicherstellung der Richtigkeit der Erstellung, des Renderns und der erwarteten Interaktion mit anderen Widgets. Es geht noch einen Schritt weiter und bietet eine Umgebung in nahezu Echtzeit, um weitere Fehler zu finden.

Integrationstests

Integrationstests umfassen sowohl Unit-Tests als auch Widget-Tests sowie externe Komponenten der Anwendung wie Datenbank, Webdienst usw. Sie simulieren oder verspotten die reale Umgebung, um fast alle Fehler zu finden, sind jedoch der komplizierteste Prozess.

Flutter bietet Unterstützung für alle Arten von Tests. Es bietet umfassende und exklusive Unterstützung für Widget-Tests. In diesem Kapitel werden wir das Testen von Widgets ausführlich behandeln.

Widget-Test

Das Flattertest-Framework bietet die testWidgets-Methode zum Testen von Widgets. Es akzeptiert zwei Argumente -

  • Testbeschreibung
  • Testcode
testWidgets('test description: find a widget', '<test code>');

Beteiligte Schritte

Das Testen von Widgets umfasst drei verschiedene Schritte:

  • Rendern Sie das Widget in der Testumgebung.

  • WidgetTester ist die Klasse, die vom Flutter-Testframework zum Erstellen und Rendern des Widgets bereitgestellt wird. Die pumpWidget-Methode der WidgetTester-Klasse akzeptiert jedes Widget und rendert es in der Testumgebung.

testWidgets('finds a specific instance', (WidgetTester tester) async { 
   await tester.pumpWidget(MaterialApp( 
      home: Scaffold( 
         body: Text('Hello'), 
      ), 
   )); 
});
  • Finden des Widgets, das wir testen müssen.

    • Das Flutter-Framework bietet viele Optionen zum Auffinden der in der Testumgebung gerenderten Widgets und wird im Allgemeinen als Finder bezeichnet. Die am häufigsten verwendeten Finder sind find.text, find.byKey und find.byWidget.

      • find.text findet das Widget, das den angegebenen Text enthält.

find.text('Hello')
      • find.byKey findet das Widget anhand seines spezifischen Schlüssels.

find.byKey('home')
      • find.byWidget findet das Widget anhand seiner Instanzvariablen.

find.byWidget(homeWidget)
  • Stellen Sie sicher, dass das Widget wie erwartet funktioniert.

  • Das Flutter-Framework bietet viele Optionen, um das Widget mit dem erwarteten Widget abzugleichen, und sie werden normalerweise als Matcher bezeichnet . Wir können die Expect-Methode des Test-Frameworks verwenden, um das Widget, das wir im zweiten Schritt gefunden haben, mit unserem erwarteten Widget abzugleichen, indem wir einen der Matcher auswählen. Einige der wichtigsten Matcher sind wie folgt.

    • findOneWidget - Überprüft, ob ein einzelnes Widget gefunden wurde.

expect(find.text('Hello'), findsOneWidget);
    • findNothing - Überprüft, ob keine Widgets gefunden wurden

expect(find.text('Hello World'), findsNothing);
    • findWidgets - Überprüft, ob mehr als ein Widget gefunden wurde.

expect(find.text('Save'), findsWidgets);
    • findNWidgets - Überprüft, ob N Widgets gefunden wurden.

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

Der vollständige Testcode lautet wie folgt:

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

Hier haben wir ein MaterialApp-Widget mit Text Hello mithilfe des Text-Widgets in seinem Hauptteil gerendert. Dann haben wir find.text verwendet, um das Widget zu finden, und es dann mit findOneWidget abgeglichen.

Arbeitsbeispiel

Lassen Sie uns eine einfache Flatteranwendung erstellen und einen Widget-Test schreiben, um die Schritte und das Konzept besser zu verstehen.

  • Erstellen Sie eine neue Flatteranwendung, flutter_test_app, in Android Studio.

  • Öffnen Sie widget_test.dart im Testordner. Es hat einen Beispieltestcode wie unten angegeben -

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); 
});
  • Hier führt der Testcode die folgenden Funktionen aus:

    • Rendert das MyApp-Widget mit tester.pumpWidget.

    • Stellt sicher, dass der Zähler mit findOneWidget und findNothing-Matchern anfänglich Null ist.

    • Findet die Schaltfläche zum Inkrementieren des Zählers mithilfe der Methode find.byIcon.

    • Tippen Sie mit der Methode tester.tap auf die Schaltfläche zum Inkrementieren des Zählers.

    • Stellt sicher, dass der Zähler mithilfe der Matcher findOneWidget und findNothing erhöht wird.

  • Tippen Sie erneut auf die Schaltfläche zum Erhöhen des Zählers und prüfen Sie, ob der Zähler auf zwei erhöht ist.

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

expect(find.text('2'), findsOneWidget);
  • Klicken Sie auf das Menü Ausführen.

  • Klicken Sie in der Option widget_test.dart auf Tests. Dadurch wird der Test ausgeführt und das Ergebnis im Ergebnisfenster gemeldet.