Flutter未知功能探索插件bc_golden_plugin的使用
Flutter未知功能探索插件bc_golden_plugin的使用
简介
bc_golden_plugin
是一个用于自动化视觉质量保证(QA)的Flutter包。它改进了原生的golden测试,并根据开发过程中需求添加了一些特性,例如自动化视觉QA的手动过程。该包受到了其他包如golden_toolkit和alchemist的启发。
目录
用例 👨🏻💻
该包的主要目的是将组件或小部件与设计师团队在Figma中提供的设计进行比较。以下是一个用例示例:
- 设计图:
- 开发结果:
通过使用Golden Image Testing,可以减少与设计团队的审查会议时间,从而加快上市时间。
指南 📝
- 测试文件应位于包的
test
文件夹内。 - 测试文件应以
_golden_test.dart
命名。
BcGoldenConfiguration 🛠
BcGoldenConfiguration
处理应用程序的主题提供程序和主题数据。可以在flutter_test_config.dart
中设置配置:
Future<void> testExecutable(FutureOr<void> Function() testMain) async {
TestWidgetsFlutterBinding.ensureInitialized();
BcGoldenConfiguration bcGoldenConfiguration = BcGoldenConfiguration();
bcGoldenConfiguration.setThemeProvider = [
ChangeNotifierProvider(create: (_) => BcThemeNotifier()),
...BancolombiaFoundations.themeProvider,
];
bcGoldenConfiguration.setThemeData = BcThemeData.lightTheme;
await loadConfiguration();
await testMain();
}
窗口配置 | 设备 📱
以下是可用的窗口配置,用于模拟物理设备:
name | viewport size | pixel ratio |
---|---|---|
iPhone 8 | 375 x 667 | 2.0 |
iPhone 13 | 390 x 844 | 3.0 |
iPhone 14 Pro max | 430 x 932 | 3.0 |
Pixel 5 | 360 x 764 | 3.0 |
iPad Pro | 1366 x 1024 | 2.0 |
示例渲染效果:
device | example |
---|---|
iPhone 8 | |
iPad Pro |
自定义窗口配置
如果上述配置不适用,可以使用自定义窗口配置:
bcGoldenTest(
'Test con custom window config data',
(tester) async {
await bcWidgetMatchesImage(
imageName: 'golden',
widget: const HomePage(title: "Flutter Demo Home Page"),
tester: tester,
device: bcCustomWindowConfigData(
name: 'Custom Configuraton',
pixelDensity: 3.0,
size: const Size(375, 828),
),
);
},
);
无障碍 🦾
可以通过textScaleFactor
参数测试无障碍功能,调整字体大小:
iPhone14 normal | iPhone14 with text scale factor |
---|---|
bcGoldenTest 🏗
bcGoldenTest
是带有"golden"标签的个性化测试函数,示例如下:
bcGoldenTest(
'<name of the test file>',
(tester) async {
// Test goes here
},
shouldUseRealShadows: true,
);
LocalFileComparator
LocalFileComparator
类允许自定义两个图像之间的可接受差异阈值:
class LocalFileComparatorWithThreshold extends LocalFileComparator {
final double threshold;
LocalFileComparatorWithThreshold(Uri testFile, this.threshold)
: assert(threshold >= 0 && threshold <= 1),
super(testFile);
@override
Future<bool> compare(Uint8List imageBytes, Uri golden) async {
final result = await GoldenFileComparator.compareLists(
imageBytes,
await getGoldenBytes(golden),
);
if (!result.passed && result.diffPercent <= threshold) {
debugPrint(
'Se encontró una diferencia de ${result.diffPercent * 100}%, pero es '
'un valor aceptable, dado que el porcentaje de aceptación es de '
'${threshold * 100}%',
);
return true;
}
if (!result.passed) {
final error = await generateFailureOutput(result, golden, basedir);
throw FlutterError(error);
}
return result.passed;
}
}
示例代码 🤌🏻
使用该包非常简单,以下是一个完整的示例:
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:bc_golden_plugin/bc_golden_plugin.dart';
void main() {
group('Button Widget Golden Tests', () {
bcGoldenTest(
'button_widget_golden',
(tester) async {
await bcWidgetMatchesImage(
imageName: 'button_widget',
widget: ButtonWidget(),
tester: tester,
device: iPhone8,
textScaleFactor: 2.0,
);
},
shouldUseRealShadows: true,
);
});
}
class ButtonWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Center(
child: ElevatedButton(
onPressed: () {},
child: Text('Press Me'),
),
),
),
);
}
}
这个示例将生成golden并将其与开发的小部件进行比较。
更多关于Flutter未知功能探索插件bc_golden_plugin的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter未知功能探索插件bc_golden_plugin的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter项目中使用bc_golden_plugin
插件的示例代码。请注意,由于bc_golden_plugin
并非一个广泛知名的插件,我无法保证以下代码完全准确,但我会基于插件名称推测其功能可能与Golden测试(用于UI测试)有关。如果你发现具体功能与预期不符,请查阅官方文档或源码进行调整。
首先,确保你已经在pubspec.yaml
文件中添加了bc_golden_plugin
依赖:
dependencies:
flutter:
sdk: flutter
bc_golden_plugin: ^latest_version # 替换为实际版本号
然后,运行flutter pub get
来获取依赖。
接下来,是一个基本的Flutter应用示例,展示如何使用bc_golden_plugin
:
main.dart
import 'package:flutter/material.dart';
import 'package:bc_golden_plugin/bc_golden_plugin.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('bc_golden_plugin Example'),
),
body: Center(
child: GoldenWidgetExample(),
),
),
);
}
}
class GoldenWidgetExample extends StatelessWidget {
@override
Widget build(BuildContext context) {
// 假设bc_golden_plugin提供了某种方式来捕获UI截图
return Container(
color: Colors.amber,
child: Center(
child: Text(
'Hello, Golden Testing!',
style: TextStyle(fontSize: 24),
),
),
);
}
// 假设我们有一个方法来捕获截图并进行Golden测试
void captureGoldenScreenshot() async {
try {
// 初始化插件(如果插件需要初始化)
await BcGoldenPlugin.instance.initialize();
// 捕获当前widget树的截图
final screenshot = await BcGoldenPlugin.instance.captureScreenshot(
find.byType(GoldenWidgetExample), // 假设使用Finder来定位widget
);
// 将截图保存到指定路径(根据插件API调整)
final filePath = 'path/to/save/screenshot.png';
await screenshot.saveToFile(filePath);
print('Golden screenshot saved to $filePath');
} catch (e) {
print('Error capturing golden screenshot: $e');
}
}
}
注意:
-
Finder API:上面的
find.byType(GoldenWidgetExample)
是一个假设性的Finder用法,实际使用时,你需要根据插件提供的API和Finder的实际用法来调整。 -
截图保存:
screenshot.saveToFile(filePath)
也是一个假设性的方法,你需要查阅bc_golden_plugin
的文档来了解如何正确保存截图。 -
初始化:
await BcGoldenPlugin.instance.initialize();
这一行也是基于假设的初始化步骤,实际使用时请查阅插件文档。 -
Golden测试:在真实的Golden测试中,截图通常用于与预存的“Golden”截图进行比较,以验证UI的一致性。这个示例仅展示了如何捕获截图,并未涉及比较逻辑。
由于bc_golden_plugin
的具体API和功能未知,以上代码是一个基于假设的示例。请查阅插件的官方文档和示例代码来获取准确的使用方法。