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

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

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

Настраивать

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

// 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.

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

Организуйте компонуемые функции вне класса 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" },
            )
        }
    }
}

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

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

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

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

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

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

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