Descubriendo test en móviles

test aplicacion móvil

Para esta interacción del Proyecto Merlín en ASPgems estamos revisando pruebas automatizadas en dispositivos móviles tanto Android como iOS. Es por ello que se nos abre un abanico de opciones a la hora de realizar e integrar estos test.

Principalmente revisaremos las dos mayores opciones del mercado: AWS Device Farm y Firebase Test Lab.

 

Toma de contacto

AWS Device Farm es un servicio de pruebas de aplicaciones que permite probar aplicaciones Android, iOS y web e interactuar con ellas en varios dispositivos al mismo tiempo. Además, permite reproducir errores y ver resultados en un dispositivo en tiempo real.

De manera similar, Firebase Test Lab es una infraestructura de prueba de apps basada en la nube. Con una sola operación, puedes probar tu app para Android o iOS en una amplia variedad de dispositivos y configuraciones, y ver los resultados.

AWS Device Farm

Amazon Web Service permite subir tus propias aplicaciones en un formato .apk en el caso de Android y .ipa en el de iOS. Tras una serie de sencillos pasos, este servicio ejecutará pruebas automáticas para probar los elementos de la aplicación.

Principalmente, esta plataforma permite diferentes tipos de pruebas automáticas:

  • Built-in: Fuzz: Lanza eventos aleatorios
  • Built-in: Explorer: Permite pasar una pantalla de autenticación
  • Calabash: Permite escribir tus propias pruebas en Ruby
  • Appium: Permite escribir tus test en Python o Java
  • Pruebas de instrumentación
  • UI Automator
  • XCTest: Sólamente para iOS.

Además, permite ejecutar estos test en varios dispositivos. Esto permite encontrar fallos basados en el tipo de dispositivo y versión de Android o iOS.

Por otra parte, en AWS Device Farm existen pruebas de acceso remoto para reproducir los problemas de los clientes. Esta función permite interactuar con el dispositivo a través del navegador web en tiempo real, con el fin de probar la funcionalidad.

Finalmente, la ejecución de los test automáticos se realiza en unos sencillos pasos:

  1. Crear el proyecto donde se ejecutarán los test automáticos y crear la ejecución.
  2. Subir la aplicación a la plataforma.
  3. Elegir el tipo de prueba a realizar y subirla si es necesario.
  4. Elegir los dispositivos donde se ejecutarán los test.
  5. Especificar el estado del dispositivo (WiFi, Bluetooth, …)
  6. Revisar el tiempo de ejecución del test y ejecutarlo.

Una vez terminada la ejecución, se podrá mostrar una página de resumen con los resultados de la prueba:

  • Número total de pruebas realizadas.
  • Lista de las pruebas con advertencias y errores.
  • Una lista de los dispositivos y los resultados de las pruebas para cada uno.
  • Todas las capturas de pantalla tomadas durante la ejecución agrupadas por dispositivo.

Firebase Test Lab

Firebase Test Lab es una infraestructura de prueba de apps basada en la nube. Con una sola operación, puedes probar tu app para Android o iOS en una amplia variedad de dispositivos y configuraciones, y ver los resultados (que incluyen registros, videos y capturas de pantalla) en Firebase console.

Además, ejecuta pruebas de Espresso y UI Automator 2.0 en apps para Android, y pruebas de XCTest en apps para iOS. Si solo realizas pruebas en Android, puedes hacer que Test Lab las cree en tu lugar mediante pruebas Robo automatizadas.

Como lo que queremos es automatizar las pruebas vamos a usar las pruebas Robo.

La prueba Robo analiza la estructura de la IU de la app, la explora metódicamente y simula las actividades de un usuario de manera automática. Siempre simula las mismas actividades del usuario en el mismo orden cuando la usas para probar una app en una configuración del dispositivo específica con los mismos ajustes. Esto permite usar la prueba Robo para validar soluciones de errores y probar regresiones.

No obstante, existen problemas con este tipo de prueba y actualmente la prueba Robo tiene las siguiente limitación: Compatibilidad con el marco de trabajo de IU.

