Testear nuestra aplicación en la plataforma en la que está diseñada para funcionar es fundamental para garantizar la calidad de la misma. Siendo Android una de las más utilizadas, podemos vernos en la necesidad de ejecutar nuestras pruebas automatizadas directamente sobre dicha plataforma, ya sea utilizando algún tipo de emulador o directamente sobre un dispositivo que se encuentre conectado a nuestra PC. El objetivo de esta publicación es por lo tanto presentar y configurar las herramientas necesarias para la ejecución y desarrollo de Selenium tests sobre Android.

¿Que necesitamos?

  • Android SDK
  • JAVA JDK
  • Appium for Windows
  • Un emulador (en nuestro caso utilizaremos Genymotion)


¿Pero que es Appium?

Appium es una herramienta open source que actua como un webserver con una API REST, recibiendo comandos selenium desde nuestros tests y ejecutándolos en un dispositivo móvil.

appium1

El WebDriver JSON Wire Protocol es el encargado de de traducir los comandos recibidos para que Android pueda interpretarlos. Los tests pueden estar escritos en cualquier lenguaje que pueda ser utilizado con Selenium.

Paso a Paso

Instalar el SDK de Android

Lo primero será descargar e instalar la SDK de Android desde el siguiente link:https://developer.android.com/studio/index.html#tos-header

No vamos a necesitar Android Estudio, por lo tanto  solamente descargaremos la command line tools.

sdk-android

Cuando el instalador nos pregunte que componentes deseamos instalar, solamente debemos chequear los siguientes:

  • Android SDK Platform-tools
  • Android SDK Build-tools
  • Android 4.2.2 (API 17) (para la guia solamente necesitamos esta, pero pueden instalarse las que se necesiten)

El siguiente paso es crear la variable de entorno ANDROID_HOME y asignarle el path de la SDK de android

android-sdk-instalation

Luego vamos a adjuntar a la variable de entorno PATH la ruta a los directorios de Android SDK, toolsplatform-tools, que en la instalación por defecto deberian ser:

C:\Program Files (x86)\Android\android-sdk

C:\Program Files (x86)\Android\android-sdk\platform-tools

C:\Program Files (x86)\Android\android-sdk\tools

Si todo está correctamente configurado, ejecutar el comando “adb devices” nos deberia devolver la lista de los dispositivos detectados.

adb-devices

 

Instalar el emulador de Android:

Existen muchos emuladores en el mercado, pero uno de los mas rápidos en términos de performance y sencillos de configurar es Genymotion, que pueden descargar desde su página principal: https://www.genymotion.com/.

Una vez instalado tendremos que agregar un dispositivo móvil seleccionandolo de la lista, en nuestro caso podremos usar cualquier device que posea la version 4.2.2 de Android.

genymotion-device-list

A continuación vamos a configurar Genymotion para que utilice la SDK de Android que descargamos en los pasos anteriores, en vez de la SDK que trae por defecto.

 

genymotion-configuration

genymotion-adb

Con estas configuraciones vamos a inicializar el dispositivo presionando el bóton “start”.

Instalar Appium e integrar con Genymotion:

Podremos descargar Appium desde el siguiente link : https://bitbucket.org/appium/appium.app/downloads/

Necesitaremos una “app” para realizar nuestra prueba, podremos descargar una muy sencilla creada para este propósito denominada “BitBar” desde el siguiente link:  https://www.dropbox.com/s/65zjcyz15l50c4n/BitbarSampleApp.apk?dl=0

Con solamente arrastar la apk al emulador ya quedará instalada.

bit-bar-install

 

El siguiente paso será iniciar y configurar Appium indicandole la configuración del emulador que se va a utilizar, para esto vamos a hacer click en el ícono de Android y luego realizamos las siguientes configuraciones.

32

34

 

Vamos a asegurarnos que el server address y el puerto esten correctamente configurados:

appium-server-adress

 

Ahora vamos a iniciar el servidor appium:

37

Para comenzar a escribir nuestros tests automatizados, appium posee un inspector de elementos que podemos activar haciendo click sobre la lupa, luego presionando “refresh” podremos obtener una screenshot de la pantalla que se está visualizando actualmente en el device.

appium-inspector
El SDK de android posee también su propia herramienta para inspeccionar elementos, que podemos encontrar dentro de la carpeta tool “C:\Program Files (x86)\Android\android-sdk\tools – > uiautomatorviewer.bat”.

