Há três maneiras principais de interagir com elementos da interface:
- Os localizadores permitem selecionar um ou vários elementos (ou nós na árvore semântica) para fazer declarações ou executar ações nelas.
- As declarações são usadas para verificar se os elementos existem ou têm determinados atributos.
- As ações injetam eventos de usuário simulados nos elementos, como cliques ou outros gestos.
Algumas dessas APIs aceitam um SemanticsMatcher
para se referir a um ou mais
nós na árvore semântica.
Finders
É possível usar onNode
e onAllNodes
para selecionar um ou vários nós
respectivamente, mas também é possível usar localizadores de conveniência para os
pesquisas, como onNodeWithText
, e
onNodeWithContentDescription
Confira a lista completa na
Folha de referência de testes do Compose.
Selecionar um único nó
composeTestRule.onNode(<<SemanticsMatcher>>, useUnmergedTree = false): SemanticsNodeInteraction
// Example
composeTestRule
.onNode(hasText("Button")) // Equivalent to onNodeWithText("Button")
Selecionar vários nós
composeTestRule
.onAllNodes(<<SemanticsMatcher>>): SemanticsNodeInteractionCollection
// Example
composeTestRule
.onAllNodes(hasText("Button")) // Equivalent to onAllNodesWithText("Button")
Árvore não mesclada
Alguns nós mesclam informações de semântica dos filhos deles. Por exemplo, com dois elementos de texto mescla os rótulos dos elementos de texto:
MyButton {
Text("Hello")
Text("World")
}
Em um teste, use printToLog()
para mostrar a árvore semântica:
composeTestRule.onRoot().printToLog("TAG")
Esse código gera a seguinte saída:
Node #1 at (...)px
|-Node #2 at (...)px
Role = 'Button'
Text = '[Hello, World]'
Actions = [OnClick, GetTextLayoutResult]
MergeDescendants = 'true'
Se você precisar fazer a correspondência de um nó do que seria a árvore não mesclada, defina
useUnmergedTree
como true
:
composeTestRule.onRoot(useUnmergedTree = true).printToLog("TAG")
Esse código gera a seguinte saída:
Node #1 at (...)px
|-Node #2 at (...)px
OnClick = '...'
MergeDescendants = 'true'
|-Node #3 at (...)px
| Text = '[Hello]'
|-Node #5 at (83.0, 86.0, 191.0, 135.0)px
Text = '[World]'
O parâmetro useUnmergedTree
está disponível em todos os finders. Por exemplo, aqui
é usado em um localizador de onNodeWithText
.
composeTestRule
.onNodeWithText("World", useUnmergedTree = true).assertIsDisplayed()
Declarações
Verifique as declarações chamando assert()
no SemanticsNodeInteraction
.
retornados por um localizador com um ou vários correspondentes:
// Single matcher:
composeTestRule
.onNode(matcher)
.assert(hasText("Button")) // hasText is a SemanticsMatcher
// Multiple matchers can use and / or
composeTestRule
.onNode(matcher).assert(hasText("Button") or hasText("Button2"))
Você também pode usar funções de conveniência para as declarações mais comuns, como
assertExists
, assertIsDisplayed
e assertTextEquals
.
Confira a lista completa na folha de referência de testes no Compose.
Também há funções para verificar declarações em uma coleção de nós:
// Check number of matched nodes
composeTestRule
.onAllNodesWithContentDescription("Beatle").assertCountEquals(4)
// At least one matches
composeTestRule
.onAllNodesWithContentDescription("Beatle").assertAny(hasTestTag("Drummer"))
// All of them match
composeTestRule
.onAllNodesWithContentDescription("Beatle").assertAll(hasClickAction())
Ações
Para injetar uma ação em um nó, chame uma função perform…()
:
composeTestRule.onNode(...).performClick()
Veja alguns exemplos de ações:
performClick(),
performSemanticsAction(key),
performKeyPress(keyEvent),
performGesture { swipeLeft() }
A lista completa pode ser encontrada na Folha de referência de testes no Compose.
Matchers
Diversos matchers estão disponíveis para testar o Compose o código-fonte.
Matchers hierárquicos
Os correspondentes hierárquicos permitem subir ou descer a árvore semântica e realizar correspondência.
fun hasParent(matcher: SemanticsMatcher): SemanticsMatcher
fun hasAnySibling(matcher: SemanticsMatcher): SemanticsMatcher
fun hasAnyAncestor(matcher: SemanticsMatcher): SemanticsMatcher
fun hasAnyDescendant(matcher: SemanticsMatcher): SemanticsMatcher
Veja alguns exemplos desses matchers em uso:
composeTestRule.onNode(hasParent(hasText("Button")))
.assertIsDisplayed()
Seletores
Uma forma alternativa de criar testes é usar seletores, que podem tornar alguns testes mais legíveis.
composeTestRule.onNode(hasTestTag("Players"))
.onChildren()
.filter(hasClickAction())
.assertCountEquals(4)
.onFirst()
.assert(hasText("John"))
Confira a lista completa na folha de referência de testes no Compose.
Outros recursos
- Testar apps no Android: os principais testes do Android. página de destino oferece uma visão mais ampla dos fundamentos e das técnicas de teste.
- Conceitos básicos de testes:saiba mais os principais conceitos por trás dos testes de apps Android.
- Testes locais:é possível executar alguns testes. localmente, na sua própria estação de trabalho.
- Testes instrumentados:é bom praticar também a execução de testes instrumentados. Ou seja, testes que são executados diretamente no dispositivo.
- Integração contínua: A integração contínua permite integrar os testes à implantação pipeline.
- Teste diferentes tamanhos de tela:com alguns dispositivos disponíveis para os usuários, teste diferentes telas tamanhos.
- Espresso: embora voltado para visualizações baseadas em visualização IUs, o conhecimento sobre o Espresso ainda pode ser útil para alguns aspectos do Compose. testes.