Flutter插件功能介绍插件pact_dart的使用
Flutter插件功能介绍插件pact_dart的使用
pact_dart
是一个用于生成 Pact 合同的 Dart 框架。它实现了 Pact 规范 v3,并使用了 Pact FFI Library
。
文档
本说明文档提供了库的基本介绍。更多关于 Pact 的文档可以在 https://docs.pact.io/ 查看。
需要帮助?
- 加入我们的社区 slack workspace
- Stack Overflow: https://stackoverflow.com/questions/tagged/pact
- 在 Twitter 上打招呼: @pact_up
安装
首先,在你的项目中添加 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
更多关于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文件。
注意事项
- 提供者状态:在上面的示例中,我们使用了
providerState
来定义提供者状态。这通常需要在你的API服务器或测试环境中有一个机制来设置这些状态。 - 实际请求:
providerClient.get
方法实际上是一个模拟请求,它不会真正发送到你的API服务器。Pact库会拦截并验证这些请求是否符合预期。 - Pact文件:测试完成后,Pact文件将保存在你指定的
logDir
目录中。这个文件可以用于验证提供者实现是否符合消费者预期。
这个示例展示了如何在Flutter项目中使用pact_dart
库来设置和运行Pact测试。根据你的具体需求,你可能需要调整代码来匹配你的API和测试场景。