ui-automation-viewer

 

Ejecución de tests automatizados sobre el emulador de android

Para esta guía vamos a utilizar el lenguaje Java, pero como se mencionó anteriormente, los tests podrán estar escritos en cualquier lenguaje soportado por Selenium.

En nuestro proyecto de prueba vamos a necesitar mínimamente las siguientes dependencias en nuestro POM:

  • TestNG (puede utilizarse cualquier otra librería de testing)
  • Selenium
  • Appium
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
 
    <groupId>com.example</groupId>
    <artifactId>myAppiumProject</artifactId>
    <version>1.0-SNAPSHOT</version>
 
    <dependencies>
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>2.53.0</version>
        </dependency>
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>htmlunit-driver</artifactId>
            <version>2.20</version>
        </dependency>
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>6.9.9</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>io.appium</groupId>
            <artifactId>java-client</artifactId>
            <version>3.4.1</version>
            <scope>test</scope>
        </dependency>
    <dependencies>
</project>

En el siguiente test vamos a utilizar el AndroidDriver provisto por la libreria de Appium, incluyendo todas las configuraciones necesarias para para conectarnos al servidor de Appium (ip y puerto) así como también los datos del dispositivo final (version del OS, device name) necesarios para que Appium pueda ejecutar los test en el device correcto ya que podria haber mas de uno conectado.

El test ejecutará las siguientes acciones:

  • Abrirá la applicación  bitBarSample.apk
  • Click en el segundo radio button
  • Escribirá “Testing!” En el text area
  • Click en el boton “Answer”
  • Espera y chequea el texto en la siguiente página
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.remote.MobileCapabilityType;
import org.openqa.selenium.By;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URL;

public class AppiumTest {

    private AndroidDriver driver;
    private WebDriverWait wait;

    @BeforeClass
    public void setUp() throws MalformedURLException {
        //Setup Appium
        DesiredCapabilities caps = DesiredCapabilities.android();
        caps.setCapability(MobileCapabilityType.APP, "C:\\testAPK\\BitbarSampleApp.apk");
        caps.setCapability(MobileCapabilityType.DEVICE_NAME,"EmulatorMotoX");
        caps.setCapability("platformName", "Android");
        caps.setCapability("VERSION", "4.4.2");
        driver = new AndroidDriver(new URL("https://127.0.0.1:4723/wd/hub"), caps);
        wait= new WebDriverWait(driver,20);
    }

    @Test
    public void appiumBitBarTest() throws MalformedURLException, InterruptedException,URISyntaxException {
        //Click second radio button
        driver.findElement(By.name("Use Testdroid Cloud")).click();

        //Write Testing! to the text area
        driver.findElement(By.className("android.widget.EditText")).sendKeys("Testing!");

        //Hide Keyboard
        driver.hideKeyboard();

        //Click Answer Button
        driver.findElement(By.name("Answer")).click();

        //Synchronization after click and check the expected text
        wait.until(ExpectedConditions.presenceOfElementLocated(By.name("You are right!")));
    }

    @AfterClass
    public void teardown(){
        //Teardown operation
        driver.quit();
    }
}

Testing con real device:

Para ejecutar nuestras pruebas en un dispositivo real todo lo que necesitaremos son los drivers de dicho dispositivo, una vez conectado ejecutamos el comando “adb devices” para verificar que este ha sido correctamente reconocido. Si este no es el caso tendremos que ejecutar los siguientes comandos para reiniciar el servidor:

adb kill-server

adb start-server

adb-devices-real

 

Por último todo lo que tendremos que hacer es actualizar la IP tanto en Appium como en el mismo test, y estará listo para ejecutarse en el dispositivo conectado al equipo.

52

 

El hecho de que Appium pueda utilizarse con una amplia variedad de lenguajes sin necesitar configuración extra es una de sus principales ventajas. El Android Driver que provee permite configurar  de manera muy sencilla la conexión, especificando IP y puerto, por lo que podríamos tener una estructura como la siguiente:

appium-server

Como se mencionó en la publicación, podemos tener mas de un dispositivo real conectado al mismo tiempo, en ese caso debemos proveer información mas especifica sobre el dispositivo de destino como el device name o la versión del OS.