Flutter自适应黄金测试插件adaptive_golden_test的使用
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. 渲染自定义字体
步骤:
- 将字体文件添加到应用的资源文件夹中。
- 在
pubspec.yaml
中声明字体:
flutter:
fonts:
- family: Roboto
fonts:
- asset: fonts/Roboto-Black.ttf
- 在
flutter_test_config.dart
中调用loadFonts()
以加载字体:
await loadFonts();
2. 设置测试设备
步骤:
- 定义一组设备变体:
final defaultDeviceConfigs = {
Devices.ios.iPhoneSE,
Devices.ios.iPhone12,
Devices.ios.iPad,
Devices.linux.laptop,
Devices.android.pixel4,
Devices.android.samsungGalaxyS20,
};
- 使用
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
更多关于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
。以下是一个示例:
- 创建一个测试文件,例如
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),
),
);
}
}
-
运行黄金测试:
你可以使用以下命令来运行黄金测试:
flutter test --update-goldens test/adaptive_golden_test_example.dart
这个命令会生成新的黄金图片文件,并保存到
test/goldens
目录下。如果你想要验证UI的一致性,可以省略--update-goldens
选项:flutter test test/adaptive_golden_test_example.dart
如果UI发生了变化,测试将会失败,提示黄金图片与当前渲染结果不一致。
-
检查黄金图片:
黄金图片文件会被保存在
test/goldens
目录下,文件名将包含屏幕尺寸信息,例如my_widget_320x568.png
,my_widget_375x667.png
等。
通过上述步骤,你就可以使用adaptive_golden_test
插件来在不同屏幕尺寸和分辨率下验证你的Flutter UI组件了。这个插件非常适合在UI开发过程中确保组件在不同设备上的自适应表现一致。