博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Testing Flutter apps翻译-性能分析
阅读量:7197 次
发布时间:2019-06-29

本文共 3904 字,大约阅读时间需要 13 分钟。

当我们说到移动开发,性能对用户体验是极其重要的。用户希望应用程序的滚动是平滑的,动画是有意义的,程序没有卡顿和被跳过的帧,这被称作“jank.” (什么东西?但是原文是这个)。我们如何确保我们的应用程序在各种设备上都不受任何影响?

这里有两条选择:

  1. 我们可以在不同的设备上手动测试应用程序。这种方法可能只适用于小型应用程序,随着应用的变大这种方法将会变的非常麻烦。
  2. 我们可以运行集成测试去执行一个具体的任务并且记录性能时间线。然后,我们需要查看结果再去确定我们应用程序的特定部分代码是否需要被优化。

在本文里,我们将会学习到当执行一个特定的任务的时候如何编写记录性能时间线的测试,并且将结果摘要记录到本地文件。

步骤:

  1. 编写一个滚动列表的测试。
  2. 记录应用程序的性能。
  3. 保存结果到磁盘。
  4. 运行测试。
  5. 查看保存的结果。

1. 编写一个滚动列表的测试。

在本文里,我们将会记录一个列表应用程序的性能。为了聚焦在性能分析上,本文代码基于 这篇文章。

请根据本文讲解创建一个应用程序,一个可测试的应用程序,并且编写测试代码去验证一切是否按预期工作。

2. 记录应用程序的性能。

下一步,我们需要记录应用程序在滚动时候的性能。为了完成这个任务,我们可以使用提供的 方法。

此方法运行传入的函数参数并记录,其中包含有关应用程序性能的详细信息。在这个例子里,我们提供了一个函数去滚动列表,确保一个特定的 item 被显示。当这个函数完成以后,这个traceAction方法返回一个Timeline

// Record a performance timeline as we scroll through the list of itemsfinal timeline = await driver.traceAction(() async {  await driver.scrollUntilVisible(    listFinder,    itemFinder,    dyScroll: -300.0,  );  expect(await driver.getText(itemFinder), 'Item 50');});复制代码

3. 保存结果到磁盘。

现在我们得到了一个性能分析时间线,我们需要一个方法去查看它!这个Timeline对象提供了发生过的所有事件的详细信息,但是没有提供一个方便的方法去查看结果。

所以,我们可以转换Timeline为。这个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 disksummary.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);    });  });}复制代码

转载地址:http://zwakm.baihongyu.com/

你可能感兴趣的文章
linux笔记:linux常用命令-关机重启命令
查看>>
Configuring and troubleshooting a Schema Provider
查看>>
Windows环境安装MySQL数据库
查看>>
javascript函数以及作用域简介
查看>>
Windows Phone 编程中页面间传值方法 - [WP开发]
查看>>
apollo实现c#与android消息推送(四)
查看>>
Python入门之基础语法
查看>>
poj 2714 Random Walk
查看>>
jQuery 属性操作方法
查看>>
LeetCode——Longest Consecutive Sequence
查看>>
Activity转换为View和把图片转换为View
查看>>
參考mudo logging写的win下logging
查看>>
云数据库PolarDB(一)
查看>>
[数据结构] 迷宫问题(栈和队列,深搜和广搜)
查看>>
找不到对象?也许你应该这样做
查看>>
Hadoop集群动态服役新的数据节点&&退役数据节点
查看>>
springMVC中不通过注解方式获取指定Service的javabean
查看>>
Kruskal算法(求最小生成树)
查看>>
JavaScript-事件周期-点击替换颜色
查看>>
c# 遍历文件夹及其所有文件
查看>>