Docs 菜单

测试和调试 - Flutter SDK

本页介绍了使用 Realm Flutter SDK 测试和调试 Flutter 应用程序的一些策略。 您可能需要大幅调整此页面上的示例才能与您的应用程序一起使用。

使用 flutter_test 在Flutter SDK上运行测试 并 测试 必须 先运行以下命令:

dart run realm install

此命令安装运行 Flutter 应用程序测试所需的原生二进制文件。

注意

在 macOS 上测试

如果您在 macOS 上使用 Realm Flutter SDK 进行开发,由于内置的 macOS 安全设置,网络请求默认不起作用。 要解决此问题,您必须更改 Flutter 应用程序的 macOS 网络授权。

要了解如何执行此操作,请参阅将Realm 与 macOS App Sandbox 结合使用。

注意

测试 Dart 独立运行的实例 SDK

如果您使用的是 Dart Standalone SDK,则无需安装任何其他原生二进制文件即可运行测试。 这是因为在应用程序中使用 Dart Standalone SDK 时,您需要安装原生二进制文件。

使用和测试 Realm 支持的应用程序的一种简单方法是使用内存中的 Realm 进行测试。 这有助于避免覆盖应用程序数据或在测试之间泄漏状态。 请注意,您不能使用内存领域来测试 Device Sync。 要为测试创建内存中 Realm,可以执行以下操作:

  1. 在比测试更大的范围内使用late关键字延迟实例化 Realm

  2. setUp 函数中 使用 Configuration.inMemory() 打开域 。

  3. 在 tearDown 函数 中关闭域 。

import 'package:realm/realm.dart';
import 'package:flutter_test/flutter_test.dart';
import '../lib/schema.dart'; // Import schema used in test
void main() {
late Realm realm;
setUp(() {
realm = Realm(Configuration.inMemory([Car.schema]));
});
tearDown(() {
realm.close();
});
// ...rest of test code
}

使用和测试 Realm 支持的应用程序的另一种方法是使用默认域。 为了避免在测试之间覆盖应用程序数据或泄漏状态,请使用Configuration.defaultRealmName将默认域设立为每个测试的新文件 在 setUp 函数内部。

import 'dart:math';
import 'package:realm/realm.dart';
import 'package:flutter_test/flutter_test.dart';
// Utility function to generate random realm name
String generateRandomRealmName(int len) {
final r = Random();
const _chars =
'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz1234567890';
final nameBase =
List.generate(len, (index) => _chars[r.nextInt(_chars.length)]).join();
return '$nameBase.realm';
}
void main() {
// Set default Realm name before each test
setUp(() {
Configuration.defaultRealmName = generateRandomRealmName(10);
});
// ...rest of test code
}

要清理测试,您可以使用late关键字在比测试更大的范围内延迟实例化 Realm。 然后在 拆解函数 内运行清理操作 。在tearDown回调函数内,关闭并删除 Realm 实例。

import 'package:realm/realm.dart';
import 'package:flutter_test/flutter_test.dart';
import '../lib/schema.dart'; // Import schema used in test
void main() {
late Realm realm;
// Close and delete the realm after each test
tearDown(() {
final path = realm.config.path;
realm.close();
Realm.deleteRealm(path);
});
test("Open a local realm", () {
realm = Realm(Configuration.local([Car.schema]));
expect(realm.isClosed, isFalse);
});
}

要测试 Flutter应用如何与Atlas App Services交互,请创建一个单独的App Services App ,其配置与生产应用相同,并从测试文件连接到它。 要详细学习;了解如何复制应用,请参阅App Services文档中的复制应用

您可能还需要经过身份验证的用户来测试应用程序公开的服务。 通常,匿名用户对于测试很有用。

要测试应用,您可以使用late关键字在比测试更大的范围内延迟实例化AppUser 。 实例化App客户端并在setUp函数内让用户日志。 然后在 拆解函数 内运行清理操作 。在tearDown回调函数中,从后端删除当前用户,然后在设备上日志。

import 'package:realm/realm.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
late App app;
setUp(() async {
app = App(AppConfiguration(TEST_APP_ID));
await app.logIn(Credentials.anonymous());
});
// Delete and log current user out
tearDown(() async {
app.deleteUser(app.currentUser!);
await app.currentUser?.logOut();
});
test("Check user type", () {
final user = app.currentUser!;
expect(user.identities[0].provider, AuthProviderType.anonymous);
});
}

要测试 Flutter 应用程序如何与Atlas Device Sync配合使用,请创建一个单独的 App Services App,其配置与生产应用程序相同,并从测试文件连接到它。 要了解有关如何复制应用的更多信息,请参阅 Atlas App Services文档中的 复制应用 。

测试同步 Realm 以上述“测试中的清理 Realm”和“测试 App Services”部分为基础。

要测试同步的 Realm,您可以使用late关键字在比测试更大的范围内延迟实例化AppRealm 。 在tearDown函数中,您应执行以下操作:

  1. 删除 Realm 中的所有数据。

  2. 将最新更改同步到 Atlas,以确保删除操作传播到 Atlas。

  3. 关闭 Realm。

  4. 从设备中删除 Realm 文件。

import 'package:realm/realm.dart';
import 'package:flutter_test/flutter_test.dart';
import '../lib/schema.dart'; // Import schema used in test
void main() {
late App app;
late Realm realm;
setUp(() async {
app = App(AppConfiguration(TEST_APP_ID));
await app.logIn(Credentials.anonymous());
});
// Log current user out
tearDown(() async {
// Delete all items in the realm so that the items are not persisted in Atlas
// and do not re-sync in subsequent tests.
realm.write(() => realm.deleteAll<Car>());
// Fully synchronize realm before closing and deleting
await realm.syncSession.waitForDownload();
await realm.syncSession.waitForUpload();
// Get path before realm closed to pass to Realm.deleteRealm()
final path = realm.config.path;
realm.close();
Realm.deleteRealm(path);
await app.currentUser?.logOut();
});
test("Add subscriptions", () async {
const subName = 'allDogs';
final user = app.currentUser!;
realm = Realm(Configuration.flexibleSync(user, [Car.schema]));
realm.subscriptions.update((mutableSubscriptions) {
mutableSubscriptions.add(realm.all<Car>(), name: subName);
});
await realm.subscriptions.waitForSynchronization();
expect(realm.subscriptions.findByName(subName), isA<Subscription>());
});
}

Realm Studio 使您能够打开和编辑本地 Realm。它支持 Mac、Windows 和 Linux。

要调试您的应用,您可以将Realm Flutter SDK与 Flutter DevTools 结合使用。