Testing Flutter apps翻訳-クリック、ドラッグ、入力テキスト
8508 ワード
テキストリンク:https://juejin.im/post/5cbd885f6fb9a032341647fc
翻訳ホームページ
多くのビルドのWidgetは、情報を表示するだけでなく、ユーザーのインタラクションにも応答します.クリック可能なボタン、画面でコントロールをドラッグしたり、テキストボックスにテキストを入力したりします.
それらのインタラクションをテストするためには、テスト環境でそれらをシミュレートする方法が必要です.そのためには、
この enterText tap drag
多くの場合、ユーザーインタラクションはappの状態を更新します.テスト環境では、ステータスが変更された後、Flutterは自動的にWidgetsを再構築しません.我々のWidgetツリーがユーザインタラクションをシミュレートした後に再buildされることを保証するために、
手順:は、 をテストするためのWidgetを作成する.入力ボックスにテキスト を入力する.ボタンをクリックするとtodo が追加されることを確認します.スライド削除todo を確保する.
1.テスト用のWidgetを作成する
を入力 を追加スライドリストからitem を削除
テストに焦点を当てるために、この例はtodo appを構築するための詳細なインタフェースを提供しない.appの構築方法についてもっと勉強したい場合は、次の関連記事を参照してください. Create and style a text field Handling Taps Create a basic list Implement Swipe to Dismiss
2.入力ボックスにテキストを入力
テスト環境build 1つのWidget を用いる.
注:このコードは、前のテストのコードに基づいています.Widgetテストの核心概念を学びたい場合は、次の記事を参照してください. Widgetテスト紹介 Finderを使用してchild widget を検索
3.ボタンをクリックするとtodoが追加されることを確認する
ステータスが変更された後、 itemが画面のリストに表示されることを確認します.
3.スライドリストからitemを削除
は、 itemが画面から消えることを確認します.
完全なコード:
翻訳ホームページ
多くのビルドのWidgetは、情報を表示するだけでなく、ユーザーのインタラクションにも応答します.クリック可能なボタン、画面でコントロールをドラッグしたり、テキストボックスにテキストを入力したりします.
それらのインタラクションをテストするためには、テスト環境でそれらをシミュレートする方法が必要です.そのためには、
flutter_test
クラスライブラリのWidgetTester
クラスを使用する必要があります.この
WidgetTester
は、入力テキスト、クリック、ドラッグの方法を提供します.多くの場合、ユーザーインタラクションはappの状態を更新します.テスト環境では、ステータスが変更された後、Flutterは自動的にWidgetsを再構築しません.我々のWidgetツリーがユーザインタラクションをシミュレートした後に再buildされることを保証するために、
WidgetTester
が提供するpump
またはpumpAndSettle
メソッドを呼び出す必要があります.手順:
1.テスト用のWidgetを作成する
この例では、基礎的なtodo appを作成します.テストが必要な主な機能は3つあります.
TextField
にテキストFloatingActionButton
ボタンをクリックtodoリストにテキストテストに焦点を当てるために、この例はtodo appを構築するための詳細なインタフェースを提供しない.appの構築方法についてもっと勉強したい場合は、次の関連記事を参照してください.
class TodoList extends StatefulWidget {
@override
_TodoListState createState() => _TodoListState();
}
class _TodoListState extends State {
static const _appTitle = 'Todo List';
final todos = [];
final controller = TextEditingController();
@override
Widget build(BuildContext context) {
return MaterialApp(
title: _appTitle,
home: Scaffold(
appBar: AppBar(
title: Text(_appTitle),
),
body: Column(
children: [
TextField(
controller: controller,
),
Expanded(
child: ListView.builder(
itemCount: todos.length,
itemBuilder: (BuildContext context, int index) {
final todo = todos[index];
return Dismissible(
key: Key('$todo$index'),
onDismissed: (direction) => todos.removeAt(index),
child: ListTile(title: Text(todo)),
background: Container(color: Colors.red),
);
},
),
),
],
),
floatingActionButton: FloatingActionButton(
onPressed: () {
setState(() {
todos.add(controller.text);
controller.clear();
});
},
child: Icon(Icons.add),
),
),
);
}
}
2.入力ボックスにテキストを入力
今私たちはtodo appを持っていて、私たちは私たちのテストを書くことができます!この例では、入力テキストからTextField
に開始します.
私たちはこのようにして任務を遂行することができます.
WidgetTester
のenterText
法testWidgets('Add and remove a todo', (WidgetTester tester) async {
// Build the Widget
await tester.pumpWidget(TodoList());
// Enter 'hi' into the TextField
await tester.enterText(find.byType(TextField), 'hi');
});
注:このコードは、前のテストのコードに基づいています.Widgetテストの核心概念を学びたい場合は、次の記事を参照してください.
3.ボタンをクリックするとtodoが追加されることを確認する TextField
にテキストを入力した後、FloatingActionButton
をクリックするとitemがリストに追加されます.
これらの手順には、次の3つのステップがあります.
tap
メソッドを使用してボタンをクリックします.pump
メソッドを使用してビルドWidgetを再構築します.testWidgets('Add and remove a todo', (WidgetTester tester) async {
// Enter text code...
// Tap the add button
await tester.tap(find.byType(FloatingActionButton));
// Rebuild the Widget after the state has changed
await tester.pump();
// Expect to find the item on screen
expect(find.text('hi'), findsOneWidget);
});
3.スライドリストからitemを削除
最後に、スライドしてtodoを削除した後、リストから削除できることを確認します.これには、次の3つのステップが含まれます.
drag
の方法を使用してスライド削除動作を実行する.pumpAndSettle
メソッドを使用して、dismissアニメーションが完了するまでWidgetツリーを絶えず再構築します.testWidgets('Add and remove a todo', (WidgetTester tester) async {
// Enter text and add the item...
// Swipe the item to dismiss it
await tester.drag(find.byType(Dismissible), Offset(500.0, 0.0));
// Build the Widget until the dismiss animation ends
await tester.pumpAndSettle();
// Ensure the item is no longer on screen
expect(find.text('hi'), findsNothing);
});
完全なコード: import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
testWidgets('Add and remove a todo', (WidgetTester tester) async {
// Build the Widget
await tester.pumpWidget(TodoList());
// Enter 'hi' into the TextField
await tester.enterText(find.byType(TextField), 'hi');
// Tap the add button
await tester.tap(find.byType(FloatingActionButton));
// Rebuild the Widget with the new item
await tester.pump();
// Expect to find the item on screen
expect(find.text('hi'), findsOneWidget);
// Swipe the item to dismiss it
await tester.drag(find.byType(Dismissible), Offset(500.0, 0.0));
// Build the Widget until the dismiss animation ends
await tester.pumpAndSettle();
// Ensure the item is no longer on screen
expect(find.text('hi'), findsNothing);
});
}
class TodoList extends StatefulWidget {
@override
_TodoListState createState() => _TodoListState();
}
class _TodoListState extends State {
static const _appTitle = 'Todo List';
final todos = [];
final controller = TextEditingController();
@override
Widget build(BuildContext context) {
return MaterialApp(
title: _appTitle,
home: Scaffold(
appBar: AppBar(
title: Text(_appTitle),
),
body: Column(
children: [
TextField(
controller: controller,
),
Expanded(
child: ListView.builder(
itemCount: todos.length,
itemBuilder: (BuildContext context, int index) {
final todo = todos[index];
return Dismissible(
key: Key('$todo$index'),
onDismissed: (direction) => todos.removeAt(index),
child: ListTile(title: Text(todo)),
background: Container(color: Colors.red),
);
},
),
),
],
),
floatingActionButton: FloatingActionButton(
onPressed: () {
setState(() {
todos.add(controller.text);
controller.clear();
});
},
child: Icon(Icons.add),
),
),
);
}
}
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
testWidgets('Add and remove a todo', (WidgetTester tester) async {
// Build the Widget
await tester.pumpWidget(TodoList());
// Enter 'hi' into the TextField
await tester.enterText(find.byType(TextField), 'hi');
// Tap the add button
await tester.tap(find.byType(FloatingActionButton));
// Rebuild the Widget with the new item
await tester.pump();
// Expect to find the item on screen
expect(find.text('hi'), findsOneWidget);
// Swipe the item to dismiss it
await tester.drag(find.byType(Dismissible), Offset(500.0, 0.0));
// Build the Widget until the dismiss animation ends
await tester.pumpAndSettle();
// Ensure the item is no longer on screen
expect(find.text('hi'), findsNothing);
});
}
class TodoList extends StatefulWidget {
@override
_TodoListState createState() => _TodoListState();
}
class _TodoListState extends State {
static const _appTitle = 'Todo List';
final todos = [];
final controller = TextEditingController();
@override
Widget build(BuildContext context) {
return MaterialApp(
title: _appTitle,
home: Scaffold(
appBar: AppBar(
title: Text(_appTitle),
),
body: Column(
children: [
TextField(
controller: controller,
),
Expanded(
child: ListView.builder(
itemCount: todos.length,
itemBuilder: (BuildContext context, int index) {
final todo = todos[index];
return Dismissible(
key: Key('$todo$index'),
onDismissed: (direction) => todos.removeAt(index),
child: ListTile(title: Text(todo)),
background: Container(color: Colors.red),
);
},
),
),
],
),
floatingActionButton: FloatingActionButton(
onPressed: () {
setState(() {
todos.add(controller.text);
controller.clear();
});
},
child: Icon(Icons.add),
),
),
);
}
}