Teste e depuração - Flutter SDK
Nesta página
Esta página aborda algumas estratégias para testar e depurar aplicativos Flutter usando o Realm Flutter SDK. Você provavelmente terá que adaptar os exemplos nesta página significativamente para trabalhar com seu aplicativo.
Teste
Para executar testes no Flutter SDK usando o flutter_test e teste, você deve primeiro executar o seguinte comando:
dart run realm install
Este comando instala binários nativos necessários para executar testes para o aplicativo Flutter.
Observação
Teste no macOS
Se você estiver desenvolvendo com o Realm Flutter SDK no macOS, as solicitações de rede não funcionam por padrão devido às configurações de segurança integradas do macOS. Para corrigir isso, você deve alterar os direitos de rede do aplicativo Flutter no macOS.
Para saber como fazer isso, consulte Usar o Realm com o macOS App Sandbox.
Observação
Teste o Dart autônomo SDK
Se você estiver usando o Dart autônomo SDK, não precisará instalar nenhum binário nativo adicional para executar os testes. Isso ocorre porque, como parte da instalação para usar o Dart autônomo SDK em um aplicativo, você já precisa instalar os binários nativos.
Teste usando um Realm na memória
Uma maneira fácil de usar e testar aplicativos apoiados pelo Realm é testar usando um realm na memória. Isso ajuda a evitar a substituição de dados do aplicativo ou o vazamento de estado entre os testes. Observe que você não pode usar um Realm na memória para testar o Realm Mobile Sync. Para criar um realm na memória para seus testes, você pode fazer o seguinte:
Instancie preguiçosamente o
Realm
com a palavra-chavelate
em um escopo maior do que seus testesAbra o Realm com um Configuration.inMemory() dentro de uma função setUp.
Feche o Realm em uma função de desmontagem.
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 }
Teste usando um domínio padrão
Outra maneira de usar e testar aplicativos apoiados pelo Realm é usar o Realm padrão . Para evitar a substituição de dados do aplicação ou o vazamento de estado entre os testes, defina o Realm padrão como um novo arquivo para cada teste usando Configuration.defaultRealmName dentro de uma função 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 }
Limpe o Realm nos testes
Para limpar seus testes, você pode instanciar preguiçosamente o domínio com a palavra-chave late
em um escopo maior do que seus testes. Em seguida, execute operações de limpeza dentro de uma função de desmontagem . Dentro da função de retorno de chamada tearDown
, feche e exclua a instância de 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); }); }
Serviços de App de Teste
Para testar como seu aplicativo Flutter interage com Atlas App Services, crie um App Services App separado com a mesma configuração que seu aplicativo de produção e conecte-se a ele a partir do arquivo de teste. Para saber mais sobre como fazer uma cópia do aplicativo, consulte Copiar um aplicativo na documentação do App Services.
Você provavelmente também precisará de um usuário autenticado para testar os serviços que o aplicativo expõe. Muitas vezes, usuários anônimos são úteis para testes.
Para testar o aplicativo, você pode instanciar preguiçosamente App
e User
com a palavra-chave late
em um escopo maior do que seus testes. Instancie o cliente App
e faça login de um usuário dentro de uma função setUp
. Em seguida, execute operações de limpeza dentro de uma função de desmontagem . Dentro da função de chamada de resposta de chamada tearDown
, exclua o usuário atual do backend e, em seguida, desconecte-o do dispositivo.
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); }); }
Testar domínios sincronizados
Para testar como seu aplicativo Flutter funciona com Atlas Device Sync, crie um aplicativo separado App Services App com a mesma configuração que seu aplicativo de produção e conecte-se a ele a partir do arquivo de teste. Para saber mais sobre como fazer uma cópia do aplicativo, consulte Copiar um aplicativo na documentação do Atlas App Services .
O teste de realms sincronizados é baseado nas seções Limpar Realm em Testes e Testar App Services acima.
Para testar um Realm sincronizado, você pode instanciar preguiçosamente o App
e o Realm
com a palavra-chave late
em um escopo superior ao seus testes. Em uma função tearDown
, você deve executar o seguinte:
Exclua todos os dados no Realm.
Sincronize as alterações mais recentes com o Atlas para garantir que a exclusão se propague para o Atlas.
Feche o Realm.
Exclua o Arquivo de Realm do dispositivo.
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>()); }); }
depurar
Depurar com o Realm Studio
O Realm Studio permite que você abra e edite domínios locais. É compatível com Mac, Windows e Linux.
Depurar com DevTools e Editores de Código
Para depurar seu aplicativo, você pode usar o Realm Flutter SDK com o Flutter DevTools.