Flutterテスト
package:mockito
のように典型的にシミュレートされる.ユニットテストでは、通常、ディスクの読み取り/書き込み、画面へのレンダリング、テストを実行するプロセスの外部からのユーザー操作の受信は行われません.ユニットテストの目標は,様々な条件下で論理ユニットの正確性を検証することである.ユニットテスト
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)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
接尾辞を持つテストファイルを検索するために、規則を使用します.