Flutter 自动化测试 - 集成测试篇

Flutter 集成测试

没有接触过 Flutter 的同学请先看上篇文章 Flutter 应用自动化测试-开篇
Flutter 官方对 Flutter 应用测试类型做了三个阶段划分,分别为 Unit(单元)测试、Widget(组件)测试、Integration(集成)测试。按照维护成本来看的话从左到右依次增高,按照投资回报方面看的话依次是 Widget>Integration>Unit,而作为测试人员来说,我们主要关注点在集成测试这一类型。

官网对于集成测试的定义:

Unit(单元)测试和 Widget(组件)测试对于测试单个类、方法或者组件来讲非常方便,然而他们通常不会将各个部分作为整体一起进行测试,又或者是想要获取应用在真实设备上的表现,此时我们就需要集成测试了。

FlutterDriver

FlutterDriver 提供 API 去测试运行在真实设备和模拟器里面的 Flutter 应用,执行时会和测试脚本在不同的进程中,可以简单认为就是 Flutter 版本的 Selenium WebDriver

添加 FlutterDriver 依赖

上一篇文章有介绍 Flutter 工程的目录结构,其中 pubspec.yaml 文件可以对依赖和配置进行管理,类似于 Maven 工程的 pom.xml。找到 dev_denpendencies 添加如下配置

#2-4行配置是已存在默认配置,只需要添加5-6行即可
dev_dependencies:
  flutter_test:
    sdk: flutter
  flutter_driver:
    sdk: flutter
  test: any

其中

集成测试步骤

Step1:创建测试 App

使用上篇文章所创建的 Demo 工程,其中包括悬浮按钮和中间的文本显示,需要注意的是:默认 demo 没有给这些元素加上标识,而且 Flutter 中不支持 ID,一般通过 Key 属性进行标识(对应定位方法为 valueKey)。我们这里给悬浮按钮和中间的文本显示元素加上 key 属性:

image.png

Step2:创建 test 脚本

  1. 在工程根目录下创建 test_driver 文件夹
  2. 创建 xx.dart 文件:用于启动运行应用
  3. 创建 xx_test.dart 文件:Test 脚本文件

官方解释为什么需要创建这两支文件的原因:

集成测试中 TestCase 和应用运行在不同的进程中,所以需要 test_driver 目录里有两个文件分别用来执行应用和执行 TestCase。

image.png

Step3:开启 Flutterdriver 扩展支持

在 xx.dart 文件中添加如下代码:

import 'package:flutter_driver/driver_extension.dart';
import 'package:flutter_demo/main.dart' as app;

void main() {
  // 启用FlutterDriver扩展
  enableFlutterDriverExtension();

  // 启动执行应用
  app.main();
}

Step4:编写测试脚本

在 xx_test.dart 文件中添加如下代码:

import 'package:flutter_driver/flutter_driver.dart';
import 'package:test/test.dart';

void main() {
  group('Counter App', () {
    // 通过key属性定位元素
    final counterTextFinder = find.byValueKey('counter');
    final buttonFinder = find.byValueKey('increment');

    FlutterDriver driver;

    // 测试开始前链接FlutterDriver
    setUpAll(() async {
      driver = await FlutterDriver.connect();
    });

    // 测试结束后关闭FlutterDriver
    tearDownAll(() async {
      if (driver != null) {
        driver.close();
      }
    });

    // TestCase
    test('increments the counter', () async {
      // 点击悬浮增加count按钮
      await driver.tap(buttonFinder);
      await driver.tap(buttonFinder);
      // 验证count计数是否为2
      expect(await driver.getText(counterTextFinder), "2");
    });
  });
}

Step5:执行测试

  1. 连接设备,我们可以选择

    • 在 Windows 上测试 Android 设备/模拟器
    • 在 MacOs 上测试 Android 设备/模拟器 or iOS 设备/模拟器
  2. 在项目的根目录下开启命令终端

    flutter drive --target=test_driver/app.dart
    

    命令解释:

    • 构建目标 App 包并将其安装到设备/模拟器中
    • 启动目标 App
    • 运行 xx_test.dart

执行效果:

image.png

关于 FlutterDriver 实现自动化测试就介绍到这里,下篇给大家介绍利用 appium-flutter-driver 测试 Flutter 应用。

1 操作
shakebabe 在 2020-08-06 17:20:37 更新了该帖
4 回帖
请输入回帖内容 ...