最近一直斷斷續續的學習flutter,今天跟你們介紹一下flutter driver測試。html
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 UI自動化測試,他的執行過程通常須要在模擬器或真機上啓動App,模擬用戶的點擊、輸入操做,從而完成功能的驗證。async
https://book.flutterchina.club/chapter2/first_flutter_app.htmlide
下面涉及到的文件以下:單元測試
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.