フラッター-テスト

テストは、アプリケーションの開発ライフサイクルにおいて非常に重要なフェーズです。これにより、アプリケーションの品質が保証されます。テストには、慎重な計画と実行が必要です。また、開発の中で最も時間のかかるフェーズでもあります。

Dart言語とFlutterフレームワークは、アプリケーションの自動テストを広範囲にサポートします。

テストの種類

一般に、アプリケーションを完全にテストするには、3種類のテストプロセスを使用できます。それらは次のとおりです-

ユニットテスト

単体テストは、アプリケーションをテストする最も簡単な方法です。これは、クラスのメソッドのコード(一般に関数)の正確性を保証することに基づいています。しかし、それは実際の環境を反映しておらず、その後、バグを見つけるための最小のオプションです。

ウィジェットのテスト

ウィジェットのテストは、ウィジェットの作成、レンダリング、および他のウィジェットとの相互作用が期待どおりに正しいことを確認することに基づいています。さらに一歩進んで、より多くのバグを見つけるためのほぼリアルタイムの環境を提供します。

統合テスト

統合テストには、データベースやWebサービスなどのアプリケーションの外部コンポーネントに加えて、単体テストとウィジェットテストの両方が含まれます。実際の環境をシミュレートまたはモックして、ほぼすべてのバグを見つけますが、これは最も複雑なプロセスです。

Flutterは、あらゆるタイプのテストをサポートします。ウィジェットテストの広範囲で排他的なサポートを提供します。この章では、ウィジェットのテストについて詳しく説明します。

ウィジェットのテスト

Flutterテストフレームワークは、ウィジェットをテストするためのtestWidgetsメソッドを提供します。それは2つの引数を受け入れます-

  • テストの説明
  • テストコード
testWidgets('test description: find a widget', '<test code>');

関係するステップ

ウィジェットのテストには、3つの異なるステップが含まれます-

  • テスト環境でウィジェットをレンダリングします。

  • WidgetTesterは、ウィジェットをビルドおよびレンダリングするためにFlutterテストフレームワークによって提供されるクラスです。WidgetTesterクラスのpumpWidgetメソッドは、任意のウィジェットを受け入れ、テスト環境でレンダリングします。

testWidgets('finds a specific instance', (WidgetTester tester) async { 
   await tester.pumpWidget(MaterialApp( 
      home: Scaffold( 
         body: Text('Hello'), 
      ), 
   )); 
});
  • テストする必要があるウィジェットを見つける。

    • Flutterフレームワークは、テスト環境でレンダリングされたウィジェットを見つけるための多くのオプションを提供し、それらは一般にファインダーと呼ばれます。最も頻繁に使用されるファインダーは、find.text、find.byKey、およびfind.byWidgetです。

      • find.textは、指定されたテキストを含むウィジェットを検索します。

find.text('Hello')
      • find.byKeyは、特定のキーでウィジェットを検索します。

find.byKey('home')
      • find.byWidgetは、インスタンス変数によってウィジェットを検索します。

find.byWidget(homeWidget)
  • ウィジェットが期待どおりに機能することを確認します。

  • Flutterフレームワークは、ウィジェットを予想されるウィジェットと一致させるための多くのオプションを提供し、それらは通常マッチャーと呼ばれます。テストフレームワークによって提供されるexpectメソッドを使用して、2番目のステップで見つけたウィジェットを、任意のマッチャーを選択することにより、期待されるウィジェットと照合できます。重要なマッチャーのいくつかは次のとおりです。

    • findsOneWidget-単一のウィジェットが見つかったことを確認します。

expect(find.text('Hello'), findsOneWidget);
    • findsNothing-ウィジェットが見つからないことを確認します

expect(find.text('Hello World'), findsNothing);
    • findsWidgets-複数のウィジェットが見つかったことを確認します。

expect(find.text('Save'), findsWidgets);
    • findsNWidgets-N個のウィジェットが見つかったことを確認します。

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

完全なテストコードは次のとおりです-

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

ここでは、本文にTextウィジェットを使用して、テキストHelloを使用してMaterialAppウィジェットをレンダリングしました。次に、find.textを使用してウィジェットを検索し、findsOneWidgetを使用してそれを照合しました。

実例

簡単なフラッターアプリケーションを作成し、ウィジェットテストを作成して、関連する手順と概念をよりよく理解しましょう。

  • AndroidStudioで新しいフラッターアプリケーションflutter_test_appを作成します。

  • テストフォルダーでwidget_test.dartを開きます。以下に示すサンプルテストコードがあります-

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); 
});
  • ここで、テストコードは次の機能を実行します-

    • tester.pumpWidgetを使用してMyAppウィジェットをレンダリングします。

    • findsOneWidgetとfindsNothingマッチャーを使用して、カウンターが最初にゼロであることを確認します。

    • find.byIconメソッドを使用してカウンターインクリメントボタンを検索します。

    • tester.tapメソッドを使用してカウンターインクリメントボタンをタップします。

    • findsOneWidgetとfindsNothingマッチャーを使用してカウンターが確実に増加するようにします。

  • もう一度カウンターインクリメントボタンをタップして、カウンターが2に増えているか確認してみましょう。

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

expect(find.text('2'), findsOneWidget);
  • [ファイル名を指定して実行]メニューをクリックします。

  • widget_test.dartオプションのテストをクリックします。これにより、テストが実行され、結果ウィンドウに結果が報告されます。