Testes de unidade com o Glance

A API de teste de unidade do Glance permite testar o código do Glance sem inflar visualizações ou precisar de um UI Automator. Por exemplo, a API de teste de unidade permite verificar condições, como se os elementos estão em uma lista ou se as caixas foram marcadas, usando comparadores como hasContentDescriptionEqualTo ou isChecked.

Essa API é leve e exige menos configuração. Assim, você pode realizar o desenvolvimento orientado a testes enquanto desenvolve partes individuais do widget e as organiza para melhorar a reutilização do código.

Configuração

As dependências necessárias para usar a biblioteca de testes de unidade são mostradas nos exemplos a seguir:

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

Estrutura do teste

Organize funções combináveis fora da classe GlanceAppWidget para permitir a reutilização de código e o teste de unidade. Reduza a complexidade das unidades em teste o máximo possível.

É possível segmentar um elemento combinável de teste com provideComposable e executar seus testes de unidade em um ou vários nós do Glance com onNode ou onAllNodes respectivamente.

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" },
            )
        }
    }
}

Definir contexto e tamanho para o teste

Se a função combinável ler o contexto usando o método LocalContext.current(), defina um contexto usando setContext(). Caso contrário, esta etapa é opcional.

Você pode usar qualquer framework de teste de unidade do Android baseado em JVM, como o Robolectric, para fornecer o contexto.

Se a função combinável acessar LocalSize, defina o tamanho pretendido para o teste antes de fornecer um elemento combinável no teste. O tamanho padrão é 349 dp x 455 dp, o que equivale a um widget 5x4 mostrado em um dispositivo Pixel 4 no modo retrato.

  • Se o AppWidget usar sizeMode == Single, defina isso como minWidth e minHeight no arquivo info.xml do widget.
  • Se o AppWidget usar sizeMode == Exact, você poderá identificar os tamanhos a serem testados de maneira semelhante a como determinar um tamanho para seu widget e identificar tamanhos de paisagem e retrato em que o widget pode aparecer e testar para eles.
  • Se o AppWidget usar sizeMode == Responsive, defina um dos tamanhos da lista fornecida ao especificar o sizeMode.

A duração padrão para um tempo limite de teste é de 1 segundo, mas você pode transmitir uma duração personalizada como argumento para o método runGlanceAppWidgetUnitTest se a infraestrutura de teste exigir um tempo limite diferente.

Para mais informações e exemplos de código, consulte a documentação de referência para runGlanceAppWidgetUnitTest.