Einheitentests mit „ Glance“

Mit der Glance-Unittest-API können Sie Ihren Glance-Code testen, ohne Ansichten zu rendern oder einen UI-Automator zu benötigen. So können Sie mit der Unittest-API beispielsweise Bedingungen wie das Vorhandensein von Elementen in einer Liste oder das Markiertsein von Optionen mithilfe von Matchern wie hasContentDescriptionEqualTo oder isChecked überprüfen.

Diese API ist schlank und erfordert weniger Einrichtungsaufwand. Sie bietet damit ideale Voraussetzungen für die testgetriebene Entwicklung einzelner Teile Ihres Widgets und für deren Organisation, um die Wiederverwendung von Code zu verbessern.

Einrichten

Die Abhängigkeiten, die für die Verwendung der Unittest-Bibliothek erforderlich sind, sind in den folgenden Beispielen aufgeführt:

// Other Glance and Compose runtime dependencies.
...
testImplementation 'androidx.glance:glance-testing:1.1.1'
testImplementation 'androidx.glance:glance-appwidget-testing:1.1.1'
testImplementation 'org.robolectric:robolectric:4.11.1'
...
// You may include additional dependencies, such as Robolectric, if your test
// needs to set a LocalContext.

Teststruktur

Organisieren Sie komponierbare Funktionen außerhalb der GlanceAppWidget-Klasse, um die Wiederverwendung von Code und Unittests zu ermöglichen. Reduzieren Sie die Komplexität der zu testenden Einheiten so weit wie möglich.

class MyGlanceComposableTest {
    @Test
    fun myNewsItemComposable_largeSize_hasAuthorAsSubtitle() = runGlanceAppWidgetUnitTest {
        // Prepare inputs and state
        setAppWidgetSize(100.dp, 100.dp)

        // Set the composable under test
        provideComposable {
            MyNewsItemComposable(TEST_NEWS_ITEM)
        }

        // Perform assertions
        onNode(hasTestTag("subTitle"))
            .assertHasText(TEST_NEWS_ITEM.authorName)
    }
}

Kontext und Größe des Tests festlegen

Wenn Ihre komponierbare Funktion den Kontext mit der Methode LocalContext.current() liest, müssen Sie mit setContext() einen Kontext festlegen. Andernfalls ist dieser Schritt optional.

Sie können zur Kontextbereitstellung ein beliebiges JVM-basiertes Android-Unittest-Framework verwenden, wie z. B. Robolectric.

Wenn Ihre komponierbare Funktion auf LocalSize zugreift, legen Sie vor der Bereitstellung einer komponierbaren Funktion im Test die gewünschte Größe für den Test fest. Die Standardgröße ist 349 dp × 455 dp. Das entspricht einem 5 × 4-Widget auf einem Pixel 4 im Hochformat.

  • Wenn Ihr App-Widget sizeMode == Single verwendet, können Sie dies in der info.xml-Datei Ihres Widgets auf minWidth und minHeight festlegen.
  • Wenn Ihr App-Widget sizeMode == Exact verwendet, können Sie die zu testenden Größen auf ähnliche Weise ermitteln wie beim Festlegen einer Größe für Ihr Widget. Ermitteln Sie die Größen im Quer- und Hochformat, in denen Ihr Widget möglicherweise angezeigt wird, und testen Sie es für diese Größen.
  • Wenn Ihr App-Widget sizeMode == Responsive verwendet, können Sie diese Option auf eine der Größen aus der Liste festlegen, die Sie beim Angeben von sizeMode bereitstellen.

Die Standarddauer für ein Test-Timeout beträgt 1 Sekunde. Wenn Ihre Testinfrastruktur ein anderes Timeout erzwingt, können Sie jedoch eine benutzerdefinierte Dauer als Argument an die runGlanceAppWidgetUnitTest-Methode übergeben.

Weitere Informationen und Codebeispiele finden Sie in der Referenzdokumentation zu runGlanceAppWidgetUnitTest.