Модульное тестирование с помощью Glance

API модульного тестирования Glance позволяет тестировать код Glance без раздувания представлений или необходимости использования автоматизатора пользовательского интерфейса. Например, API модульного тестирования позволяет проверять условия, такие как наличие элементов в списке или установку флажков, с помощью сопоставителей, таких как hasContentDescriptionEqualTo или isChecked.

Этот API не требует сложной настройки, поэтому вы можете использовать разработку через тестирование, создавая отдельные части виджета и организуя их так, чтобы улучшить повторное использование кода.

Настроить

Зависимости, необходимые для использования библиотеки модульного тестирования, показаны в следующих примерах:

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

Структура теста

Организуйте composable-функции за пределами класса GlanceAppWidget, чтобы обеспечить повторное использование кода и модульное тестирование. Максимально упростите тестируемые блоки.

Вы можете настроить таргетинг на тестовую composable-функцию с помощью provideComposable и запустить модульные тесты на одном или нескольких узлах Glance с помощью onNode или onAllNodes соответственно.

private const val FAKE_HEADLINE = "EXTRA! EXTRA! READ ALL ABOUT IT!"

class MyGlanceComposableTest {
    @Test
    fun myNewsItemComposable_largeSize_hasHeadline() = runGlanceAppWidgetUnitTest {
        // Set the composable to test
        provideComposable {
            MyNewsItemComposable(FAKE_HEADLINE)
        }

        // Perform assertions
        onNode(hasTestTag("headline"))
            .assertHasText(FAKE_HEADLINE)
    }


    @Composable
    fun MyNewsItemComposable(headline: String) {
        Row {
            Text(
                text = headline,
                modifier = GlanceModifier.semantics { testTag = "headline" },
            )
        }
    }
}

Задайте контекст и размер тестирования

Если composable-функция считывает контекст с помощью метода LocalContext.current(), необходимо задать контекст с помощью setContext(). В противном случае этот шаг можно пропустить.

Для предоставления контекста можно использовать любой фреймворк модульного тестирования Android на основе JVM, например Robolectric.

Если ваша composable-функция обращается к LocalSize, задайте нужный размер для теста, прежде чем предоставлять composable-функцию в тесте. Размер по умолчанию – 349 x 455 dp, что эквивалентно виджету 5 x 4 на устройстве Pixel 4 в портретном режиме.

  • Если в AppWidget используется sizeMode == Single, вы можете задать для этого параметра значения minWidth и minHeight в файле info.xml виджета.
  • Если в виджете используется sizeMode == Exact, вы можете определить размеры для тестирования так же, как определяете размер виджета. Определите размеры для альбомной и портретной ориентации, в которых может отображаться виджет, и протестируйте их.
  • Если в виджете используется sizeMode == Responsive, вы можете выбрать один из размеров, указанных в списке sizeMode.

По умолчанию время ожидания составляет одну секунду, но вы можете передать другое значение в качестве аргумента методу runGlanceAppWidgetUnitTest, если в вашей инфраструктуре тестирования используется другое время ожидания.

Дополнительную информацию и примеры кода можно найти в справочной документации по runGlanceAppWidgetUnitTest.