Flutter屏幕快照插件playbook_snapshot的使用

Flutter屏幕快照插件playbook_snapshot的使用

Playbook

一个用于隔离开发UI组件并自动捕获其快照的库。

Playbook #

Playbook 是一个提供沙箱环境的库,用于构建UI组件时无需担心应用程序特定的依赖项。它深受JavaScript前端开发工具Storybook的启发。

通过使用Playbook构建的组件可以生成独立的应用程序作为动态样式指南。这不仅可以让您快速审查UI,还可以通过将业务逻辑从组件中分离出来交付更健壮的设计。

此外,每个组件的快照可以通过单元测试自动生成,并且可以使用任意第三方工具进行视觉回归测试。

对于复杂的现代应用程序开发来说,在敏感地捕捉UI更改并更快地改进它们方面至关重要。有了Playbook,您无需费力准备数据,也不必花费人力资源进行手动测试。


Playbook #

Playbook 组件以场景的形式唯一存储。一个Scenario定义了组件的布局方式。

Playbook(
  stories: [
    Story(
      'Home',
      scenarios: [
        Scenario(
          'CategoryHome',
          layout: ScenarioLayout.fill(),
          child: CategoryHome(userData: UserData.stub),
        ),
        Scenario(
          'LandmarkList',
          layout: ScenarioLayout.fill(),
          child: Scaffold(
            appBar: AppBar(),
            body: LandmarkList(userData: UserData.stub),
          ),
        ),
        Scenario(
          'Container red',
          layout: ScenarioLayout.fixed(100, 100),
          child: Container(color: Colors.red),
        ),
      ],
    ),
  ],
);

PlaybookUI #

PlaybookUI 提供用户界面来浏览场景列表。

PlaybookGallery

组件的可视化效果列出来并展示。在顶部屏幕上显示的内容实际上并没有进行布局,而是运行时高效生成的快照。

浏览器 详细信息

PlaybookSnapshot #

场景可以通过符合TestTool类的实例进行测试。Snapshot就是其中之一,它可以生成所有场景的快照,并模拟给定设备的屏幕尺寸和安全区域。

Future<void> main() async {
  testWidgets('Take snapshots', (tester) async {
    await Playbook(
      stories: [
        barStory(),
        fooWidgetStory(),
        assetImageStory(),
        homePageStory(),
        scrollableStory(),
      ],
    ).run(
      Snapshot(
        devices: [SnapshotDevice.iPhoneSE2nd],
      ),
      (widget, device) {
        return MaterialApp(
          debugShowCheckedModeBanner: false,
          theme: ThemeData(
            fontFamily: 'Roboto',
            platform: device.platform,
          ),
          home: widget,
        );
      },
    );
  });
}

生成快照

配置

可以在pubspec.yaml中配置字体文件的位置和快照输出目录路径。

playbook_snapshot:
  fonts:
    - family: Roboto
      fonts:
        - asset: assets/fonts/Roboto-Regular.ttf
  # 默认为/snapshots
  snapshot_dir: iOS
  # 默认为空
  sub_dir: service

上述设置后,快照将保存在以下目录中:

/test/iOS/${DeviceName}/service/${StoryTitle}/${ScenarioTitle}.png

如果要动态更改路径,可以在Snapshot中使用snapshotDirsubDir参数。

注意事项

Snapshot(内部实现为flutter test --update-goldens)需要您自行准备和加载字体。通过在flutterplaybook_snapshot中定义字体文件位置,并在目录中准备好字体文件,字体文件将自动加载。

flutter:
  fonts:
    - family: Roboto
      fonts:
        - asset: assets/fonts/Roboto-Regular.ttf

或者

playbook_snapshot:
  fonts:
    - family: Roboto
      fonts:
        - asset: assets/fonts/Roboto-Regular.ttf

然后需要在目录中准备好字体文件。


PlaybookGenerator #

支持从任何.dart文件中生成故事和场景。

// some_story.dart

const storyTitle = 'Home';

