Модульное тестирование с помощью 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.

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

Организуйте функции, которые можно комбинировать, вне класса 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 dp x 455 dp, что соответствует виджету 5x4, который показывается на устройстве Pixel 4 в портретном режиме.

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

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

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