La prueba Robo solo es compatible con apps que usan elementos de IU del marco de trabajo de la IU de Android (incluidos los objetos View y ViewGroup, pero sin incluir objetos WebView). Si usas la prueba Robo con apps que usan otros marcos de trabajo de IU, incluidas las apps que usan el motor de juegos de Unity, es posible que la prueba se cierre sin explorar más allá de la primera pantalla. Lamentablemente la aplicación que queríamos probar estaba construida bajo una diseño basado en objeto WebView y por tanto no conseguíamos pasar el primer nivel de acceso a la aplicación.

 

Test con Calabash

Ahora vamos a realizar las pruebas sobre una aplicación móvil con Calabash. Primero, necesitamos una aplicación en formato .apk en el caso de Android y .ipa en el de iOS para realizar las pruebas sobre ella. En nuestro caso vamos a hacerlo con una aplicación Android.

Es necesario que tengamos descargado el SDK de Android y el JDK de Java, además de Ruby instalado en nuestro sistema.

Cuando tengamos nuestro .apk y antes de instalar calabash, necesitamos crear dos variables de entorno ANDROID_HOME y JAVA_HOME cada una con la ruta al SDK y al JDK respectivamente.

Para instalar Calabash se recomienda utilizar Bundler ya que necesitaremos instalar dos gemas. Nuestro Gemfile quedará de la siguiente manera:

# Contents of Gemfile
source "https://rubygems.org"

gem 'calabash-android'
gem 'cucumber

Tras esto, necesitamos instalar estas gemas:

bundle install

Ahora necesitamos ir a la carpeta del proyecto donde queramos hacer las pruebas o crear una y generar el esqueleto de Calabash con:

bundle exec calabash-android gen

Esto crea unos ficheros y directorios necesarios para hacer test con Calabash. Los más importantes son los ficheros del directorio feature, tienen la extensión .feature y es donde irán los pasos del test a seguir. Estos pasos irán descritos en un subdirectorio llamado step_definitions con ficheros .rb.

Después de conocer la arquitectura de Calabash necesitamos un sitio donde probar todos estos test. Las opciones son: virtualizar un dispositivo móvil (con Android Studio por ejemplo) o conectar tu dispositivo móvil y habilitarlo para pruebas. Nosotros escogimos la segunda con adb, que permite utilizar tu dispositivo móvil para probar las aplicaciones a través del cable USB. Es importante tener activadas las opciones de desarrollador y el modo de depuración en el dispositivo que se va a utilizar.

Ahora que ya tenemos todo preparado, necesitamos firmar el .apk con nuestras claves, pero para ello necesitamos decirle cuál es nuestra debug.keystore

bundle exec calabash-android setup
bundle exec calabash-android resign nombreDeNuestraApp.apk

Creación de tests

En primer lugar crearemos un fichero my-feature-1-login.feature para nuestro primer test. Estos ficheros vienen definidos por:

Feature: Login feature   # Nombre de la feature 

Scenario: As a valid user I can log into my app  # Escenario del test
  # Pasos del test
  Given my app is running  # Iniciamos la app
  Then I press login button  # Tocamos el boton de login
  Then I press exit button  # Tocamos el boton de salida

Cada uno de los pasos será definido con la sintaxis de calabash en nuestro fichero calabash_steps.rb dentro del directorio step_definitions:

require 'calabash-android/calabash_steps'

Given /^my app is running$/ do
  start_test_server_in_background
  puts "Server started"
  sleep 4
end

Then /^I touch "([^\"]*)" button$/ do |button|
  touch("* marked: #{button}")
  sleep 2
end

Hay que tener en cuenta si tu aplicación es un WebView ya que en ese caso hay que utilizar un tipo de dato distinto en el fichero de pasos.

También se puede utilizar la consola de Calabash para depurar cada uno de los pasos utilizando el siguiente comando:

bundle exec calabash-android console

El último paso es ejecutar nuestros test en local para ver si funcionan bien:

bundle exec calabash-android run nombreDeNuestraApp.apk

Estos test podrán ser subidos a AWS Device Farm para probarlos en la nube como se indicó al principio del artículo.