Contentanbieter testen

Wenn Sie einen Contentanbieter implementieren, um Daten zu speichern und abzurufen oder um Daten für andere Anwendungen zugänglich zu machen, sollten Sie Ihren Anbieter testen, um sicherzustellen, dass er sich nicht auf unerwartete Weise verhält. In dieser Lektion wird beschrieben, wie Sie Anbieter öffentlicher Inhalte testen. Sie gilt auch für Anbieter, die Sie nur für Ihre eigene Anwendung verwenden.

Integrationstests für Contentanbieter erstellen

Contentanbieter ermöglichen den Zugriff auf tatsächliche Nutzerdaten. Daher ist es wichtig, dass Sie den Contentanbieter in einer isolierten Testumgebung testen. Auf diese Weise können Sie die Ausführung nur für Datenabhängigkeiten ausführen, die explizit im Testfall festgelegt wurden. Es bedeutet auch, dass Ihre Tests keine tatsächlichen Nutzerdaten verändern. Sie sollten beispielsweise keinen Test schreiben, der fehlschlägt, weil Daten aus einem vorherigen Test übrig geblieben sind. Ebenso sollten bei einem Test keine tatsächlichen Kontaktdaten bei einem Anbieter hinzugefügt oder gelöscht werden.

Verwenden Sie die Klasse ProviderTestCase2, um Ihren Contentanbieter isoliert zu testen. Mit dieser Klasse können Sie Mock-Objektklassen von Android wie IsolatedContext und MockContentResolver verwenden, um auf Datei- und Datenbankinformationen zuzugreifen, ohne die tatsächlichen Nutzerdaten zu beeinträchtigen.

Ihr Integrationstest sollte als JUnit 4-Testklasse geschrieben werden. Weitere Informationen zum Erstellen von JUnit 4-Testklassen und zum Verwenden von JUnit 4-Assertions finden Sie unter Lokale Einheitentestklasse erstellen.

So erstellen Sie einen Integrationstest für Ihren Contentanbieter:

  1. Erstellen Sie Ihre Testklasse als abgeleitete Klasse von ProviderTestCase2.
  2. Geben Sie die Klasse AndroidJUnitRunner an, die von AndroidX Test als Standard-Test-Runner bereitgestellt wird.
  3. Legen Sie das Objekt Context aus der Klasse ApplicationProvider fest. Das folgende Snippet zeigt ein Beispiel.

Kotlin


@Throws(Exception::class)
override fun setUp() {
  super.setUp()
  context = ApplicationProvider.getApplicationContext<Context>()
}

Java


@Override
protected void setUp() throws Exception {
  super.setUp();
  setContext(ApplicationProvider.getApplicationContext());
}

So funktioniert ProviderTestCase2

Sie testen einen Anbieter mit einer abgeleiteten Klasse von ProviderTestCase2. Diese Basisklasse erweitert AndroidTestCase und bietet daher das JUnit-Test-Framework sowie Android-spezifische Methoden zum Testen von App-Berechtigungen. Das wichtigste Feature dieser Klasse ist die Initialisierung, mit der die isolierte Testumgebung erstellt wird.

Initialisierung

Die Initialisierung erfolgt im Konstruktor für ProviderTestCase2, das abgeleitete Klassen in ihren eigenen Konstruktoren aufruft. Der Konstruktor ProviderTestCase2 erstellt ein IsolatedContext-Objekt, das Datei- und Datenbankvorgänge zulässt, aber andere Interaktionen mit dem Android-System sperrt. Die Datei- und Datenbankvorgänge selbst werden in einem Verzeichnis ausgeführt, das für das Gerät oder den Emulator lokal ist und ein spezielles Präfix hat.

Der Konstruktor erstellt dann einen MockContentResolver, der als Resolver für den Test verwendet wird.

Schließlich erstellt der Konstruktor eine Instanz des zu testenden Anbieters. Dies ist ein normales ContentProvider-Objekt, das aber alle Umgebungsinformationen aus der IsolatedContext abruft. Es kann daher nur in der isolierten Testumgebung verwendet werden. Alle Tests in der Testlaufklasse werden für dieses isolierte Objekt ausgeführt.

Integrationstests für Contentanbieter werden auf die gleiche Weise wie bei instrumentierten Unittests durchgeführt.

Zu testendes Element

Hier sind einige spezifische Richtlinien für das Testen von Contentanbietern.

  • Mit Resolver-Methoden testen: Auch wenn Sie ein Anbieterobjekt in ProviderTestCase2 instanziieren können, sollten Sie den Test immer mit einem Resolver-Objekt unter Verwendung des entsprechenden URI durchführen. Dadurch wird sichergestellt, dass Sie den Anbieter testen, indem Sie dieselbe Interaktion ausführen, die eine normale Anwendung verwenden würde.
  • Öffentlichen Anbieter als Vertrag testen: Wenn Ihr Anbieter öffentlich und für andere Anwendungen verfügbar sein soll, sollten Sie ihn als Vertrag testen. Hier einige Beispiele:
    • Testen Sie mit Konstanten, die Ihr Anbieter öffentlich verfügbar macht. Suchen Sie beispielsweise nach Konstanten, die sich auf Spaltennamen in einer der Datentabellen des Anbieters beziehen. Diese sollten immer Konstanten sein, die vom Anbieter öffentlich definiert wurden.
    • Testen Sie alle URIs, die Ihr Anbieter anbietet. Ihr Anbieter kann mehrere URIs bereitstellen, die sich jeweils auf einen anderen Aspekt der Daten beziehen.
    • Testen Sie ungültige URIs. Ihre Einheitentests sollten den Anbieter absichtlich mit einem ungültigen URI aufrufen und nach Fehlern suchen. Ein gutes Anbieterdesign ist das Auslösen eines IllegalArgumentException für ungültige URIs.
  • Standardinteraktionen mit Anbietern testen: Die meisten Anbieter bieten sechs Zugriffsmethoden: query(), insert(), delete(), update(), getType() und onCreate(). Ihre Tests sollten sicherstellen, dass alle diese Methoden funktionieren.
  • Geschäftslogik testen: Wenn der Contentanbieter die Geschäftslogik implementiert, sollten Sie diese testen. Die Geschäftslogik umfasst die Verarbeitung ungültiger Werte, finanzielle oder arithmetische Berechnungen, das Entfernen oder Kombinieren von Duplikaten.