@GenerateScenario(
  layout: ScenarioLayout.fill(),
)
Widget $CategoryHome() => CategoryHome(userData: UserData.stub);

@GenerateScenario(
  layout: ScenarioLayout.fill(),
)
Widget $LandmarkList() => Scaffold(
      appBar: AppBar(),
      body: LandmarkList(userData: UserData.stub),
    );

@GenerateScenario(
  title: 'Container red',
  layout: ScenarioLayout.fixed(100, 100),
)
Widget containerRed() => Container(color: Colors.red);

@GenerateScenario(
  title: 'Device pixel ratio',
  layout: ScenarioLayout.fixed(300, 300),
)
Widget devicePixelRatio(BuildContext context) =>
    Text('Device pixel ratio is ${MediaQuery.of(context).devicePixelRatio}');

您可以引用playbook实例。

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Playbook Demo',
      theme: ThemeData.light(),
      home: PlaybookGallery(
        title: 'Sample app',
        playbook: playbook,
      ),
    );
  }
}

可以在build.yaml中设置glob以查找资产和输出文件名。默认输入值为lib/**.dart,输出值为generated_playbook.dart

targets:
  $default:
    builders:
      playbook_generator:stories:
        options:
          input: lib/**.dart
          output: generated_playbook.dart

更多关于Flutter屏幕快照插件playbook_snapshot的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter屏幕快照插件playbook_snapshot的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


playbook_snapshot 是一个用于在 Flutter 应用中生成屏幕快照的插件。它通常用于在测试过程中捕获应用的 UI 状态,以确保 UI 在不同设备和屏幕尺寸下的一致性。以下是使用 playbook_snapshot 插件的基本步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 playbook_snapshot 插件的依赖项:

dev_dependencies:
  playbook_snapshot: ^0.0.1

然后运行 flutter pub get 以获取依赖。

2. 创建快照测试

接下来,你可以创建一个快照测试。快照测试通常用于验证应用的 UI 是否按预期渲染。

import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:playbook_snapshot/playbook_snapshot.dart';

void main() {
  testWidgets('Test HomePage UI', (WidgetTester tester) async {
    // 构建你的应用
    await tester.pumpWidget(MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Home Page'),
        ),
        body: Center(
          child: Text('Hello, World!'),
        ),
      ),
    ));

    // 使用 playbook_snapshot 生成快照
    await playbookSnapshot(tester, 'home_page_snapshot');
  });
}

3. 配置快照路径

在运行测试之前,你可能需要配置快照的保存路径。你可以在 flutter_test_config.dart 文件中进行配置:

import 'package:playbook_snapshot/playbook_snapshot.dart';

void main() {
  playbookSnapshotConfig = PlaybookSnapshotConfig(
    snapshotDirectory: 'test/snapshots',
  );
}

4. 运行测试

你可以使用以下命令运行测试并生成快照:

flutter test --update-goldens

--update-goldens 标志会更新或创建新的快照文件。如果没有这个标志,测试将会验证现有的快照是否与当前 UI 一致。

5. 验证快照

在后续的测试运行中,playbook_snapshot 将会比较新的快照与之前保存的快照。如果两者不一致,测试将会失败,提示你需要检查 UI 的变化。

6. 处理快照差异

如果快照不一致,你可以选择接受新的快照或修复 UI 问题。如果新的快照是正确的,你可以再次运行测试并更新快照:

flutter test --update-goldens

7. 集成到 CI/CD

你可以将快照测试集成到你的 CI/CD 管道中,以确保每次代码更改都不会意外地改变 UI。

8. 自定义快照选项

playbook_snapshot 提供了多种选项来自定义快照的生成和比较过程。你可以通过 PlaybookSnapshotConfig 来配置这些选项,例如设置快照的分辨率、忽略某些区域等。

playbookSnapshotConfig = PlaybookSnapshotConfig(
  snapshotDirectory: 'test/snapshots',
  resolution: Resolution(devicePixelRatio: 2.0),
  ignoreAreas: [
    Rect.fromLTWH(0, 0, 100, 100),
  ],
);
回到顶部