flutter driver 集成測試

最近一直斷斷續續的學習flutter,今天跟你們介紹一下flutter driver測試。html

flutter測試基礎

Flutter的測試遵循Android的測試規範進行了分層。shell

  • 單元測試:測試單一功能、方法或類。例如,被測單元的外部依賴性一般被模擬出來,如package:mockito。api

  • widget 測試:(在其它UI框架稱爲 組件測試) 測試的單個widget。(咱們要開發一個UI界面,須要經過組合其它Widget來實現,Flutter中,一切都是Widget!)瀏覽器

  • 集成測試: 測試一個完整的應用程序或應用程序的很大一部分。一般,集成測試能夠在真實設備或OS仿真器上運行,例如iOS Simulator或Android Emulator。app

不一樣類型測試之間簡單對比:框架

單元測試 widget測試 集成測試
Confidence Low Higher Highest
維護成本 Low Higher Highest
依賴 Few More Lots
執行速度 Quick Slower

flutter driver 集成測試

集成測試就是咱們最常看到的 Flutter UI自動化測試,他的執行過程通常須要在模擬器或真機上啓動App,模擬用戶的點擊、輸入操做,從而完成功能的驗證。async

  1. 首先,你要建立第一個flutter應用。

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

下面涉及到的文件以下:單元測試

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.
相關文章
相關標籤/搜索