Docs Menu
Docs Home
/ /
Atlas Device SDK
/

テストとデバッグ - Flutter SDK

項目一覧

  • テスト
  • インメモリ Realm を使用したテスト
  • デフォルトの Realm を使用したテスト
  • テストで Realm をクリーンアップする
  • App Services をテストする
  • 同期された Realm のテスト
  • Debug
  • Realm Studio によるデバッグ
  • DevTools とコード エディターによるデバッグ

このページでは、Realm Flutter SDK を使用して Flutter アプリをテストおよびデバッグするためのいくつかの戦略について説明します。 アプリで動作させるには、このページの例を大幅に調整する必要がある可能性があります。

Flutter_ Test を使用してFlutter SDKでテストを実行する および テスト には、最初に次のコマンドを実行する 必要 があります。

dart run realm install

このコマンドは、Flutter アプリのテストを実行するために必要なネイティブ バイナリをインストールします。

注意

macOS でテストしています

macOS 上で Realm Flutter SDK を使用して開発している場合、macOS に組み込まれているセキュリティ設定により、ネットワーク リクエストはデフォルトでは機能しません。 これを修正するには、Flutter アプリの macOS ネットワーク権限を変更する必要があります。

その方法については、「 macOS App Sandbox で Realm を使用する 」を参照してください。

注意

Dart スタンドアロン SDK のテスト

Dart スタンドアロン SDK を使用している場合は、テストを実行するために追加のネイティブ バイナリをインストールする必要はありません。 これは、インストールの一部として、アプリで Dart スタンドアロン SDK を使用するために、ネイティブ バイナリをインストールする必要があるためです。

Realm ベースのアプリケーションの使用とテストの簡単な方法は、メモリ内 Realm を使用してテストすることです。 これにより、アプリケーション データがオーバーライドされたり、テスト間で状態がリークされたりするのを回避できます。 インメモリ Realm を使用して Device Sync をテストすることはできないことに注意してください。 テスト用のメモリ内レルムを作成するには、次の手順を実行します。

  1. テストよりも高い範囲でlateキーワードを使用して Realmを遅延インスタンス化します。

  2. setUp 関数 内で Configuration.inMemory() を使用してRealmを開きます。

  3. 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 を使用することです。 アプリケーション データがオーバーライドされたり、テスト間で状態がリークされたりしないようにするには、 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
}

テストをクリーンアップするには、テストよりも高いスコープで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);
});
}

Flutter アプリがAtlas App Servicesとのやり取りをテストするには、本番アプリと同じ構成を持つ別の App Services App を作成し、テスト ファイルからそのアプリに接続します。 アプリのコピーを作成する方法の詳細については、App Services ドキュメントの「 アプリのコピー 」を参照してください。

アプリが公開するサービスをテストするには、認証済みユーザーも必要になる可能性が高いでしょう。 多くの場合、匿名ユーザーがテストに役立ちます。

アプリをテストするには、テストよりも高い範囲でlateキーワードを使用してAppUserを遅延インスタンス化します。 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);
});
}

Flutter アプリがAtlas Device Syncとどのように動作するかをテストするには、本番アプリと同じ構成を持つ別の App Services App を作成し、テスト ファイルからそのアプリに接続します。 アプリのコピーを作成する方法の詳細については、App Services ドキュメントの「 アプリのコピー 」を参照してください。

同期された Realm のビルドをテストするには、「 テストでの Realm のクリーンアップ 」および「 テスト アプリ サービスのテスト 」セクションを参照してください。

同期された 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 を使用できます。

戻る

トラブルシューティング