Flutter插件功能介绍插件pact_dart的使用

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

Flutter插件功能介绍插件pact_dart的使用

pact_dart 是一个用于生成 Pact 合同的 Dart 框架。它实现了 Pact 规范 v3,并使用了 Pact FFI Library

文档

本说明文档提供了库的基本介绍。更多关于 Pact 的文档可以在 https://docs.pact.io/ 查看。

需要帮助?

安装

首先,在你的项目中添加 pact_dart 作为开发依赖:

# 安装 pact_dart 作为开发依赖
dart pub add --dev pact_dart

# 下载并安装所需的库
dart run pact_dart:install

# 🚀 现在编写一些测试!

对于 Flutter 项目:

# 安装 pact_dart 作为开发依赖
flutter pub add --dev pact_dart

# 下载并安装所需的库
flutter pub run pact_dart:install

# 🚀 现在编写一些测试!

手动安装指南

默认情况下,Pact FFI Library 会被安装到 macOS 和 Linux 的 /usr/local/lib 目录下。但你可以通过设置 PACT_DART_LIB_DOWNLOAD_PATH 环境变量来修改安装路径。

PACT_DART_LIB_DOWNLOAD_PATH=/app/my-other-location dart run pact_dart:install

手动安装:

下载最新的 Pact FFI Library 并安装到标准库搜索路径(例如,在 macOS/Linux 上建议的路径为 /usr/local/lib):

确保你有正确的扩展名:

  • 对于 Mac OSX: .dylib
  • 对于 Linux: .so
  • 对于 Windows: .dll
wget https://github.com/pact-foundation/pact-reference/releases/download/libpact_ffi-v0.0.2/libpact_ffi-osx-x86_64.dylib.gz
gunzip libpact_ffi-osx-x86_64.dylib.gz
mv libpact_ffi-osx-x86_64.dylib /usr/local/lib/libpact_ffi.dylib

使用

编写消费者测试

Pact 是一个消费者驱动的合同测试工具,这意味着 API 消费者会编写测试以设定其对 API 提供者的假设和需求。通过单元测试我们的 API 客户端,它可以生成一个可以共享给提供者的合同,以确认这些假设并防止破坏性更改。

在这个例子中,我们正在测试与 HTTP 服务的 /users 资源通信的用户存储库。该存储库有一个单一方法 fetchAll(),它将返回一个用户列表。

import 'package:pact_dart/pact_dart.dart';

// 创建一个新的模拟服务实例
final pact = PactMockService('FlutterConsumer', 'APIService');

// 添加交互
pact
    .newInteraction() // 新的交互
    .given('a user exists', params: {'first_name': 'Betsy', 'last_name': 'Tester'}) // 设置状态
    .andGiven('') // 可选的额外状态
    .uponReceiving('a request for all users') // 接收请求
    .withRequest('GET', '/users') // 请求类型和路径
    .willRespondWith(200, body: { // 响应
        // 使用匹配器,因为我们关心响应的类型和结构,而不是确切的值
        'page': PactMatchers.SomethingLike(1),
        'per_page': PactMatchers.SomethingLike(20),
        'total': PactMatchers.IntegerLike(20),
        'total_pages': PactMatchers.SomethingLike(3),
        'data': PactMatchers.EachLike([ // 数组匹配器
            {
                'id': PactMatchers.uuid('f3a9cf4a-92d7-4aae-a945-63a6440b528b'), // UUID 匹配器
                'first_name': PactMatchers.SomethingLike('Betsy'), // 某些值匹配器
                'last_name': PactMatchers.SomethingLike('Tester'),
                'salary': PactMatchers.DecimalLike(125000.00) // 数值匹配器
            }
        ])
    });

// 运行模拟服务
pact.run(secure: false);

// 模拟调用实际的 API 方法
final loginRepository = UsersRepository();
final users = await loginRepository.fetchAll();

// 断言
expect(users.length, equals(20)); // 用户数量
expect(users[0].firstName, equals('Betsy')); // 第一个用户的姓名
expect(users[0].lastName, equals('Tester')); // 第一个用户的姓氏

// 写入 Pact 文件并重置模拟服务
pact.writePactFile();
pact.reset();

更多关于Flutter插件功能介绍插件pact_dart的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter插件功能介绍插件pact_dart的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用pact_dart插件的详细代码案例。pact_dart是一个用于创建和消费Pact测试的Dart库,它允许你在Flutter应用或Dart包中进行契约测试。请注意,由于pact_dart本身不直接是一个Flutter插件(而是一个Dart包),因此我们将专注于如何在Flutter项目中使用它来进行Pact测试。

步骤 1: 添加依赖

首先,你需要在你的pubspec.yaml文件中添加pact_dart依赖。

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

然后运行flutter pub get来安装依赖。

步骤 2: 设置Pact测试

在你的Flutter项目中,你可以创建一个独立的Dart文件来设置和运行Pact测试。例如,创建一个名为pact_test.dart的文件。

import 'package:pact_dart/pact_dart.dart';
import 'package:test/test.dart';

void main() {
  late Pact pact;
  late PactProviderClient providerClient;

  setUpAll(() async {
    // 启动Pact服务器
    pact = await Pact({
      'consumer': 'MyFlutterApp',
      'provider': 'MyAPI',
      'port': 12345,
      'logDir': './logs',
      'specVersion': '3.0.0',
    }).init();

    // 设置提供者客户端
    providerClient = pact.providerClient;

    // 等待Pact服务器启动
    await pact.start();
  });

  tearDownAll(() async {
    // 停止Pact服务器并写入Pact文件
    await pact.finalize();
  });

  test('should return a 200 on a GET request to /api/resource', () async {
    // 定义预期交互
    await pact.addInteraction({
      'description': 'GET /api/resource returns a 200',
      'providerState': 'There is a resource with id 123',
      'request': {
        'method': 'GET',
        'path': '/api/resource/123',
        'headers': {},
      },
      'response': {
        'status': 200,
        'headers': {'Content-Type': 'application/json'},
        'body': {
          'id': 123,
          'name': 'Test Resource',
        },
      },
    });

    // 发送请求并验证响应
    var response = await providerClient.get('/api/resource/123');
    expect(response.statusCode, 200);
    var body = jsonDecode(response.body);
    expect(body['id'], 123);
    expect(body['name'], 'Test Resource');
  });
}

步骤 3: 运行测试

确保你的Flutter项目根目录下有一个test文件夹,并将pact_test.dart文件放在其中。然后,你可以使用Dart的测试运行器来运行这些测试。

在命令行中,运行以下命令:

dart test test/pact_test.dart

这将启动Pact服务器,运行测试,并在测试完成后生成Pact文件。

注意事项

  1. 提供者状态:在上面的示例中,我们使用了providerState来定义提供者状态。这通常需要在你的API服务器或测试环境中有一个机制来设置这些状态。
  2. 实际请求providerClient.get方法实际上是一个模拟请求,它不会真正发送到你的API服务器。Pact库会拦截并验证这些请求是否符合预期。
  3. Pact文件:测试完成后,Pact文件将保存在你指定的logDir目录中。这个文件可以用于验证提供者实现是否符合消费者预期。

这个示例展示了如何在Flutter项目中使用pact_dart库来设置和运行Pact测试。根据你的具体需求,你可能需要调整代码来匹配你的API和测试场景。

回到顶部