Blog > Automação de Testes Mobile com Calabash Android - Parte 2

19/out

Neste segundo e último post da série sobre Automação de Teste para Android com Calabash iremos aprender como criar os steps definition para cada passo de nossa app mobile, criando assim um script de teste funcional. Aprenderemos comandos de interação com o Calabash e a como executar o teste.

Introdução

Se você perdeu ou não leu o primeiro post sobre Calabash, é recomendado que você leia o post abaixo e os posts recomendados

Automação de Testes Mobile com Calabash Android - Parte 1

Lembrando que nós estamos trabalhando com a seguinte sequência para a automação com o Calabash Android, onde as "riscadas" já foram vistas no primeiro post.

  1. Criação da Estrutura
  2. Escrever a Feature
  3. Executar a Feature
  4. Criar os Steps Definitions
  5. Identificar os elementos pelo console
  6. Atualizar os Steps Definitions
  7. Executar a Feature

Desenvolvendo o script

Identificando os elementos pelo console

Para criar o script por completo é necessário criar os comandos para a interação com o TrianguloApp. Isso é feito através do Console no Calabash.
Ele é uma ferramenta de linha de comando onde, através de comandos específicos do próprio Calabash podemos identificar os elementos na tela.
Aprenderemos os comandos básicos do Calabash Console com exemplos diretamente na nossa app.
Lembre-se que o emulador deve estar aberto e executando para a execução dos passos abaixo.

Iniciando o Calabash Console

Primeiro navegue até o diretório de sua aplicação.

Após execute o comando:

calabash-android console TrianguloApp.apk

Depois de alguns instantes o console será ativado para aceitar todos os comandos

Após isso é necessário mais dois passos: reinstalar a aplicação e iniciar o servidor de teste

Para reinstalar a app execute o comando

reinstall_apps

Este comando é necessário na primeira execução ou sempre que a app (arquivo .apk) sofrer atualização.

Para iniciar o servidor de teste, logo após ter reinstalado a app execute o comando. Este comando é sempre necessário para iniciar a localização dos componentes na tela.

start_test_server_in_background

Listando todos os componentes

Podemos listar todos os componentes pertencente a app com o comando

query(“*”)

A lista de componentes apresenta um objeto json escrito na tela, com cada atributo dos componentes (como classe, ID, textos, etc…)
Esse comando pode (deve) ser o primeiro comando a ser executado para identificar os componentes na tela

Localizando um componente por ID

Uma vez que os componentes estão listados é interessante identifica-los pelo seu ID (quando existir). A sintaxe do comando é:

