Flutter自适应黄金测试插件adaptive_golden_test的使用

发布于 1周前 作者 yibo5220 来自 Flutter

Flutter自适应黄金测试插件adaptive_golden_test的使用

adaptive_golden_test 是一个用于在Flutter小部件测试期间生成自适应黄金文件的插件。它可以帮助开发者确保UI在不同设备和平台上的显示一致性,避免回归问题。以下是关于如何使用该插件的详细说明和一个完整的示例demo。

功能

使用此插件可以在测试中实现以下功能:

  • 为不同设备生成黄金文件
  • 加载自定义字体
  • 设置窗口大小和像素密度
  • 等待图像渲染完成
  • 渲染物理和系统UI层
  • 在测试中渲染键盘
  • 设置运行测试的首选操作系统
  • 配置文件比较的差异容差阈值

开始使用

1. 添加依赖

首先,在pubspec.yaml文件中添加adaptive_test到你的开发依赖项中:

dev_dependencies:
  adaptive_test: ^最新版本号

2. 创建flutter_test_config.dart

test文件夹的根目录下创建一个名为flutter_test_config.dart的文件,并添加以下代码:

import 'package:flutter_test/flutter_test.dart';
import 'package:adaptive_test/adaptive_test.dart';

Future<void> testExecutable(FutureOr<void> Function() testMain) async {
  TestWidgetsFlutterBinding.ensureInitialized();
  await loadFonts(); // 加载自定义字体
  setupFileComparatorWithThreshold(); // 设置差异阈值
  await testMain();
}

使用方法

1. 渲染自定义字体

步骤:

  1. 将字体文件添加到应用的资源文件夹中。
  2. pubspec.yaml中声明字体:
flutter:
  fonts:
    - family: Roboto
      fonts:
        - asset: fonts/Roboto-Black.ttf
  1. flutter_test_config.dart中调用loadFonts()以加载字体:
await loadFonts();

2. 设置测试设备

步骤:

  1. 定义一组设备变体:
final defaultDeviceConfigs = {
  Devices.ios.iPhoneSE,
  Devices.ios.iPhone12,
  Devices.ios.iPad,
  Devices.linux.laptop,
  Devices.android.pixel4,
  Devices.android.samsungGalaxyS20,
};
  1. 使用AdaptiveTestConfiguration单例设置设备变体:
AdaptiveTestConfiguration.instance
  ..setDeviceVariants(defaultDeviceConfigs);

3. 配置差异阈值

为了允许处理器之间的微小像素差异,可以在flutter_test_config.dart中添加setupFileComparatorWithThreshold()

setupFileComparatorWithThreshold();

4. 强制测试平台

可以配置AdaptiveTestConfiguration以强制特定的测试平台:

AdaptiveTestConfiguration.instance
  ..setEnforcedTestPlatform(TargetPlatform.macOS)
  ..setDeviceVariants(defaultDeviceConfigs);

如果希望在非预期平台上跳过测试而不是抛出错误,可以设置setFailTestOnWrongPlatform(false)

AdaptiveTestConfiguration.instance
  ..setEnforcedTestPlatform(TargetPlatform.macOS)
  ..setFailTestOnWrongPlatform(false)
  ..setDeviceVariants(defaultDeviceConfigs);

5. 编写测试

使用testAdaptiveWidgets函数编写测试:

void main() {
  testAdaptiveWidgets(
    'App渲染无回归',
    (tester, variant) async {
      await tester.pumpWidget(
        AdaptiveWrapper(
          device: variant,
          orientation: Orientation.portrait,
          isFrameVisible: true,
          showVirtualKeyboard: false,
          child: const App(),
        ),
      );

      await tester.expectGolden<App>(variant); // 生成黄金文件
    },
  );
}

完整示例Demo

以下是一个完整的示例项目,展示了如何使用adaptive_golden_test进行自适应黄金测试。

1. pubspec.yaml

name: adaptive_golden_test_demo
description: A demo project for adaptive_golden_test.

environment:
  sdk: ">=2.12.0 <3.0.0"

dependencies:
  flutter:
    sdk: flutter

dev_dependencies:
  flutter_test:
    sdk: flutter
  adaptive_test: ^最新版本号

