Flutterでのテスト
5076 ワード
多くのユニットテストとwidgetテストを適用し、コードオーバーライド機能を使用して追跡する良好なテストされた応用.加えて、すべての主要な使用シーンに対して十分な統合テストがあります.
Flutterでは、テストを3つに分類します.
ユニットテスト
Widgetテスト
統合テスト
この3つのテスト例を簡単に説明します.
依存の追加
一般論理テスト
mock依存が必要な場合は、Mockitoライブラリを使用します.
widgetテストを実現する方法はユニットテストとよく似ており、Flutterが提供するWidgetTesterツールを使用してクリック、スクロールジェスチャーを送信したり、ビューツリーでサブコントロールを探したり、テキストを読み取ったり、widget属性が正しいかどうかを検証したりします.
Flutterの統合テストもpackage:testを使用して作成され、その原理はSelenium/WebDriver(web)、Expresso(Android)、UI Automation(iOS)と同様で、テストスクリプトとAppは異なるプロセスで実行され、テストスクリプトはAppプロセスにシミュレーションイベントを送信することでテストプロセスを駆動します.
API依存の追加
Instrumented Flutterアプリケーションを作成します.つまり、Flutter Driver拡張アプリケーションを開き、enableFlutterDriverExtension()を呼び出して開きます.
統合テストを作成し、テストファイルはmy_にあります.app/test_driver/user_list_scrolling_test.dart
統合テストの実行
上のコマンドの背後には、次のものがあります.構築–target対応Appをデバイスにインストールします. App を起動 user_を実行list_scrolling_test.dartファイルのテスト
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
上のコマンドの背後には、次のものがあります.