测试和调试 - 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 支持的应用程序的一种简单方法是使用内存中的 Realm 进行测试。 这有助于避免覆盖应用程序数据或在测试之间泄漏状态。 请注意,您不能使用内存领域来测试 Device Sync。 要为测试创建内存中 Realm,可以执行以下操作:
在比测试更大的范围内使用
late
关键字延迟实例化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; setUp(() { realm = Realm(Configuration.inMemory([Car.schema])); }); tearDown(() { realm.close(); }); // ...rest of test code }
使用默认 Realm 进行测试
使用和测试 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 }
在测试中清理 Realm
要清理测试,您可以使用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); }); }
测试 App Services
要测试 Flutter应用如何与Atlas App Services交互,请创建一个单独的App Services App ,其配置与生产应用相同,并从测试文件连接到它。 要详细学习;了解如何复制应用,请参阅App Services文档中的复制应用。
您可能还需要经过身份验证的用户来测试应用程序公开的服务。 通常,匿名用户对于测试很有用。
要测试应用,您可以使用late
关键字在比测试更大的范围内延迟实例化App
和User
。 实例化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); }); }
测试同步 Realm
要测试 Flutter 应用程序如何与Atlas Device Sync配合使用,请创建一个单独的 App Services App,其配置与生产应用程序相同,并从测试文件连接到它。 要了解有关如何复制应用的更多信息,请参阅 Atlas App Services文档中的 复制应用 。
测试同步 Realm 以上述“测试中的清理 Realm”和“测试 App Services”部分为基础。
要测试同步的 Realm,您可以使用late
关键字在比测试更大的范围内延迟实例化App
和Realm
。 在tearDown
函数中,您应执行以下操作:
删除 Realm 中的所有数据。
将最新更改同步到 Atlas,以确保删除操作传播到 Atlas。
关闭 Realm。
从设备中删除 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 Studio 使您能够打开和编辑本地 Realm。它支持 Mac、Windows 和 Linux。
使用 DevTools 和代码编辑器进行调试
要调试您的应用,您可以将Realm Flutter SDK与 Flutter DevTools 结合使用。