테스트 & 디버그 - Flutter SDK
이 페이지의 내용
이 페이지에서는 Realm Flutter SDK를 사용하여 Flutter 앱을 테스트하고 디버깅하기 위한 몇 가지 전략을 다룹니다. 앱과 함께 작동하려면 이 페이지의 예제를 크게 수정해야 할 것입니다.
테스트
Flutter_test 를 사용하여 Flutter SDK 에서 테스트를 실행 하려면 및 테스트, 먼저 다음 명령을 실행 해야 합니다 .
dart run realm install
이 명령은 Flutter 앱 테스트를 실행하는 데 필요한 네이티브 바이너리를 설치합니다.
참고
macOS에서 테스트
macOS에서 Realm Flutter SDK로 개발하는 경우 내장된 macOS 보안 설정으로 인해 네트워크 요청이 기본적으로 작동하지 않습니다. 이 문제를 해결하려면 Flutter 앱의 macOS 네트워크 권한을 변경해야 합니다.
이 작업을 수행하는 방법을 알아보려면 macOS 앱 Sandbox에서 Realm 사용을 참조하세요.
참고
Dart 독립형 SDK 테스트
Dart 독립형 SDK를 사용하는 경우 테스트를 실행하기 위해 추가 네이티브 바이너리를 설치할 필요가 없습니다. 이는 앱에서 Dart 독립형 SDK를 사용하기 위한 설치 의 일부로 네이티브 바이너리를 이미 설치해야 하기 때문입니다.
인메모리 Realm을 사용한 테스트
영역 기반 애플리케이션을 사용하고 테스트하는 쉬운 방법은 인메모리 영역을 사용하여 테스트하는 것입니다. 이렇게 하면 애플리케이션 데이터의 재정의나 테스트 사이의 상태 유출을 방지할 수 있습니다. 인메모리 영역을 사용하여 Realm Mobile Sync를 테스트할 수는 없습니다 . 테스트를 위한 인메모리 영역을 생성하려면 다음과 같이 하세요:
테스트보다 높은 범위에서
late
키워드를 사용하여Realm
을 지연 인스턴스화합니다.setUp 함수 내에서 Configuration.inMemory() 를 사용하여 영역 을 엽니다.
티어다운( 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을 사용하여 테스트
Realm 지원 애플리케이션을 사용하고 테스트하는 또 다른 방법은 기본값 영역 을 사용하는 것입니다. 애플리케이션 데이터 재정의 또는 테스트 간 상태 유출을 방지하려면 Configuration.defaultRealmName 을 사용하여 각 테스트에 대해 기본값 영역 을 새 파일 로 설정하다 합니다. 설정 함수 내부.
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) 함수 내에서 정리 작업을 실행합니다. . 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) 함수 내에서 정리 작업을 실행 합니다. . 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 정리하기 섹션을 기반으로 합니다.
동기화된 Realm을 테스트하려면 테스트보다 높은 범위에서 late
키워드를 사용하여 App
및 Realm
를 느리게 인스턴스화할 수 있습니다. tearDown
함수에서 다음을 수행해야 합니다.
영역의 모든 데이터를 삭제합니다.
최신 변경 사항을 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로 디버그
영역 Studio를 사용하면 로컬 영역을 열고 편집할 수 있습니다. Mac, Windows, Linux를 지원합니다.
개발자 도구 및 코드 편집기를 사용한 디버그
앱 을 디버깅하려면 Flutter DevTools 와 함께 Realm Flutter SDK 를 사용할 수 있습니다.