flutter driver 集成测试
最近一直断断续续的学习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,模拟用户的点击、输入操作,从而完成功能的验证。
- 首先,你要创建第一个flutter应用。
https://book.flutterchina.club/chapter2/first_flutter_app.html

下面涉及到的文件如下:
flutter_app/
├── lib/
│ └── .dart
├── test_driver/
| ├── app.dart
| └── app_test.dart
├── pubspec.yaml
- 在
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
- 在项目的跟目录下创建
test_driver目录,分别在该目录下创建app.dart和app_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.
flutter driver 集成测试的更多相关文章
- Flutter环境搭建以及快捷命令
Flutter环境搭建 配置环境变量 用户变量 FLUTTER_STORAGE_BASE_URL : https://storage.flutter-io.cn PUB_HOSTED_URL : ht ...
- 深入linux kernel内核配置选项
============================================================================== 深入linux kernel内核配置选项 ...
- Maven提高篇系列之(二)——配置Plugin到某个Phase(以Selenium集成测试为例)
这是一个Maven提高篇的系列,包含有以下文章: Maven提高篇系列之(一)——多模块 vs 继承 Maven提高篇系列之(二)——配置Plugin到某个Phase(以Selenium集成测试为例) ...
- web项目的集成测试:模拟点击
利用模拟点击的方式进行集成测试,我们准备用google,Firefox和ie三种浏览器测试. 其中除了Firefox是模拟点击的鼻祖不需要插件外,谷歌和ie需要另外下载插件 chromedriver. ...
- [Flutter] Windows/MacOS Flutter 环境走一遍
Windows Install 1.系统需要:> win7 > 400M磁盘空间 Windows PowerShell(Windows 搜索框中找) Git for Windows 2.x ...
- Flutter 安装
都说程序猿学习是不分平台的,做了一辈子的Xaml,也想看看现在最牛逼的移动技术. 看了看Google 的Flutter,好像很牛逼,不怎么需要Android和IOS基础(应该还是要的), 不过现在是B ...
- 基于spring-boot的应用程序的单元+集成测试方案
目录 概述 概念解析 单元测试和集成测试 Mock和Stub 技术实现 单元测试 测试常规的bean 测试Controller 测试持久层 集成测试 从Controller开始测试 从中间层开始测试 ...
- .netcore持续集成测试篇之web项目验收测试
系列目录 通过前面的单元测试,我们能够保证项目的基本模块功能逻辑是正常的,通过集成测试能够保证接口的请求是正常的.然而最终项目交付我们还需要对项目进行页面的行为进行测试,比如页面布局是否正常,按钮是否 ...
- 如何开发优质的 Flutter App:Flutter App 软件测试指南
继上一场GitChat文章发布之后,博主又为朋友们带来另一场Chat.这一次我们主要聊一聊Flutter App的测试环节. 众所周知,应用的功能越多,手动测试的难度就越大.一套完整的自动化测试将帮助 ...
随机推荐
- Quartz.Net的基础使用方法,多任务执行继续扩展
前一篇随笔讲了Quartz多任务的简单实现 Quartz.Net的基础使用方法,多任务执行 这一篇,来简单对前一篇进行一下简单的扩展 看了前一篇的代码会发现,每次新增一个任务还要去GetJobs方法里 ...
- python新添加excel数据
相关库 import os import xlwt from xlrd import open_workbook from xlutils.copy import copy 1.判断是否存在xls文件 ...
- 看完就能掌握的PHP核心技术 - 面向对象
继承和多态 类的组合与继承 假设我们有两个类,一个 person,另外一个是 family:在 family 类中我们创建 person 类中的对象,并且我们把这个对象视为 family 类的一个属性 ...
- 面试中的老大难-mysql事务和锁,一次性讲清楚!
众所周知,事务和锁是mysql中非常重要功能,同时也是面试的重点和难点.本文会详细介绍事务和锁的相关概念及其实现原理,相信大家看完之后,一定会对事务和锁有更加深入的理解. 本文主要内容是根据掘金小册& ...
- 面经手册 · 第4篇《HashMap数据插入、查找、删除、遍历,源码分析》
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 在上一章节我们讲解并用数据验证了,HashMap中的,散列表的实现.扰动函数.负载因 ...
- 第二章 Kuberbetes实践指南
kubernetes安装与配置 网络,安全,服务启动配置 参考: kubernetes权威指南第二版 kubectl命令行工具用法详解 kubectl [command] [type] [name] ...
- 《Java从入门到失业》第一章:计算机基础知识(一):二进制和十六进制
0 前言 最近7年来的高强度工作和不规律的饮食作息,压得我有些喘不过气,身体也陆续报警.2018年下半年的一场病,让我意识到了这个问题的严重性,于是开始强制自己有规律饮食和作息,并辅以健身锻炼,不到2 ...
- 群晖系统设置链路聚合并配置静态IP的教程【江东网 JDX86.COM】
1.进入控制面板 > 网络 > 网络接口.请单击创建 > 创建 Bond 2.进入聚合配置向导,选择你想要的模式,这里有几种模式意思分别为: 自适应负载平衡: 此模式优化了 Syno ...
- 2.MongoDB 4.2副本集环境基于时间点的恢复
(一)MongoDB恢复概述 对于任何数据库,如果要将数据库恢复到过去的任意时间点,否需要有过去某个时间点的全备+全备之后的重做日志. 接下来根据瑞丽航空的情况进行概述: 全备:每天晚上都会进行备份: ...
- 更换IntelliJ Idea的Terminal为git_home/bin/sh.exe命令端程序
idea中默认的terminal形式: 1.在IDEA中,打开settings,设置相应的bash路径 settings–>Tools–>Terminal–>Shell path:C ...