最近一直断断续续的学习flutter,今天跟大家介绍一下flutter driver测试。

flutter测试基础

Flutter的测试遵循Android的测试规范进行了分层。

  • 单元测试:测试单一功能、方法或类。例如,被测单元的外部依赖性通常被模拟出来,如package:mockito。

  • widget 测试:(在其它UI框架称为 组件测试) 测试的单个widget。(我们要开发一个UI界面,需要通过组合其它Widget来实现,Flutter中,一切都是Widget!)

  • 集成测试: 测试一个完整的应用程序或应用程序的很大一部分。通常,集成测试可以在真实设备或OS仿真器上运行,例如iOS Simulator或Android Emulator。

不同类型测试之间简单对比:

单元测试 widget测试 集成测试
Confidence Low Higher Highest
维护成本 Low Higher Highest
依赖 Few More Lots
执行速度 Quick Slower

flutter driver 集成测试

集成测试就是我们最常看到的 Flutter UI自动化测试,他的执行过程一般需要在模拟器或真机上启动App,模拟用户的点击、输入操作,从而完成功能的验证。

  1. 首先,你要创建第一个flutter应用。

https://book.flutterchina.club/chapter2/first_flutter_app.html

下面涉及到的文件如下:

flutter_app/
├── lib/
│ └── .dart
├── test_driver/
| ├── app.dart
| └── app_test.dart
├── pubspec.yaml
  1. pubspec.yaml 文件中,添加flutter_driver插件,所以 flutter_driver并不是创建项目标配的,需要你额外安装。
dev_dependencies:
test: ^1.5.1
flutter_test:
sdk: flutter
flutter_driver:
sdk: flutter

然后在flutter应用根目录下执行命令:

flutter_app> flutter pub get
Running "flutter pub get" in flutter_app... 0.6s
  1. 在项目的跟目录下创建test_driver目录,分别在该目录下创建app.dartapp_test.dart文件。

一个指令化的应用程序是一个Flutter应用程序,它启用了Flutter Driver 扩展。启用扩展请调用enableFlutterDriverExtension()。app.dart文件内容如下:

// 导入扩展
import 'package:flutter_driver/driver_extension.dart';
// 导入main入口文件
import 'package:flutter_app/main.dart' as app; void main() {
// 启用扩展
enableFlutterDriverExtension(); app.main();
}

集成测试是一个简单的package:test测试,它使用Flutter Driver API告诉应用程序执行什么操作,然后验证应用程序是否执行了此操作。

编写继承测试用例,app_test.dart文件内容如下:

import 'dart:io';
// Imports the Flutter Driver API
import 'package:flutter_driver/flutter_driver.dart';
import 'package:test/test.dart'; void main() {
group('计数器测试', () { final counterTextFinder = find.byValueKey('counter');
FlutterDriver driver; setUpAll(() async {
driver = await FlutterDriver.connect();
sleep(Duration(seconds: 2));
}); tearDownAll(() async {
if (driver != null) {
driver.close();
}
}); // 第一条用例
test('starts at 1', () async {
expect(await driver.getText(counterTextFinder), "0");
}); // 第二条用例
test('increments the counter', () async {
driver.tap(find.byTooltip("Increment"));
expect(await driver.getText(counterTextFinder), "1");
}); });
}

作为一个有多年测试经验的同学,单纯学习元素定位和断言也花了我半天时间。

setUpAll() & tearDownAll() :定义用例开始和结束的执行动作。

driver = await FlutterDriver.connect();

链接接app,这是App测试的入口。

driver.close();

关闭浏览器。

driver.tap()
driver.enterText()
driver.getText()
...

flutter常用操作,触摸、输入和获取文本等。

find.byValueKey()
find.byTooltip()
...

元素定位,Flutter driver提供了好几种定位方式。

expect()

断言方法,断言两个值是否相等。

flutter driver API:

https://api.flutter.dev/flutter/flutter_driver/flutter_driver-library.html

运行集成测试

最后,如何运行集成测试:

flutter_app> flutter drive --target=./test_driver/app.dart

Using device Android SDK built for x86.
Starting application: ./test_driver/app.dart
Installing build\app\outputs\apk\app.apk... 1.5s
Running Gradle task 'assembleDebug'...
Running Gradle task 'assembleDebug'... Done 2.4s
✓ Built build\app\outputs\apk\debug\app-debug.apk.
I/flutter (16043): Observatory listening on http://127.0.0.1:58900/uUbkcJhS5qM=/
00:00 +0: 计数器测试 (setUpAll) VMServiceFlutterDriver: Connecting to Flutter application at http://127.0.0.1:54121/uUbkcJhS5qM=/
VMServiceFlutterDriver: Isolate found with number: 4454864095217843
VMServiceFlutterDriver: Isolate is paused at start.
VMServiceFlutterDriver: Attempting to resume isolate
VMServiceFlutterDriver: Waiting for service extension
VMServiceFlutterDriver: Connected to Flutter application.
00:03 +0: 计数器测试 starts at 1 00:03 +1: 计数器测试 increments the counter 点击 add Icon 断言计数器加1 00:03 +2: 计数器测试 (tearDownAll) 00:03 +2: All tests passed! Stopping application instance.

最新文章

  1. Visual Studio问题集锦:coloader80.dll未正确安装
  2. ABAP中的数据校验-备注
  3. ExpandableListView的用法
  4. 部署AlwaysOn第一步:搭建Windows服务器故障转移集群
  5. sourcetree跳过注册的方法
  6. 安卓TV开发(七) 移动智能终端多媒体之在线解析网页视频源
  7. Neo4j之坑
  8. [转帖]Runtime, Engine, VM 的区别是什么?
  9. 【LGR-049】洛谷7月月赛
  10. 潭州课堂25班:Ph201805201 爬虫高级 第六课 sclapy 框架 中间建 与selenium对接 (课堂笔记)
  11. fatal error C1083: 无法打开编译器生成的文件:“../../build/vs71/release/lib_json\json_value.asm”: No such file or directory
  12. 我在tmux中最不可少的配置: 用鼠标切换窗口/调节分屏大小
  13. SQL-39 使用索引
  14. 利用shell连接服务器
  15. linq的语法和案例
  16. MIUI7,Android版本5.0.2,一个程序发送自定义广播,另一个程序没有接收到
  17. [Linux]C语言Linux系统编程创建进程
  18. PAT——1061. 判断题
  19. 每日英语:When Social Skills Are A Warning
  20. 【小梅哥SOPC学习笔记】切换NIOS II CPU的主内存后软件中需要注意的几点设置

热门文章

  1. C#LeetCode刷题-设计
  2. C#LeetCode刷题之#345-反转字符串中的元音字母​​​​​​​(Reverse Vowels of a String)
  3. Remix+Geth 实现智能合约部署和调用详解
  4. 用Python爬取股票数据,绘制K线和均线并用机器学习预测股价(来自我出的书)
  5. HTML基础-04
  6. 旧 WCF 项目迁移到 asp.net core + gRPC 的尝试
  7. NOIP真题索引
  8. JavaScript设计模式之策略模式【组合委托】
  9. unity探索者之UGUI圆形图片组件
  10. 源码解析JDK1.8-HashMap链表成环的问题解决方案