Flutter未知功能探索插件bc_golden_plugin的使用

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

Flutter未知功能探索插件bc_golden_plugin的使用

简介

bc_golden_plugin 是一个用于自动化视觉质量保证(QA)的Flutter包。它改进了原生的golden测试,并根据开发过程中需求添加了一些特性,例如自动化视觉QA的手动过程。该包受到了其他包如golden_toolkitalchemist的启发。

目录

用例 👨🏻‍💻

该包的主要目的是将组件或小部件与设计师团队在Figma中提供的设计进行比较。以下是一个用例示例:

  • 设计图: Input image
  • 开发结果: Development image

通过使用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 drawing
iPad Pro iPad Pro image

自定义窗口配置

如果上述配置不适用,可以使用自定义窗口配置:

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
drawing drawing

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

1 回复

更多关于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');
    }
  }
}

注意:

  1. Finder API:上面的find.byType(GoldenWidgetExample)是一个假设性的Finder用法,实际使用时,你需要根据插件提供的API和Finder的实际用法来调整。

  2. 截图保存screenshot.saveToFile(filePath)也是一个假设性的方法,你需要查阅bc_golden_plugin的文档来了解如何正确保存截图。

  3. 初始化await BcGoldenPlugin.instance.initialize();这一行也是基于假设的初始化步骤,实际使用时请查阅插件文档。

  4. Golden测试:在真实的Golden测试中,截图通常用于与预存的“Golden”截图进行比较,以验证UI的一致性。这个示例仅展示了如何捕获截图,并未涉及比较逻辑。

由于bc_golden_plugin的具体API和功能未知,以上代码是一个基于假设的示例。请查阅插件的官方文档和示例代码来获取准确的使用方法。

回到顶部