Flutter运行集成测试时如何生成测试Golden文件
Flutter 集成测试运行时生成Golden文件的实现方案
在Android模拟器上运行集成测试的过程中可以生成Golden镜像文件,默认命令无法满足需求是测试运行模式的固有差异导致的,具体原因和落地方法如下:
- 执行
flutter test integration_test/app_test.dart --update-goldens触发只读报错:该命令实际是将集成测试运行在宿主机的测试VM环境中,并未真正启动Android模拟器运行应用,测试进程访问工程本地目录写入Golden文件时,会因跨设备文件系统权限限制触发只读错误。 - 执行
flutter drive命令跳过Golden生成/比对流程:flutter drive默认的Golden生成、匹配逻辑仅适配单元测试、Widget测试的宿主机运行环境,没有实现设备端截图回传、宿主机本地文件写入的链路,因此会直接跳过Golden相关流程。
具体实现步骤
- 第一步:编写自定义测试驱动,接管截图保存逻辑
在test_driver目录下创建集成测试驱动文件,配置截图回调,将设备端传回的截图字节写入本地工程的Golden存储目录,示例代码:// test_driver/integration_test.dart import 'dart:io'; import 'package:integration_test/integration_test_driver.dart'; Future<void> main() async { await integrationDriver( onScreenshot: (String screenshotName, List<int> screenshotBytes, [Map<String, Object?>? args]) async { // 指定Golden文件本地存储路径 final goldenFile = File('goldens/$screenshotName.png'); // 递归创建不存在的父级目录 goldenFile.parent.createSync(recursive: true); // 写入截图数据生成Golden文件 await goldenFile.writeAsBytes(screenshotBytes); return true; }, ); } - 第二步:调整集成测试用例,手动触发截图
不要使用默认matchesGoldenFile匹配器,在测试逻辑中通过集成测试绑定实例手动触发截图,截图名称会和驱动端保存的文件名对应,示例代码:// integration_test/app_test.dart import 'package:flutter_test/flutter_test.dart'; import 'package:integration_test/integration_test.dart'; import 'package:sample_app/main.dart' as app; void main() { final binding = IntegrationTestWidgetsFlutterBinding.ensureInitialized(); testWidgets('首页渲染匹配Golden', (tester) async { app.main(); await tester.pumpAndSettle(); // 触发截图生成对应Golden await binding.takeScreenshot('home_page'); }); } - 第三步:执行命令生成Golden
直接运行flutter drive命令启动集成测试即可,测试运行过程中会自动将页面截图保存到指定的本地目录生成Golden文件:flutter drive --driver=test_driver/integration_test.dart --target=integration_test/app_test.dart
注意事项:如果需要做Golden一致性比对,不要依赖框架默认的匹配逻辑,可在驱动端回调中读取已有Golden文件的字节数据,和新回传的截图做像素差值计算,自行设置匹配阈值,规避不同Android设备渲染字体、像素密度差异导致的比对误判。
内容的提问来源于stack exchange,提问作者Joshua Erinosho
相关产品推荐
相关产品推荐

