テストとデバッグ - Flutter SDK
項目一覧
このページでは、Realm Flutter SDK を使用して Flutter アプリをテストおよびデバッグするためのいくつかの戦略について説明します。 アプリで動作させるには、このページの例を大幅に調整する必要がある可能性があります。
テスト
Flutter_ Test を使用してFlutter SDKでテストを実行する および テスト には、最初に次のコマンドを実行する 必要 があります。
dart run realm install
このコマンドは、Flutter アプリのテストを実行するために必要なネイティブ バイナリをインストールします。
注意
macOS でテストしています
macOS 上で Realm Flutter SDK を使用して開発している場合、macOS に組み込まれているセキュリティ設定により、ネットワーク リクエストはデフォルトでは機能しません。 これを修正するには、Flutter アプリの macOS ネットワーク権限を変更する必要があります。
注意
Dart スタンドアロン SDK のテスト
Dart スタンドアロン SDK を使用している場合は、テストを実行するために追加のネイティブ バイナリをインストールする必要はありません。 これは、インストールの一部として、アプリで Dart スタンドアロン SDK を使用するために、ネイティブ バイナリをインストールする必要があるためです。
インメモリ Realm を使用したテスト
Realm ベースのアプリケーションの使用とテストの簡単な方法は、メモリ内 Realm を使用してテストすることです。 これにより、アプリケーション データがオーバーライドされたり、テスト間で状態がリークされたりするのを回避できます。 インメモリ Realm を使用して Device Sync をテストすることはできないことに注意してください。 テスト用のメモリ内レルムを作成するには、次の手順を実行します。
テストよりも高い範囲で
late
キーワードを使用してRealm
を遅延インスタンス化します。triggerDown 関数で 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 ベースのアプリケーションを使用してテストする別の方法は、デフォルトの Realm を使用することです。 アプリケーション データがオーバーライドされたり、テスト間で状態がリークされたりしないようにするには、 Configuration.defaultRealmNameを使用して、テストごとに新しいファイルにデフォルトの Realm を設定します 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 を遅延インスタンス化します。 次に、 tierDown 関数 内でクリーンアップ操作を実行します 。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
関数内にユーザーをログインします。 次に、 tierDown 関数 内でクリーンアップ操作を実行します 。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 を作成し、テスト ファイルからそのアプリに接続します。 アプリのコピーを作成する方法の詳細については、App Services ドキュメントの「 アプリのコピー 」を参照してください。
同期された Realm のビルドをテストするには、「 テストでの Realm のクリーンアップ 」および「 テスト アプリ サービスのテスト 」セクションを参照してください。
同期された 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>()); }); }
Debug
Realm Studio によるデバッグ
Realm Studioを使用すると、ローカル Realm を開いて編集できます。 Mac、Windows、および Linux をサポートしています。
DevTools とコード エディターによるデバッグ
アプリをデバッグするには、Realm Flutter SDK と Flutter DevTools を使用できます。