Flutterでのテスト

5076 ワード

多くのユニットテストとwidgetテストを適用し、コードオーバーライド機能を使用して追跡する良好なテストされた応用.加えて、すべての主要な使用シーンに対して十分な統合テストがあります.
Flutterでは、テストを3つに分類します.
ユニットテスト
Widgetテスト
統合テスト
この3つのテスト例を簡単に説明します.

ユニットテスト


依存の追加
dev_dependencies:
  flutter_test:
    sdk: flutter

一般論理テスト
import 'package:test/test.dart';

void main() {
  test('my first unit test', () {
    var answer = 42;
    expect(answer, 42);
  });
}

mock依存が必要な場合は、Mockitoライブラリを使用します.

Widgetテスト


widgetテストを実現する方法はユニットテストとよく似ており、Flutterが提供するWidgetTesterツールを使用してクリック、スクロールジェスチャーを送信したり、ビューツリーでサブコントロールを探したり、テキストを読み取ったり、widget属性が正しいかどうかを検証したりします.
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 = UniqueKey();
    var value = 0.0;

    // Tells the tester to build a UI based on the widget tree passed to it
    await tester.pumpWidget(
      StatefulBuilder(
        builder: (BuildContext context, StateSetter setState) {
          return MaterialApp(
            home: Material(
              child: Center(
                child: 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の統合テストもpackage:testを使用して作成され、その原理はSelenium/WebDriver(web)、Expresso(Android)、UI Automation(iOS)と同様で、テストスクリプトとAppは異なるプロセスで実行され、テストスクリプトはAppプロセスにシミュレーションイベントを送信することでテストプロセスを駆動します.
API依存の追加
dev_dependencies:
  flutter_driver:
    sdk: flutter

Instrumented Flutterアプリケーションを作成します.つまり、Flutter Driver拡張アプリケーションを開き、enableFlutterDriverExtension()を呼び出して開きます.
// This line imports the extension
import 'package:flutter_driver/driver_extension.dart';

void main() {
  // This line enables the extension
  enableFlutterDriverExtension();

  // Call the `main()` of your app or call `runApp` with whatever widget
  // you are interested in testing.
}

統合テストを作成し、テストファイルはmy_にあります.app/test_driver/user_list_scrolling_test.dart
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 {
      // Connects to the app
      driver = await FlutterDriver.connect();
    });

    tearDownAll(() async {
      if (driver != null) {
        // Closes the connection
        driver.close();
      }
    });

    test('measure', () async {
      // Record the performance timeline of things that happen inside the closure
      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, Duration(milliseconds: 300));

          // Emulate a user's finger taking its time to go back to the original
          // position before the next scroll
          await Future.delayed(Duration(milliseconds: 500));
        }

        // Scroll up 5 times
        for (int i = 0; i < 5; i++) {
          await driver.scroll(
              userList, 0.0, 300.0, Duration(milliseconds: 300));
          await Future.delayed(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 = TimelineSummary.summarize(timeline);

      // The following line saves the timeline summary to a JSON file.
      summary.writeSummaryToFile('scrolling_performance', pretty: true);

      // The following line saves the raw timeline data as JSON.
      summary.writeTimelineToFile('scrolling_performance', pretty: true);
    });
  });
}


統合テストの実行
flutter drive --target=my_app/test_driver/user_list_scrolling.dart

上のコマンドの背後には、次のものがあります.
  • 構築–target対応Appをデバイスにインストールします.
  • App
  • を起動
  • user_を実行list_scrolling_test.dartファイルのテスト