内容简介:在单元测试的介绍里,我们学习到了如何使用这个
在单元测试的介绍里,我们学习到了如何使用 test
包测试Dart类,为了测试Widget类,我们需要一些由 flutter test
包提供的额外工具,这些 工具 随Flutter SDK发布。
这个 flutter_test
包提供了以下用于测试Widget的工具:
- WidgetTester:该工具允许我们在测试环境里build Widget并与之交互。
-
使用
testWidgets
函数。这个函数将自动对每个测试用例创建一个WidgetTester
,并用于替代普通的test
函数。 - Finder classes:该工具允许我们在测试环境里查找Widget。
- Widget Matcher:一些常量,帮助我们验证在测试环境里是否找到一个或者多个Widget。
如果上面的内容听不懂的话,没关系,让我们通过一些例子来将上面的碎片信息串联到一起。
步骤:
flutter_test WidgetTester Finder Matcher
1. 添加 flutter_test
依赖。
在我们开始写测试之前,我们需要在 pubspec.yaml
文件的 dev_dependencies
行下面添加 flutter_test
包。如果你通过命令行或者编译器创建的Flutter项目,那么该依赖已经添加好了。
dev_dependencies: flutter_test: sdk: flutter 复制代码
2. 创建一个Widget用来测试。
下一步,我们需要创建一个能让我们测试的Widget。在这个例子里,我们创建了显示一个标题和一条信息的Widget。
class MyWidget extends StatelessWidget { final String title; final String message; const MyWidget({ Key key, @required this.title, @required this.message, }) : super(key: key); @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', home: Scaffold( appBar: AppBar( title: Text(title), ), body: Center( child: Text(message), ), ), ); } } 复制代码
3. 创建一个testWidgets测试方法
现在我们有了一个可以用来测试的Widget,我们可以编写我们第一个测试用例了!我们将会使用 flutter_test
包提供的 testWidgets
函数完成一个测试用例。这个 testWidgets
函数将会允许我们定义一个Widget测试用例并创建一个 WidgetTester
给我们使用。
我们的测试将会验证 MyWidget
类是否正常显示给定的标题和信息。
void main() { // Define a test. The TestWidgets function will also provide a WidgetTester // for us to work with. The WidgetTester will allow us to build and interact // with Widgets in the test environment. testWidgets('MyWidget has a title and message', (WidgetTester tester) async { // Test code will go here! }); } 复制代码
4. 使用 WidgetTester
build一个Widget
下一步,我们将会在测试环境里build我们的 MyWidget
类。为了这么做,我们将使用 WidgetTester
提供的 pumpWidget
方法。这个 pumpWidget
方法将会build和渲染我们提供的Widget。
在这个示例里,我们将会创建一个显示标题“T”和消息“M”的 MyWidget
实例。
void main() { testWidgets('MyWidget has a title and message', (WidgetTester tester) async { // Create the Widget tell the tester to build it await tester.pumpWidget(MyWidget(title: 'T', message: 'M')); }); } 复制代码
备注:
第一次调用 pumpWidget
之后, WidgetTester
提供了重新创建相同Widget的其他方式。如果你使用 StatefulWidget
或者动画,这将会非常有用。
例如,如果我们点击一个按钮,并且这个按钮调用了 setState
方法,Flutter不会在测试环境里rebuild你的Widget。我们需要使用下面的方法之一来告诉Flutter再一次build我们的Widget。
-
tester.pump()
在一个给定的时间以后rebuild你的Widget。
-
tester.pumpAndSettle()
在给定的时间不断重复调用
pump
方法直到不再有任何绘制任务。一般用于等待所有动画完成。
这些方法提供了比build生命周期更细粒度的控制,这在测试的时候特别有用。
5. 使用 Finder
搜索我们的Widget。
现在我们已经在测试环境构建了我们的Widget,我们想要通过使用 Finder
在Widget树里搜索我们的 title
和 message
Widget。这将允许我们验证是否正确显示了那些Widget!
在这个例子里,我们将会使用 flutter_test
包提供的顶级 find
方法去创建我们的 Finder
类。因为我们知道我们在寻找Text widget,所以我们可以使用 find.text
方法。
有关 Finder
类的更多信息,请查看 在Widget测试里查找Widget
。
void main() { testWidgets('MyWidget has a title and message', (WidgetTester tester) async { await tester.pumpWidget(MyWidget(title: 'T', message: 'M')); // Create our Finders final titleFinder = find.text('T'); final messageFinder = find.text('M'); }); } 复制代码
6. 使用 Matcher
验证我们的Widget是否工作正常。
最后,我们可以使用 flutter_test
包提供的 Matcher
常量来验证title和message Text Widgets是否出现在屏幕。 Matcher
类是 test
包的核心部分,并且提供了通用的方式去验证给定的值是否符合我们的期望。
在这个例子里,我们想要我们的Widgets只在屏幕出现一次。因此,我们可以使用 findsOneWidget
这个 Matcher
。
void main() { testWidgets('MyWidget has a title and message', (WidgetTester tester) async { await tester.pumpWidget(MyWidget(title: 'T', message: 'M')); final titleFinder = find.text('T'); final messageFinder = find.text('M'); // Use the `findsOneWidget` matcher provided by flutter_test to verify our // Text Widgets appear exactly once in the Widget tree expect(titleFinder, findsOneWidget); expect(messageFinder, findsOneWidget); }); } 复制代码
额外的 Matcher
:
在 findsOneWidget
以外, flutter_test
为常见用例提供了额外的 Matcher
:
-
findsNothing
验证没有Widget被找到。
-
findsWidgets
验证一个或者多个Widget被找到。
-
findsNWidgets
验证指定数量的Widget被找到。
完整示例:
import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { // Define a test. The TestWidgets function will also provide a WidgetTester // for us to work with. The WidgetTester will allow us to build and interact // with Widgets in the test environment. testWidgets('MyWidget has a title and message', (WidgetTester tester) async { // Create the Widget tell the tester to build it await tester.pumpWidget(MyWidget(title: 'T', message: 'M')); // Create our Finders final titleFinder = find.text('T'); final messageFinder = find.text('M'); // Use the `findsOneWidget` matcher provided by flutter_test to verify our // Text Widgets appear exactly once in the Widget tree expect(titleFinder, findsOneWidget); expect(messageFinder, findsOneWidget); }); } class MyWidget extends StatelessWidget { final String title; final String message; const MyWidget({ Key key, @required this.title, @required this.message, }) : super(key: key); @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', home: Scaffold( appBar: AppBar( title: Text(title), ), body: Center( child: Text(message), ), ), ); } } 复制代码
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 协作翻译 | 单元测试和测试驱动开发 TDD 是怎么回事?
- Testing Flutter apps翻译-单元测试简介
- Metasploit 渗透测试手册第三版 第二章 信息收集与扫描(翻译)
- 基于 Laravel、Lumen 框架集成百度翻译、有道翻译、Google 翻译扩展包
- 腾讯发布人工智能辅助翻译 致敬人工翻译
- golang调用baidu翻译api实现自动翻译
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Twitter Power
Joel Comm / Wiley / 2009-02-17 / USD 24.95
"Arguably, one of the best tomes...Twitter Power is jam-packed with clever ways to start and dominate a marketplace." (Brandopia.typepad.com, March 23rd 2009) “For months I......一起来看看 《Twitter Power》 这本书的介绍吧!
Base64 编码/解码
Base64 编码/解码
SHA 加密
SHA 加密工具