最近一直断断续续的学习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.

flutter driver 集成测试的更多相关文章

  1. Flutter环境搭建以及快捷命令

    Flutter环境搭建 配置环境变量 用户变量 FLUTTER_STORAGE_BASE_URL : https://storage.flutter-io.cn PUB_HOSTED_URL : ht ...

  2. 深入linux kernel内核配置选项

    ============================================================================== 深入linux kernel内核配置选项 ...

  3. Maven提高篇系列之(二)——配置Plugin到某个Phase(以Selenium集成测试为例)

    这是一个Maven提高篇的系列,包含有以下文章: Maven提高篇系列之(一)——多模块 vs 继承 Maven提高篇系列之(二)——配置Plugin到某个Phase(以Selenium集成测试为例) ...

  4. web项目的集成测试:模拟点击

    利用模拟点击的方式进行集成测试,我们准备用google,Firefox和ie三种浏览器测试. 其中除了Firefox是模拟点击的鼻祖不需要插件外,谷歌和ie需要另外下载插件 chromedriver. ...

  5. [Flutter] Windows/MacOS Flutter 环境走一遍

    Windows Install 1.系统需要:> win7 > 400M磁盘空间 Windows PowerShell(Windows 搜索框中找) Git for Windows 2.x ...

  6. Flutter 安装

    都说程序猿学习是不分平台的,做了一辈子的Xaml,也想看看现在最牛逼的移动技术. 看了看Google 的Flutter,好像很牛逼,不怎么需要Android和IOS基础(应该还是要的), 不过现在是B ...

  7. 基于spring-boot的应用程序的单元+集成测试方案

    目录 概述 概念解析 单元测试和集成测试 Mock和Stub 技术实现 单元测试 测试常规的bean 测试Controller 测试持久层 集成测试 从Controller开始测试 从中间层开始测试 ...

  8. .netcore持续集成测试篇之web项目验收测试

    系列目录 通过前面的单元测试,我们能够保证项目的基本模块功能逻辑是正常的,通过集成测试能够保证接口的请求是正常的.然而最终项目交付我们还需要对项目进行页面的行为进行测试,比如页面布局是否正常,按钮是否 ...

  9. 如何开发优质的 Flutter App:Flutter App 软件测试指南

    继上一场GitChat文章发布之后,博主又为朋友们带来另一场Chat.这一次我们主要聊一聊Flutter App的测试环节. 众所周知,应用的功能越多,手动测试的难度就越大.一套完整的自动化测试将帮助 ...

随机推荐

  1. Who Am I? Personality Detection based on Deep Learning for Texts 阅读笔记

    文章目录 源代码github地址 摘要 2CLSTM 过程 1. 词嵌入 2. 2LSTM处理 3. CNN学习LSGCNN学习LSG 4. Softmax分类 源代码github地址 https:/ ...

  2. HTML实例-01-轮播图

     body部分 <div class="outer"> <ul class="img-list"> <li><a hr ...

  3. python设计模式之享元模式

    python设计模式之享元模式 由于对象创建的开销,面向对象的系统可能会面临性能问题.性能问题通常在资源受限的嵌入式系统中出现,比如智能手机和平板电脑.大型复杂系统中也可能会出现同样的问题,因为要在其 ...

  4. 题解 poj 3304

    题目描述 线段和直线判交板子题 分析题目,如果存在这一条直线,那么过这条直线作垂线,一定有一条垂线穿过所有线段,否则不存在.题目转化为寻找一条直线与所有线段有交点. 直线线段判交方法: 1.先判断线段 ...

  5. 【Leetcode 做题学算法周刊】第八期

    首发于微信公众号<前端成长记>,写于 2020.05.07 背景 本文记录刷题过程中的整个思考过程,以供参考.主要内容涵盖: 题目分析设想 编写代码验证 查阅他人解法 思考总结 目录 15 ...

  6. go语言gRPC系列(二) - 为gRPC添加证书

    1. 前言 2. 生成自签证书 2.1 MAC生成自签证书的教程链接: 2.2 Windows生成自签证书的教程 3. 改造服务端使用自签证书 3.1 复制证书至代码下 3.2 改造代码添加证书认证 ...

  7. 浅谈个人学DP的经历和感受

    动态规划的定义! 首先,我们看一下官方定义:定义:动态规划算法是通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推(或者说分治)的方式去解决.动态规划算法的基本思想与分治法类似,也是将待求 ...

  8. Salesforce学习笔记之Actions and Recommendations(续)

    上次对这个Actions and Recommendations进行了初步研究,因为一些问题没有得到很好的解决,又花了很多时间,终于得到了一个比较好的解决方案.小结一下. 1. 生成Actions a ...

  9. generate_fixed_frame()方法生成Java方法栈帧

    在从generate_normal_entry()函数调用generate_fixed_frame()函数时的栈与寄存器的状态如下: 栈的状态如下图所示. 各个寄存器的状态如下所示. rax: ret ...

  10. 使用MSF通过MS17-010获取系统权限

    ---恢复内容开始--- Step1:开启postgresql数据库: /etc/init.d/postgresql start Step2:进入MSF中,搜索cve17-010相关的exp: sea ...