Flutter图像测试工具插件flutter_image_test_utils的使用

Flutter图像测试工具插件flutter_image_test_utils的使用

本包提供了一种简单且更简便的方法来测试使用Image.networkCachedNetworkImage的Flutter小部件。通过使用带有mocktail存根的模拟HTTP客户端,对每个请求都响应一个假图片。

ℹ️ 这是受到以下项目的启发:image_test_utils,该项目已停止维护,并且来自Flutter团队的mock_image_http

使用

在你的Flutter项目的根目录下运行以下命令:

flutter pub add flutter_image_test_utils

或者直接将以下依赖项粘贴到你的pubspec.yaml文件中:

dev_dependencies:
  flutter_image_test_utils: ^1.0.0

在你的小部件测试中,只需导入库并使用provideMockedNetworkImages()函数,例如:

import 'package:flutter/material.dart';
import 'package:flutter_image_test_utils/flutter_image_test_utils.dart';

testWidgets('应该执行某些操作', (tester) async {
  provideMockedNetworkImages(
    () async {
      await tester.pumpWidget(
        MaterialApp(
          home: MyWidget(),
        ),
      );
      // 在这里添加你的测试逻辑
    },
  );
});

你还可以传递自己的图像字节值,只需要通过imageBytes参数传入即可:

import 'package:flutter/material.dart';
import 'package:flutter_image_test_utils/flutter_image_test_utils.dart';

testWidgets('应该执行某些操作', (tester) async {
  provideMockedNetworkImages(
    () async {
      // 在这里添加你的测试逻辑
    },
    imageBytes: [/* 你的图像字节数据 */]
  );
});

完整示例

以下是完整的示例代码:

import 'package:flutter/material.dart';
import 'package:flutter_image_test_utils/flutter_image_test_utils.dart';

// 主应用入口点
void main() {
  runApp(const MyApp());
}

// 自定义的小部件
class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Flutter Demo'),
        ),
        body: Center(
          child: Image.network('https://picsum.photos/200/300'), // 显示网络图片
        ),
      ),
    );
  }
}

// 小部件测试
void main() {
  testWidgets('应该正确显示图片', (tester) async {
    provideMockedNetworkImages(
      () async {
        await tester.pumpWidget(
          MaterialApp(
            home: MyApp(), // 测试主应用
          ),
        );

        // 验证是否正确渲染了图片
        expect(find.byType(Image), findsOneWidget);
      },
    );
  });
}

更多关于Flutter图像测试工具插件flutter_image_test_utils的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter图像测试工具插件flutter_image_test_utils的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用flutter_image_test_utils插件进行图像测试的示例代码。这个插件主要用于在Flutter的集成测试中验证图像是否正确渲染。

首先,确保你已经在pubspec.yaml文件中添加了flutter_image_test_utils依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_test:
    sdk: flutter
  flutter_image_test_utils: ^x.y.z  # 替换为最新版本号

然后运行flutter pub get来获取依赖。

接下来,创建一个集成测试文件,例如test_driver/integration_test/image_test.dart

import 'package:flutter_driver/flutter_driver.dart';
import 'package:flutter_image_test_utils/flutter_image_test_utils.dart';
import 'package:test/test.dart';

void main() {
  group('Image Tests', () {
    FlutterDriver driver;

    // 设置测试环境
    setUpAll(() async {
      driver = await FlutterDriver.connect();
    });

    // 清理测试环境
    tearDownAll(() async {
      if (driver != null) {
        driver.quit();
      }
    });

    test('verify image is displayed correctly', () async {
      // 找到包含图像的widget(假设图像在一个Container中)
      final containerFinder = find.byValueKey('imageContainer');

      // 捕获图像的像素数据
      final capturedImage = await captureImageFromWidget(
        driver: driver,
        finder: containerFinder,
      );

      // 加载期望的图像(通常是一个快照或金丝雀图像)
      final expectedImage = await loadImageFromAsset('assets/expected_image.png');

      // 比较捕获的图像和期望的图像
      final comparisonResult = await compareImages(capturedImage, expectedImage);

      // 检查图像是否匹配(例如,允许5%的差异)
      expect(comparisonResult.differencePercent, lessThan(5.0));
    });
  });
}

在上面的代码中,我们进行了以下步骤:

  1. 连接FlutterDriver:使用FlutterDriver.connect()连接到Flutter应用。
  2. 设置和清理:使用setUpAlltearDownAll确保在每个测试前后正确设置和清理环境。
  3. 捕获图像:使用captureImageFromWidget函数从指定的widget捕获图像。这里假设图像在一个带有ValueKey('imageContainer')Container中。
  4. 加载期望图像:使用loadImageFromAsset函数从资产文件夹加载期望的图像。
  5. 比较图像:使用compareImages函数比较捕获的图像和期望的图像,并获取比较结果。
  6. 验证结果:使用expect函数验证图像差异百分比是否在允许的范围内(例如,5%)。

注意:

  • 你需要确保你的Flutter应用中有对应的imageContainer key的widget,并且它包含了你想要测试的图像。
  • assets/expected_image.png应该是你期望的图像文件,通常是一个金丝雀图像或快照。
  • flutter_image_test_utils插件可能会提供一些额外的配置选项和函数,具体可以查阅其文档。

这是一个基本的示例,你可以根据具体需求进行调整和扩展。

回到顶部