Flutterテスト

7897 ワード

  • ユニットテスト:単一の機能、方法、またはクラスをテストします.例えば、測定ユニットの外部依存性は、package:mockitoのように典型的にシミュレートされる.ユニットテストでは、通常、ディスクの読み取り/書き込み、画面へのレンダリング、テストを実行するプロセスの外部からのユーザー操作の受信は行われません.ユニットテストの目標は,様々な条件下で論理ユニットの正確性を検証することである.
  • widgetテスト:(他のUIフレームワークではコンポーネントテストと呼ばれる)テストの単一widget.テストwidgetは複数のクラスに関連し、適切なwidgetライフサイクルコンテキストのテスト環境を提供する必要があります.例えば、ユーザ操作およびイベントを受信および応答し、レイアウトを実行し、サブwidgetをインスタンス化することができるはずである.Widgetテストは、ユニットテストよりも包括的です.しかしながら、ユニットテストのように、widgetテストの環境は、完全なUIシステムよりもはるかに簡単な実装に取って代わられる.ウィジェットテストの目的は、ウィジェットのUIが予想されるような外観とインタラクションを検証することである.
  • 統合テスト:完全なアプリケーションまたはアプリケーションの大部分をテストします.通常、統合テストは、iOS SimulatorまたはAndroid Emulatorなどの実際のデバイスまたはOSシミュレータ上で実行できます.テストされたアプリケーションは、結果のばらつきを回避するために、通常、テストドライバコードから分離されます.統合テストの目標は、アプリケーションが全体として正しく動作していることを検証することであり、構成されているすべてのwidgetが予想通りに統合されています.統合テストを使用して、アプリケーションのパフォーマンスを検証することもできます.

  • ユニットテスト

    dart:uiのような一部のFlutterライブラリは、独立したDart VMに付属するDart SDKでは使用できません.このflutter testコマンドを使用すると、ローカルDart VMでテストを実行し、UIが表示されないヘッダレスのFlutterエンジンを使用できます.このコマンドを使用すると、Flutterのライブラリに依存しているかどうかにかかわらず、テストを実行できます.package:testを使用して、Flutterユニットテストを作成します.作成ユニットテストで使用されるpackage:test例:
    このファイルをtest/unit_test.dartに追加します.
    import 'package:test/test.dart';
    
    void main() {
      test('my first unit test', () {
        var answer = 42;
        expect(answer, 42);
      });
    }

    さらに、次の内容をpubspec.yamlに追加する必要があります.
    dev_dependencies:
      flutter_test:
        sdk: flutter
    

    テスト自体がflutter_testに明確に導入されていない場合でも、テストフレームワーク自体がバックグラウンドで使用されているため、このようにする必要があります.
    テストを実行するには、testサブディレクトリではなく、プロジェクトディレクトリからflutter test test/unit_test.dartを実行します.
    すべてのテストを実行するには、プロジェクトディレクトリからflutter testを実行します.

    Widgetテスト


    ユニットテストと同様にwidgetテストを実現します.テストでwidgetとのインタラクションを実行するには、Flutterが提供するWidgetTesterを使用します.たとえば、クリックとスクロールジェスチャーを送信できます.WidgetTesterを使用して、widgetツリーでサブwidgetを検索したり、テキストを読み出したり、widgetプロパティの値が正しいかどうかを確認したりすることもできます.
    例:
    このファイルをtest/widget_test.dartに追加します.
    import 'package:flutter/material.dart';
    import 'package:flutter_test/flutter_test.dart';
    
    void main() {
      testWidgets('my first widget test', (WidgetTester tester) async {
        // You can use keys to locate the widget you need to test
        var sliderKey = new UniqueKey();
        var value = 0.0;
    
        // Tells the tester to build a UI based on the widget tree passed to it
        await tester.pumpWidget(
          new StatefulBuilder(
            builder: (BuildContext context, StateSetter setState) {
              return new MaterialApp(
                home: new Material(
                  child: new Center(
                    child: new Slider(
                      key: sliderKey,
                      value: value,
                      onChanged: (double newValue) {
                        setState(() {
                          value = newValue;
                        });
                      },
                    ),
                  ),
                ),
              );
            },
          ),
        );
        expect(value, equals(0.0));
    
        // Taps on the widget found by key
        await tester.tap(find.byKey(sliderKey));
    
        // Verifies that the widget updated the value correctly
        expect(value, equals(0.5));
      });
    }
    
    flutter test test/widget_test.dartを運転する.
    widgetテストに使用できるすべてのpackage:flutter_test APIを表示
    Widgetテストのデバッグを支援するには、debugDumpApp()関数を使用してテストのUIステータスを視覚化するか、シミュレータやデバイスなどの環境でflutter run test/widget_test.dartを簡単に実行してテストの実行を確認します.flutter runのテストセッションを実行している間、Flutterツールの一部の画面をインタラクティブにクリックして、推奨されるFinderを印刷することもできます.

    統合テスト


    Selenium/WebDriver(web)、Espresso(Android)、UI Automation(iOS)に詳しい場合は、Flutter Driverはこれらの統合テストツールと同等のものです.さらに、Flutter Driverは、試験によって実行された動作の性能追跡(時間軸とも呼ばれる)を記録するためのAPIも提供する.
    FlutterのDriverは次のとおりです.
  • コマンドラインツールflutter drive
  • パケットpackage:flutter_driver(API)
  • この2つは、
  • 統合テストのための命令化アプリケーション
  • を作成
  • テスト
  • を書く
  • 実行テスト
  • flutter_の追加driver依存項目

    flutter_driverを使用するには、次のブロックをpubspec.yamlに追加する必要があります.
    dev_dependencies:
      flutter_driver:
        sdk: flutter
    

    命令化されたFlutterアプリケーションの作成


    命令化されたアプリケーションは、Flutter Driver拡張機能を有効にするFlutterアプリケーションです.拡張機能を有効にするには、enableFlutterDriverExtension()を呼び出します.
    例:
    エントリポイントのアプリケーションmy_app/lib/main.dartがあるとします.命令化されたバージョンを作成するには、my_app/test_driver/でDartファイルを作成します.テスト中の機能の後に名前を付けます.次に、my_app/test_driver/user_list_scrolling.dartにナビゲートします.
    //  
    import 'package:flutter_driver/driver_extension.dart';
    
    void main() {
      //  
      enableFlutterDriverExtension();
    
      // Call the `main()` of your app or call `runApp` with whatever widget
      // you are interested in testing.
    }
    

    統合テストの作成


    統合テストは、Flutter Driver APIを使用してアプリケーションにどのような操作を実行したかを通知し、アプリケーションがこの操作を実行したかどうかを確認する簡単なpackage:testテストです.
    例:
    興味深いために、パフォーマンストラッキング(performance timeline)もテストで記録します.user_list_scrolling_test.dartのテストファイルをmy_app/test_driver/の下に作成しました.
    import 'dart:async';
    
    // Imports the Flutter Driver API
    import 'package:flutter_driver/flutter_driver.dart';
    import 'package:test/test.dart';
    
    void main() {
      group('scrolling performance test', () {
        FlutterDriver driver;
    
        setUpAll(() async {
          //  app
          driver = await FlutterDriver.connect();
        });
    
        tearDownAll(() async {
          if (driver != null) {
            //  
            driver.close();
          }
        });
    
        test('measure', () async {
          //  performance timeline
          Timeline timeline = await driver.traceAction(() async {
            // Find the scrollable user list
            SerializableFinder userList = find.byValueKey('user-list');
    
            // Scroll down 5 times
            for (int i = 0; i < 5; i++) {
              // Scroll 300 pixels down, for 300 millis
              await driver.scroll(
                  userList, 0.0, -300.0, new Duration(milliseconds: 300));
    
              // Emulate a user's finger taking its time to go back to the original
              // position before the next scroll
              await new Future.delayed(new Duration(milliseconds: 500));
            }
    
            // Scroll up 5 times
            for (int i = 0; i < 5; i++) {
              await driver.scroll(
                  userList, 0.0, 300.0, new Duration(milliseconds: 300));
              await new Future.delayed(new Duration(milliseconds: 500));
            }
          });
    
          // The `timeline` object contains all the performance data recorded during
          // the scrolling session. It can be digested into a handful of useful
          // aggregate numbers, such as "average frame build time".
          TimelineSummary summary = new TimelineSummary.summarize(timeline);
          summary.writeSummaryToFile('stocks_scroll_perf', pretty: true);
          summary.writeTimelineToFile('stocks_scroll_perf', pretty: true);
        });
      });
    }
    

    統合テストの実行


    Androidデバイスでテストを実行するには、USBを使用してデバイスをコンピュータに接続し、USBデバッグを有効にします.次に、次のコマンドを実行します.
    flutter drive --target=my_app/test_driver/user_list_scrolling.dart
    

    このコマンドは次のようになります.
  • は、--targetアプリケーションを構築し、デバイスにインストールする
  • .
  • アプリケーション
  • を起動
  • 運転my_app/test_driver/下のuser_list_scrolling_test.dart
  • このコマンドが正しいテストファイルを見つける方法を知りたいかもしれません.flutter driveコマンドは、--targetアプリケーションと同じディレクトリに同じファイル名を持つが_test接尾辞を持つテストファイルを検索するために、規則を使用します.