Testing Flutter apps翻譯-性能分析

翻譯首頁html

當咱們說到移動開發,性能對用戶體驗是極其重要的。用戶但願應用程序的滾動是平滑的,動畫是有意義的,程序沒有卡頓和被跳過的幀,這被稱做「jank.」 (什麼東西?可是原文是這個)。咱們如何確保咱們的應用程序在各類設備上都不受任何影響?chrome

這裏有兩條選擇:json

  1. 咱們能夠在不一樣的設備上手動測試應用程序。這種方法可能只適用於小型應用程序,隨着應用的變大這種方法將會變的很是麻煩。
  2. 咱們能夠運行集成測試去執行一個具體的任務而且記錄性能時間線。而後,咱們須要查看結果再去肯定咱們應用程序的特定部分代碼是否須要被優化。

在本文裏,咱們將會學習到當執行一個特定的任務的時候如何編寫記錄性能時間線的測試,而且將結果摘要記錄到本地文件。api

步驟:瀏覽器

  1. 編寫一個滾動列表的測試。
  2. 記錄應用程序的性能。
  3. 保存結果到磁盤。
  4. 運行測試。
  5. 查看保存的結果。

1. 編寫一個滾動列表的測試。

在本文裏,咱們將會記錄一個列表應用程序的性能。爲了聚焦在性能分析上,本文代碼基於 Scrolling in integration tests 這篇文章。bash

請根據本文講解建立一個應用程序,一個可測試的應用程序,而且編寫測試代碼去驗證一切是否按預期工做。app

2. 記錄應用程序的性能。

下一步,咱們須要記錄應用程序在滾動時候的性能。爲了完成這個任務,咱們可使用FlutterDriver提供的traceAction 方法。async

此方法運行傳入的函數參數並記錄Timeline,其中包含有關應用程序性能的詳細信息。在這個例子裏,咱們提供了一個函數去滾動列表,確保一個特定的 item 被顯示。當這個函數完成之後,這個traceAction方法返回一個Timeline編輯器

// Record a performance timeline as we scroll through the list of items
final timeline = await driver.traceAction(() async {
  await driver.scrollUntilVisible(
    listFinder,
    itemFinder,
    dyScroll: -300.0,
  );

  expect(await driver.getText(itemFinder), 'Item 50');
});
複製代碼

3. 保存結果到磁盤。

如今咱們獲得了一個性能分析時間線,咱們須要一個方法去查看它!這個Timeline對象提供了發生過的全部事件的詳細信息,可是沒有提供一個方便的方法去查看結果。函數

因此,咱們能夠轉換TimelineTimelineSummary。這個TimelineSummary能夠執行兩個任務來讓查看Timeline結果變的簡單:

  1. 它能夠在硬盤寫一個包含了Timeline彙總數據的json文檔。這個彙總包括了跳過的幀的數量,最慢的build時間等信息。
  2. 它能將已完成的Timeline保存爲json文件存儲到硬盤裏。這個文件能夠用Chrome瀏覽器的chrome://tracing頁面中的跟蹤工具打開。
// Convert the Timeline into a TimelineSummary that's easier to read and // understand. final summary = new TimelineSummary.summarize(timeline); // Then, save the summary to disk summary.writeSummaryToFile('scrolling_summary', pretty: true); // Optionally, write the entire timeline to disk in a json format. This // file can be opened in the Chrome browser's tracing tools found by
// navigating to chrome://tracing.
summary.writeTimelineToFile('scrolling_timeline', pretty: true);
複製代碼

4. 運行測試。

在咱們配置咱們的測試去捕獲Timeline的性能分析結果並編寫將結果保存到硬盤的代碼之後,咱們能夠運行下面的命令來測試:

flutter drive --target=test_driver/app.dart
複製代碼

5. 查看保存的結果。

在測試完成之後,項目根目錄的build文件夾下面會生成兩個文件:

  1. scrolling_summary.timeline_summary.json 包含總結摘要。能夠用任意文本編輯器打開該文件以查看其中的信息。經過更高級的設置,咱們能夠保存每次測試運行的總結摘要而且能夠將這些結果作成圖表。
  2. scrolling_timeline.timeline.json 包含完成的timeline數據。 用Chrome瀏覽器的chrome://tracing頁面中的跟蹤工具打開該文件。這個追蹤工具提供了一個方便的界面來分析timeline數據,該工具能夠找到性能問題的源頭。

總結摘要文件內容的示例:

{
  "average_frame_build_time_millis": 4.2592592592592595,
  "worst_frame_build_time_millis": 21.0,
  "missed_frame_build_budget_count": 2,
  "average_frame_rasterizer_time_millis": 5.518518518518518,
  "worst_frame_rasterizer_time_millis": 51.0,
  "missed_frame_rasterizer_budget_count": 10,
  "frame_count": 54,
  "frame_build_times": [
    6874,
    5019,
    3638
  ],
  "frame_rasterizer_times": [
    51955,
    8468,
    3129
  ]
}
複製代碼

完整代碼:

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

void main() {
  group('Scrollable App', () {
    FlutterDriver driver;

    setUpAll(() async {
      driver = await FlutterDriver.connect();
    });

    tearDownAll(() async {
      if (driver != null) {
        driver.close();
      }
    });

    test('verifies the list contains a specific item', () async {
      final listFinder = find.byValueKey('long_list');
      final itemFinder = find.byValueKey('item_50_text');

      // Record a performance profile as we scroll through the list of items
      final timeline = await driver.traceAction(() async {
        await driver.scrollUntilVisible(
          listFinder,
          itemFinder,
          dyScroll: -300.0,
        );

        expect(await driver.getText(itemFinder), 'Item 50');
      });

      // Convert the Timeline into a TimelineSummary that's easier to read and // understand. final summary = new TimelineSummary.summarize(timeline); // Then, save the summary to disk summary.writeSummaryToFile('scrolling_summary', pretty: true); // Optionally, write the entire timeline to disk in a json format. This // file can be opened in the Chrome browser's tracing tools found by
      // navigating to chrome://tracing.
      summary.writeTimelineToFile('scrolling_timeline', pretty: true);
    });
  });
}
複製代碼
相關文章
相關標籤/搜索