Flutter Golden Test 是一个用于编写黄金测试(golden tests)的 Flutter 插件
Flutter未知功能插件golden_test的探索使用
介绍
Golden Test 是一个用于编写黄金测试(golden tests)的 Flutter 插件。黄金测试通过比较屏幕截图与参考图像来验证 UI 的正确性。以下是 Golden Test 支持的主要功能:
- 多设备支持:可以在多个设备上运行测试。
- 暗模式支持:可以测试应用在亮模式和暗模式下的表现。
- 多语言支持:可以验证应用在不同语言环境下的外观和行为。
安装
在 pubspec.yaml
文件中添加 golden_test
作为开发依赖项:
dev_dependencies:
golden_test: [latest-version]
示例
以下是一个简单的示例,展示如何使用 golden_test
编写黄金测试:
import 'package:flutter/material.dart';
import 'package:golden_toolkit/golden_toolkit.dart';
void main() {
testGoldens('Example Page', (tester) async {
await tester.pumpWidgetBuilder(
Scaffold(
body: Center(
child: Container(
height: 100,
color: Colors.red,
child: const Center(child: Text('Example')),
),
),
),
wrapper: materialAppWrapper(),
);
await screenMatchesGolden(tester, 'example_page');
});
}
详细说明
testGoldens
:用于定义黄金测试的入口。pumpWidgetBuilder
:用于构建要测试的 widget。materialAppWrapper
:为 widget 提供一个MaterialApp
环境。screenMatchesGolden
:将当前屏幕截图与参考图像进行比较,并确保它们匹配。
设备配置
为了在多个设备上运行黄金测试,golden_test
提供了一组预配置的设备。你可以全局配置设备,也可以为特定测试覆盖这些配置。
指定设备
为特定测试指定设备:
goldenTest(
name: 'Example Page',
supportedDevices: [Device.iphone15Pro(), Device.pixel9ProXL()],
builder: (_) => ExamplePage(),
);
全局配置设备
为所有黄金测试配置设备:
List<Device> goldenTestSupportedDevices = [
Device.iphone15Pro(),
Device.pixel9ProXL(),
// 添加更多设备
];
goldenTest(
name: 'Example Page',
supportMultipleDevices: true,
builder: (_) => ExamplePage(),
);
支持的设备
以下是一些预配置的设备:
Device.noInsets() - 无边距的基础设备
Device.iphone15Pro() - 模拟 iPhone 15 Pro
Device.pixel9ProXL() - 模拟 Pixel 9 Pro XL
Device.ipadPro12() - 模拟 iPad Pro 12
Device.browser() - 模拟通用网页浏览器
多语言支持
黄金测试支持多种语言,以验证应用在不同语言环境下的表现。
配置支持的语言
为所有测试配置支持的语言:
goldenTestSupportedLocales = [
const Locale('pl'),
const Locale('en'),
];
为特定测试配置支持的语言:
goldenTest(
name: 'Example Page',
builder: (_) => ExamplePage(),
supportedLocales: [
const Locale('pl'),
const Locale('en'),
],
);
包含本地化委托
为了支持额外的语言,需要包含本地化委托:
goldenTestLocalizationsDelegates = [
YourAppLocalizations.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
];
为特定测试配置本地化委托:
goldenTest(
name: 'Example Page',
builder: (_) => ExamplePage(),
supportedLocales: [
const Locale('pl'),
const Locale('en'),
],
localizationsDelegates: [
YourAppLocalizations.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
);
使用 intl
包
如果你的项目使用 intl
包进行本地化,并且默认语言不是 en_US
或者你希望支持多种语言,你需要提供额外的配置,特别是针对 intl
包。因为 intl
包默认使用 en_US
作为系统语言,而你需要根据测试更改它。你可以在 flutter 配置文件中添加以下代码:
globalSetup = (locale) async => Intl.defaultLocale = locale.languageCode;
自定义字体
如果你的项目使用自定义字体,你需要注册并加载这些字体,使它们在测试中可用。每个字体家族需要在每次字体加载器中加载一次。
Future<void> setupFonts() async {
TestWidgetsFlutterBinding.ensureInitialized();
await (FontLoader('Roboto')..addFont(rootBundle.load('assets/fonts/Roboto-Regular.ttf'))).load();
}
如果你的项目使用 google_fonts
包,你需要找到 .otf
或 .ttf
文件,并将其作为资产直接提供给应用程序。
主题设置
为了设置应用的主题,你需要使用以下配置:
goldenTestThemeInTests = yourThemeData;
goldenTestDarkThemeInTests = yourThemeDataDark;
如果没有设置主题,默认配置将使用基本的 ThemeData()
。
暗模式
Golden Test 允许你在亮模式和暗模式下运行测试,以验证应用在不同主题设置下的视觉效果。默认情况下,测试会在两种模式下运行。你可以通过修改 goldenTestSupportedThemes
列表来禁用暗模式测试:
goldenTestSupportedThemes = [Brightness.light];
你也可以为每个测试配置支持的主题:
goldenTest(
name: 'Example Page',
builder: (_) => ExamplePage(),
supportedThemes: [Brightness.light, Brightness.dark],
);
全局设置回调
globalSetup
回调允许你定义项目特定的配置,例如禁用动画或设置默认语言。
globalSetup = (_) async => duringTestExecution = false;
差异容忍度
差异容忍度可以帮助管理参考图像和当前 UI 输出之间的可接受视觉差异。这对于允许小的变化(如抗锯齿或平台渲染差异)特别有用。
goldenTestDifferenceTolerance(0.01);
更多关于Flutter Golden Test 是一个用于编写黄金测试(golden tests)的 Flutter 插件的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter Golden Test 是一个用于编写黄金测试(golden tests)的 Flutter 插件的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,关于Flutter中的golden_test
插件,这是一个非常有用的工具,用于在Flutter应用中进行视觉回归测试。视觉回归测试可以帮助开发者确保UI在不同版本之间保持一致,避免因为代码变更导致的UI错误。
以下是一个使用golden_test
插件的基本示例,展示了如何对Flutter Widget进行快照比较:
1. 添加依赖
首先,你需要在pubspec.yaml
文件中添加flutter_test
依赖(通常这是默认添加的,但确保它的存在):
dev_dependencies:
flutter_test:
sdk: flutter
虽然golden_test
不是一个独立的包,但Flutter的测试框架内置了对黄金文件(golden files)的支持,所以我们直接使用flutter_test
即可。
2. 创建Widget测试
接下来,在你的测试文件中(通常位于test/
目录下),你可以编写一个测试来捕捉Widget的快照,并将其与之前的快照进行比较。
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
testWidgets('MyWidget golden test', (WidgetTester tester) async {
// 创建一个临时目录来存储黄金文件
final key = UniqueKey();
await tester.pumpWidget(MaterialApp(
home: Scaffold(
body: Center(
child: MyWidget(key: key),
),
),
));
// 捕捉Widget的快照
await expectLater(
find.byKey(key),
matchesGoldenFile('my_widget.png'),
);
});
}
class MyWidget extends StatelessWidget {
final Key? key;
@override
Widget build(BuildContext context) {
return Container(
color: Colors.blue,
width: 100,
height: 100,
child: Center(
child: Text(
'Hello, Golden Test!',
style: TextStyle(color: Colors.white),
),
),
);
}
}
3. 生成黄金文件
在运行测试之前,你需要生成初始的黄金文件。这可以通过以下命令完成:
flutter test --update-goldens test/your_test_file.dart
这个命令会运行测试,并生成或更新位于test/goldens/
目录下的黄金文件。
4. 运行测试
最后,你可以通过运行以下命令来执行测试,并自动比较当前的Widget快照与黄金文件:
flutter test test/your_test_file.dart
如果Widget的快照与黄金文件不匹配,测试将失败,并在控制台中显示差异。
总结
通过上述步骤,你可以使用Flutter的内置功能来进行视觉回归测试。golden_test
虽然不是一个独立的包名,但Flutter的测试框架提供了强大的工具来支持这种类型的测试。确保你的Widget在不同版本之间保持一致是维护高质量应用的关键部分。