flutter:
  fonts:
    - family: Roboto
      fonts:
        - asset: fonts/Roboto-Black.ttf

2. test/flutter_test_config.dart

import 'package:flutter_test/flutter_test.dart';
import 'package:adaptive_test/adaptive_test.dart';

Future<void> testExecutable(FutureOr<void> Function() testMain) async {
  TestWidgetsFlutterBinding.ensureInitialized();
  final defaultDeviceConfigs = {
    Devices.ios.iPhoneSE,
    Devices.ios.iPhone12,
    Devices.ios.iPad,
    Devices.linux.laptop,
    Devices.android.pixel4,
    Devices.android.samsungGalaxyS20,
  };

  AdaptiveTestConfiguration.instance
    ..setDeviceVariants(defaultDeviceConfigs)
    ..setEnforcedTestPlatform(TargetPlatform.macOS)
    ..setFailTestOnWrongPlatform(false);

  await loadFonts();
  setupFileComparatorWithThreshold();
  await testMain();
}

3. test/widget_test.dart

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

void main() {
  testAdaptiveWidgets(
    'App渲染无回归',
    (tester, variant) async {
      await tester.pumpWidget(
        AdaptiveWrapper(
          device: variant,
          orientation: Orientation.portrait,
          isFrameVisible: true,
          showVirtualKeyboard: false,
          child: const MyApp(),
        ),
      );

      await tester.expectGolden<MyApp>(variant); // 生成黄金文件
    },
  );
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Flutter Demo Home Page'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              const Text(
                'You have pushed the button this many times:',
              ),
              Text(
                '0',
                style: Theme.of(context).textTheme.headline4,
              ),
            ],
          ),
        ),
      ),
    );
  }
}

更多关于Flutter自适应黄金测试插件adaptive_golden_test的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter自适应黄金测试插件adaptive_golden_test的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用adaptive_golden_test插件来实现自适应黄金测试的示例代码。这个插件主要用于在不同屏幕尺寸和分辨率下验证UI的一致性。

首先,确保你已经在pubspec.yaml文件中添加了adaptive_golden_test依赖:

dependencies:
  flutter:
    sdk: flutter
  adaptive_golden_test: ^x.y.z  # 请替换为最新版本号

然后,运行flutter pub get来安装依赖。

接下来,你需要编写一些测试代码来利用adaptive_golden_test。以下是一个示例:

  1. 创建一个测试文件,例如test/adaptive_golden_test_example.dart
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:adaptive_golden_test/adaptive_golden_test.dart';

void main() {
  testWidgetsWithWindowSize(
    'Golden test for MyWidget with different screen sizes',
    (WidgetTester tester, Size screenSize) async {
      await tester.pumpWidget(MaterialApp(
        home: Scaffold(
          body: MyWidget(),
        ),
      ));

      await matchGoldenFile(
        tester,
        'my_widget_${screenSize.width}x${screenSize.height}.png',
        customPaintSize: screenSize,
      );
    },
    const [
      Size(320, 568), // iPhone 5/SE
      Size(375, 667), // iPhone 6/7/8
      Size(414, 896), // iPhone X/XS/11 Pro
      Size(1080, 1920), // 常见的高清安卓设备
    ],
  );
}

class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Text(
        'Hello, Golden Test!',
        style: TextStyle(fontSize: 24),
      ),
    );
  }
}
  1. 运行黄金测试

    你可以使用以下命令来运行黄金测试:

    flutter test --update-goldens test/adaptive_golden_test_example.dart
    

    这个命令会生成新的黄金图片文件,并保存到test/goldens目录下。如果你想要验证UI的一致性,可以省略--update-goldens选项:

    flutter test test/adaptive_golden_test_example.dart
    

    如果UI发生了变化,测试将会失败,提示黄金图片与当前渲染结果不一致。

  2. 检查黄金图片

    黄金图片文件会被保存在test/goldens目录下,文件名将包含屏幕尺寸信息,例如my_widget_320x568.pngmy_widget_375x667.png等。

通过上述步骤,你就可以使用adaptive_golden_test插件来在不同屏幕尺寸和分辨率下验证你的Flutter UI组件了。这个插件非常适合在UI开发过程中确保组件在不同设备上的自适应表现一致。

回到顶部