Há três maneiras principais de interagir com elementos da interface:
- Os Finders 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 uma 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, um botão 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,
ele é usado em um finder 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"))
Também é possível usar funções de conveniência para as declarações mais comuns, como
assertExists
, assertIsDisplayed
e assertTextEquals
.
A lista completa pode ser encontrada 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"))
A lista completa pode ser encontrada na Folha de referência de testes no Compose.
Outros recursos
- Testar apps no Android: a página inicial principal de testes do Android oferece uma visão mais ampla dos conceitos básicos 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 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 seus testes ao pipeline de implantação.
- Testar diferentes tamanhos de tela: com alguns dispositivos disponíveis para os usuários, é necessário testar diferentes tamanhos de tela.
- 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.