Enmilocalfunciona

Thoughts, stories and ideas.

Configuración de un entorno de testing funcional automatizado para Android (Selenium + Appium)

Publicado por Cristina Lopez-Goicochea Juarez el

QASeleniumAppium

En este artículo veremos como configurar un entorno de testing funcional automatizado para aplicaciones móviles, en este caso Android,  empleando para ello Appium y Selenium.

Configuración del entorno

Para poder realizar un proyecto de testing funcional automatizado con Selenium y Appium necesitaremos las siguientes herramientas:

Una vez instaladas estas tres herramientas será preciso configurar correctamente las variables de entorno:

JAVA_HOME: Ruta donde está ubicado el JDK de java (Ejemplo : C:\Program Files\Java\jdk1.8.0_92)  
JRE_HOME: Ruta donde está ubicado el JRE de java (Ejemplo : C:\Program Files\Java\jre1.8.0_92)  
M2_HOME: Ruta donde está instalado Maven (Ejemplo : C:\Maven)  
M2: Ruta donde está ubicado el ejecutable de Maven (Ejemplo : C:\Maven\bin)  
ANDROID_HOME: Ruta donde está el SDK de Android (Ejemplo : C:\Users\<user>\AppData\Local\Android\sdk)  
APPIUM_HOME: Ruta donde está ubicada la instalación de Appium (Ejemplo : C:\Program Files (x86)\Appium)  

También deberán añadirse al PATH de Variables del Sistema

Configuración de Appium

Al ejecutar Appium se presentará una pantalla como la siguiente:

Tendremos las siguientes opciones, señaladas en la imagen anterior:

  • Android Settings : Configuración de la aplicación Android / iOS a ejecutar.
  • General Settings : Configuración general de Appium.
  • Developer Settings : Configuración para desarrolladores.
  • Inspector : Herramienta para inspeccionar los elementos de la aplicación.
  • Launch : Carga la aplicación definida en Android Settings.
  • Clear output log : Borra el log generado en pantalla.

En General Settings indicaremos la IP del servidor y el puerto. En caso de desarrollo local indicaremos IP 127.0.01 y puerto 4723.

Asimismo también activaremos las opciones Check For Updates y Pre Launch Application.

En Developer Settings no aplicaremos nigún cambio dejando todas las opciones deshabilitadas.

En Android Settings definiremos la aplicación Android / iOS a ejecutar.

No habilitaremos el emulador en este punto ya que lo arrancaremos manualmente desde Android Studio.

Ejecución del Inspector Appium

Una vez cargada una aplicación a través de Appium, podemos observar los elementos de la aplicación y ver sus características a través del Inspector.

Para ejecutar el Inspector hacemos clic en la lupa de Appium, ubicada en la parte superior derecha.

Al ejecutar el Inspector aparece una pantalla como la siguiente:

Pulsando el botón Refresh, nos aparecerán los elementos. Desplegando el árbol podremos acceder a cada uno de ellos y ver sus características.

Creación del test

Creamos un Android Project en Android Studio y añadimos una clase con un método para conectar con Appium:

public void connectAppium() throws Exception {  
  File app = new File(apkPath + apkFile);
  URL url = new URL ("http://127.0.0.1:4723/wd/hub");
  URLConnection urlConnection = url.openConnection();
  DesiredCapabilities capabilities = new DesiredCapabilities();
  capabilities.setCapability("app", app.getAbsolutePath());
  driver = new AndroidDriver(urlConnection.getURL(), 
                             capabilities);
}

También crearemos un método para cerrar la sesión de WebDriver:

public void disconnectAppium() throws Exception {  
  driver.quit();
}

Para poder interactuar con los elementos de la aplicación utilizaremos Selenium. En el caso siguiente buscaremos una lista de elementos cuya "ClassName" sea "android.widget.EditText". Recogemos el primero de los elementos y verificamos mediante un Assert que el texto del objeto "EditText" sea "Email".

Asimismo, también buscamos el botón de la pantalla a través de su "ClassName" y verificamos que su texto sea "Sign in or register".

public void testVerifyElements() throws Exception {  
  List listElements = driver    
       .findElementsByClassName("android.widget.EditText");
  WebElement email = (WebElement)listElements.get(0);
  Assert.assertEquals("Email", email.getText());
  WebElement password = (WebElement)listElements.get(1);
  Assert.assertEquals("", password.getText());
  WebElement boton = driver
       .findElementByClassName("android.widget.Button");
  Assert.assertEquals("Sign in or register", boton.getText());
}

Para poder interactuar con alguno de los campos bastará con  buscar el elemento en concreto y establecer el texto o la acción a realizar:

WebElement email = (WebElement)listElements.get(0);  
email.sendKeys(usuario);  
WebElement boton = driver  
    .findElementByClassName("android.widget.Button");
boton.click();  

Este es el aspecto del fichero build.gradle:

apply plugin: 'com.android.application'

android {  
    compileSdkVersion 23
    buildToolsVersion "23.0.3"

    testOptions {
        unitTests.returnDefaultValues = true
    }
    defaultConfig {
        applicationId "apk.test.project"
        minSdkVersion 21
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        multiDexEnabled true
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile
            ('proguard-android.txt'), 'proguard-rules.pro'
        } 
    }
    packagingOptions {
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/DEPENDENCIES'
    }
}

dependencies {  
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.2.1'
    compile 'com.android.support:design:23.2.1'
    compile 'io.appium:java-client:3.4.1'
}
Enlaces

Descarga de la aplicación utilizada para el test:
https://github.com/tutsplus/Appium-Introduction/blob/master/app/AUT.apk?raw=true

La aplicación tiene dos usuarios login de test :
success@envato.com/password y success2@envato.com/password2.