query(“* id:'id do componente'")

Um exemplo do comando, para localizar o Lado 1, é:

query(“* id:'txtLado1'")

Preenchendo um campo de texto

Se apenas mandarmos localizar o calabash irá localizar o componente e mais nada. Se desejarmos interagir com ele é necessário executar alguma ação.
Para preencher algum campo usaremos o comando

query("* id:'id do componente'", setText:”texto")

Note que ele é a junção do comando de localização, adicionando o setText

Um exemplo, para preencher o valor “3” no Lado 1, é:

query("* id:'txtLado1'", setText:"3")

Alternativamente, se você deseja que o código fique mais claro, podemos utilizar a função enter_text, que possui a seguinte sintaxe enter_text “ '", “"

Um exemplo, para preencher o valor “3” no Lado 1, é:

enter_text "* id:'txtLado1'", "3"

Visualize a imagem abaixo. Assim que cada comando de preenchimento de texto é executado no calabash_console o emulador com a app é utilizada.

Clicando em componentes

Para clicar em algum componente usaremos o comando touch(“”), onde a localização que usaremos será por ID.
Um exemplo, para clicar no botão Calcular, é:

touch("* id:'btnCalcular'")

Note na imagem abaixo que, logo na execução do touch o botão Calcular é pressionado apresentando o resultado da classificação do triângulo.

Localizando textos

A última parte é a localização de textos. Não faremos uma validação entre resultado esperado x obtido porque irá envolver outras bibliotecas que não serão necessárias agora.
Se algum componente possui um texto poderemos localizar por este e, caso o texto não seja o mesmo ou o componente não esteja na tela, um erro é apresentado.
Para isso podemos usar a função element_exists passando como parâmetro a localização:

element_exists("* text:’texto'")


Ele irá retornar true se encontrou ou false caso contrário.

Um exemplo, aplicado ao texto que é apresentado quando clicamos no botão Calcular sem preencher todos os campos, é:

element_exists("* text:'Preencha todos os campos'")

Atualizar o Steps Definitions

Agora que sabemos localizar os componentes e interagir com os mesmos, é necessário atualizar agora os Steps Definition com os comandos necessários em cada Dado, Quando e Então.
Vamos pensar de forma lógica: cada Dado, Quando e Então possui, pelo menos, um comando a ser executado (query, touch ou element_exists).
Para atualizar é necessário abrir o arquivo triangulo.rb

Abaixo vou colocar o trecho da atualização do Dado e o Quando para o Lado 1

Dado(/^que estou na tela do TrianguloApp$/) do
   element_exists("* text:'TrianguloApp'")
end
Quando(/^eu preencher o campo Lado 1 com "(.*?)"$/) do |lado1|
   enter_text "* id:'txtLado1'", "3"
end

Note que no Dado utilizei o comando element_exist para verificar se o texto “TrianguloApp”, que está no topo da aplicação é exibido.
Depois utilizei o comando query com o setText para preencher o Lado 1.

Como utilizar os parâmetros proveniente do arquivo .feature?

No tópico para a criação das Steps Definitions vimos que qualquer texto colocado em aspas duplas vira um parâmetro.
Para utilizar o parâmetro proveniente do arquivo .feature usaremos a notação #{parametro}.
Exemplo baseado no preenchimento do Lado 1:

enter_text "* id:'txtLado1'", "#{lado1}"

Exemplo

Dado(/^que estou na tela do TrianguloApp$/) do
   element_exists("* text:'TrianguloApp'")
end
Quando(/^eu preencher o campo Lado 1 com "(.*?)"$/) do |lado1|
   enter_text "* id:'txtLado1'", "${lado1}"
end

Continue lendo o post para ver toda a execução, mas tente fazer ai na sua máquina a atualização dos demais passos no Steps Definition. Mais a frente você poderá visualizar o projeto completo.

Executando o script

Já aprendemos a executar o script, que é através do arquivo triangulo.feature… Mas como ele é executado associando os comandos colocados no arquivo triangulo_steps.rb?
Quando o arquivo .feature é executado o Calabash procura o mesmo texto de cada passo da feature (Dado, Quando e Então) contido em algum arquivo .rb na pasta step_definitions.
Para facilitar a associação nós, geralmente, colocamos o nome do arquivo . rb como mesmo nome do arquivo .feature mais o sufixo “_steps”. Se desenvolvermos outros testes com os mesmos textos do Dado, Quando e Então não será necessário criar outro steps definition (arquivo .rb) pois o Calabash fará um reaproveitamento.

Executar a Feature

Antes de executarmos a feature e visualizarmos o resultado remova o arquivo my_first.feature da pasta features.
Agora execute o comando

calabash-android run TrianguloApp.apk

Lembre-se que o emulador deve estar aberto e executando para isso.

Você verá no console a feature e o resultado da execução.

A minha execução abaixo dá erro no final por problema de encoding (a acentuação no resultado). Para garantir que você execute sem erros sempre coloque o encoding para UTF-8.

Obtenção da app e código

Você pode fazer o download do TriânguloApp e visualizar o código resolvido no GitHub da Qualister no projeto exemplo-calabash-android

https://github.com/qualister-consultoria/exemplo-calabash-android

Desafio

Depois de ter conseguido criar e executar com sucesso o teste para calcular o triângulo equilátero tente adicionar mais três testes:

  • Calcular o triângulo escaleno, que retorna a mensagem “O triângulo é Escaleno"
  • Calcular o triângulo isósceles, que retorna a mensagem “O triângulo é Isósceles"
  • Validar a mensagem “Preencha todos os campos” se algum lado não for preenchido

Lembre-se de que você pode atualizar a sua mesma feature, mas se ela conter algum passo não existente é necessário adicioná-lo ao steps definition.

O resultado do desafio também pode ser visualizado no GitHub do projeto.

POSTS RELACIONADOS

AGENDA

CURSOS RELACIONADOS