SlideShare una empresa de Scribd logo
1 de 46
Descargar para leer sin conexión
Pablo Guardiola
Testeas o k ase??
@Guardiola31337 - pguardiola.com
Agenda
Pablo Guardiola

@Guardiola31337 - pguardiola.com

‣

Importancia del testing sobre dispositivos móviles

‣

Robolectric

‣

Demo
Numerosas apps en los markets = Competencia brutal
Pablo Guardiola
‣
‣

@Guardiola31337 - pguardiola.com

Número de apps Android en el market: 866033
Porcentaje de apps de baja calidad: 23 %
Numerosas apps en los markets = Competencia brutal
Pablo Guardiola
‣
‣

@Guardiola31337 - pguardiola.com

Porcentaje de apps con menos de 3 ratings: 43.9 %
Porcentaje de apps entre 0 y 4 estrellas: 65.22 %
¿El código hace exactamente lo que quieres?
Pablo Guardiola
‣

No cabrees a tus usuarios

@Guardiola31337 - pguardiola.com
¿El código hace exactamente lo que quieres?
Pablo Guardiola

@Guardiola31337 - pguardiola.com
¿Podemos reducir el tiempo dedicado a testing usando tests automáticos?
Pablo Guardiola

‣

@Guardiola31337 -pguardiola.com

Testing manual = mucho tiempo
¿Podemos reducir el tiempo dedicado a testing usando tests automáticos?
Pablo Guardiola

‣

@Guardiola31337 - pguardiola.com

Testing automático
Vivimos en un mundo ágil
Pablo Guardiola
‣

@Guardiola31337 -pguardiola.com

¡Cuidado con las actualizaciones!
Testeas o k ase??
Pablo Guardiola

@Guardiola31337 -pguardiola.com
Ventajas de hacer testing
Pablo Guardiola

‣

@Guardiola31337 - pguardiola.com

Incrementa el nivel de confianza que se tiene del
código

‣

Hacer testing “obliga” a escribir código modular

‣

Se desarrolla un producto de calidad
Android testing
Pablo Guardiola
‣

@Guardiola31337 - pguardiola.com

Go, go, go!
Android testing
Pablo Guardiola

@Guardiola31337 - pguardiola.com

‣

JUnit

‣

Los métodos de android.jar devuelven Stub!
Otras opciones
Pablo Guardiola

@Guardiola31337 - pguardiola.com

‣

Android testing framework

‣

Tests deben ejecutarse en un terminal o emulador
Otras opciones
Pablo Guardiola

@Guardiola31337 - pguardiola.com

‣

Separar código Java y Android

‣

POJO’s

‣

Tests instrumentales

‣

Mocking framework

‣

¡¡¡NO HACER!!!
Otras opciones
Pablo Guardiola
‣

Entonces, ¿qué?

@Guardiola31337 - pguardiola.com
¿Por qué usar Robolectric?
Pablo Guardiola

@Guardiola31337 - pguardiola.com

‣

Es rápido

‣

Interacción con las clases de Android

‣

Incluye HTTP/API testing

‣

Permite invocar métodos privados

‣

Muy fácil de integrar con otros frameworks
Además, Robolectric te permite...
Pablo Guardiola

@Guardiola31337 - pguardiola.com

‣

Usar JUnit 4

‣

Iteraciones rápidas

‣

Permite aplicar TDD en el desarrollo

‣

Verificar la lógica y el comportamiento frente a la
implementación
¿Cómo funciona?
Pablo Guardiola
‣

@Guardiola31337 - pguardiola.com

Shadows
¿Cómo funciona?
Pablo Guardiola

@Guardiola31337 - pguardiola.com
¿Cómo funciona?
Pablo Guardiola

@Guardiola31337 - pguardiola.com
¿Cómo funciona?
Pablo Guardiola

‣

@Guardiola31337 - pguardiola.com

Robolectric actúa como un proxy
Show me the code!
Pablo Guardiola
‣

@Guardiola31337 - pguardiola.com

Se debe indicar con una anotación qué clase es la
encargada de realizar el test
@RunWith(RobolectricTestRunner.class) // <== REQUIRED
for Robolectric!
public class HomeActivityTest {
@Test public void shouldHaveAButtonThatSaysPressMe()
throws Exception {
// test code here
}
}
Show me the code!
Pablo Guardiola
‣

@Guardiola31337 - pguardiola.com

En ocasiones Robolectric está oculto...
@RunWith(RobolectricTestRunner.class)
public class HomeActivityTest {
@Test public void shouldHaveHappySmiles() throws
Exception {
String appName = new MyActivity()
.getResources().getString(R.string.app_name);
assertThat(appName, equalTo("SampleRobolectric"));
}
}

‣

¡Escondido! Pero haciendo su trabajo o/
Shadows
Pablo Guardiola
‣

@Guardiola31337 - pguardiola.com

Métodos para acceder al estado de los objetos Android
<ImageView
android:id="@+id/pivotal_logo"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:src="@drawable/pivotallabs_logo"
android:layout_marginBottom="10dip"
>
@Test
public void shouldHaveALogo() throws Exception {
ImageView pivotalLogo =
(ImageView)activity.findViewById(R.id.pivotal_logo);
ShadowImageView shadowPivotalLogo =
Robolectric.shadowOf(pivotalLogo);
assertThat(shadowPivotalLogo.resourceId,
equalTo(R.drawable.pivotallabs_logo));
}

‣

Acceso a estado y variables, de otro modo sería imposible
HTTP testing
Pablo Guardiola

@Guardiola31337 - pguardiola.com

@RunWith(RobolectricTestRunner.class)
public class HttpTest {
@Test public void
testGet_FormsCorrectRequest_noBasicAuth() throws
Exception {
Robolectric.addPendingHttpResponse(200, "OK");
new Http().get("www.codemotion.es",
            Maps.<String, String>newHashMap(),
            null,
            null);
assertThat(((HttpUriRequest)
Robolectric.getSentHttpRequest(0)).getURI(),
            equalTo(URI.create("www.codemotion.es")));
}
}
HTTP testing
Pablo Guardiola

@Guardiola31337 - pguardiola.com

Robolectric.addPendingHttpResponse(200, "OK");
‣

‣

Robolectric hace de mock server, necesita saber cómo
responder a la llamada para evitar RuntimeException
Respuesta por defecto compartida
@RunWith(RobolectricTestRunner.class)
public class HttpTest {
@Before public void setup() {
Robolectric.addPendingHttpResponse(200, "OK");
}
...
}
HTTP testing
Pablo Guardiola
‣

@Guardiola31337 - pguardiola.com

Otros ejemplos
@Test public void shouldReturnCorrectResponse() throws
Exception {
Robolectric
.addPendingHttpResponse(666, "it's all cool");
Http.Response response = http.get("www.example.com",
new HashMap<String, String>(), null, null);
    assertThat(fromStream(response.getResponseBody()),
equalTo("it's all cool"));
    assertThat(response.getStatusCode(), equalTo(666));
}
}

‣

Métodos correctos, cabeceras...
Extendiendo Robolectric
Pablo Guardiola

‣
‣

@Guardiola31337 - pguardiola.com

Robolectric no tiene funcionalidad para todo
Robolectric permite extender las clases Shadow
@Implements
@Implementation
Robolectric.getDefaultShadowClasses()
__constructo__
@RealObject
Inconvenientes
Pablo Guardiola
‣
‣
‣

@Guardiola31337 - pguardiola.com

No hay clases Shadow para todo
No todo se comporta del mismo modo que en la DVM
Android no es Java
¿Por qué no usar directamente el código Android?
Pablo Guardiola

‣
‣
‣

@Guardiola31337 - pguardiola.com

Difícil conseguir los .jar reales
Difícil trabajar con código nativo
Difícil dejar de usar las clases Shadow
Robolectric 2.0
Pablo Guardiola

2.0

@Guardiola31337 - pguardiola.com
Robolectric 2.0
Pablo Guardiola

@Guardiola31337 - pguardiola.com

‣

Uso del SDK de Android

‣

No más excepciones Stub!

‣

Objetivo eliminar el 99% de las clases Shadow
Robolectric 2.0
Pablo Guardiola

‣

‣

‣

@Guardiola31337 - pguardiola.com

El paquete de soporte no usa clases Shadow
Fragments, action bar, loaders usan su implementación
real
Tests tendrán mismo comportamiento que en los
dispositivos
Robolectric 2.0
Pablo Guardiola

@Guardiola31337 - pguardiola.com

‣

Se pueden testear estilos y temas

‣

Acceso a los recursos del sistema

‣

Soporte ActionBarSherlock

‣

Mejoras de rendimiento y corrección de bugs
Robolectric 2.0
Pablo Guardiola
‣

@Guardiola31337 - pguardiola.com

Testing bajo diferentes configuraciones del dispositivo

@Test @Config("en")
public void shouldGiveEnglishResponses() throws Exception {
assertThat(activity.findViewById(R.id.message))
.hasText("Hello!");
}
}
@Test @Config("fr")
public void shouldGiveFrenchResponses throws Exception {
assertThat(activity.findViewById(R.id.message))
.hasText("Bonjour!");
}
}
Robolectric 2.0
Pablo Guardiola
‣

@Guardiola31337 - pguardiola.com

ActivityController mayor control sobre el ciclo de vida

FooActivity foo = Robolectric.buildActivity(FooActivity.class)
        .create().start().resume().get();
ActivityController<FooActivity> fooController =
Robolectric.buildActivity(FooActivity.class).create();
FooActivity foo = fooController.get();
// Ensure the user was injected.
assertThat(foo.user).isNotNull();
// Log the user out.
foo.user.expireSession();
fooController.start().resume();
// Ensure the activity is now finishing.
assertThat(foo).isFinishing();
Robolectric 2.0
Pablo Guardiola

‣

‣

‣
‣
‣

@Guardiola31337 - pguardiola.com

El uso del SDK de Android está aumentando
considerablemente
Todo el mundo puede contribuir:
https://github.com/robolectric/robolectric
http://robolectric.org/
http://robolectric.blogspot.com.es/
Demo
Pablo Guardiola

@Guardiola31337 - pguardiola.com

Project name: SampleRobolectric
Package name: com.pguardiola.samplerobolectric
Activity name: MyActivity
Add Framework Support -> Maven
Demo
Pablo Guardiola

<groupId>com.pguardiola.samplerobolectric</groupId>
<artifactId>SampleRobolectric</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>apk</packaging>
<name>My Sample App</name>
<dependencies>
<dependency>
<groupId>com.google.android</groupId>
<artifactId>android</artifactId>
<version>4.1.1.4</version>
<scope>provided</scope>
</dependency>
<!-- Make sure this is below the android dependencies -->
<dependency>
<groupId>org.robolectric</groupId>
<artifactId>robolectric</artifactId>
<version>2.1.1</version>
<scope>test</scope>
</dependency>

@Guardiola31337 - pguardiola.com
Demo
Pablo Guardiola

@Guardiola31337 - pguardiola.com

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>com.jayway.maven.plugins.android.generation2</groupId>
<artifactId>android-maven-plugin</artifactId>
<version>3.6.1</version>
<configuration>
<sdk>
<!-- platform or api level (api level 16 = platform 4.1)-->
<platform>18</platform>
</sdk>
<undeployBeforeDeploy>true</undeployBeforeDeploy>
</configuration>
<extensions>true</extensions>
</plugin>
</plugins>
</build>
Demo
Pablo Guardiola
‣

@Guardiola31337 - pguardiola.com

Alt+Enter -> Create Test -> JUnit4
@RunWith(RobolectricTestRunner.class)
public class MyActivityTest {
@Test public void shouldHaveHappySmiles() throws
Exception {
String appName = new MyActivity().getResources()
.getString(R.string.app_name);
assertThat(appName, equalTo("SampleRobolectric"));
}
}
Demo
Pablo Guardiola

@Guardiola31337 - pguardiola.com

Imports

‣

import
import
import
import

org.junit.Test;
org.junit.runner.RunWith;
org.robolectric.RobolectricTestRunner;
static org.hamcrest.CoreMatchers.equalTo;

import static org.junit.Assert.assertThat;
Demo
Pablo Guardiola

Run -> MyActivityTest
MyActivityTest fails
SampleRobolectric pass

@Guardiola31337 - pguardiola.com
¿Preguntas?
Pablo Guardiola

@Guardiola31337 - pguardiola.com
Gracias
Pablo Guardiola

@Guardiola31337 - pguardiola.com

Happy testing!!
Pablo Guardiola
@Guardiola31337

Más contenido relacionado

La actualidad más candente

Charla TestingUy 2019: Compartiendo el Sombrero del Testing
Charla TestingUy 2019: Compartiendo el Sombrero del TestingCharla TestingUy 2019: Compartiendo el Sombrero del Testing
Charla TestingUy 2019: Compartiendo el Sombrero del TestingClaudia Badell
 
Webinar QALovers: Lecciones aprendidas al incorporar las pruebas como parte d...
Webinar QALovers: Lecciones aprendidas al incorporar las pruebas como parte d...Webinar QALovers: Lecciones aprendidas al incorporar las pruebas como parte d...
Webinar QALovers: Lecciones aprendidas al incorporar las pruebas como parte d...Claudia Badell
 
Webinar TestingPY: Lecciones aprendidas al incorporar las pruebas como parte ...
Webinar TestingPY: Lecciones aprendidas al incorporar las pruebas como parte ...Webinar TestingPY: Lecciones aprendidas al incorporar las pruebas como parte ...
Webinar TestingPY: Lecciones aprendidas al incorporar las pruebas como parte ...Claudia Badell
 
Charla TestingUy 2018: Mind maps para Potenciar las Pruebas Exploratorias
Charla TestingUy 2018: Mind maps para Potenciar las Pruebas ExploratoriasCharla TestingUy 2018: Mind maps para Potenciar las Pruebas Exploratorias
Charla TestingUy 2018: Mind maps para Potenciar las Pruebas ExploratoriasClaudia Badell
 
Alta automatización de pruebas de calidad de software, cambio de paradigmas
Alta automatización de pruebas de calidad de software, cambio de paradigmasAlta automatización de pruebas de calidad de software, cambio de paradigmas
Alta automatización de pruebas de calidad de software, cambio de paradigmasSoftware Guru
 
Webinar plataforma QAMinds: Testing Exploratorio y Mind maps
Webinar plataforma QAMinds: Testing Exploratorio y Mind mapsWebinar plataforma QAMinds: Testing Exploratorio y Mind maps
Webinar plataforma QAMinds: Testing Exploratorio y Mind mapsClaudia Badell
 
Meetup Agile Testing Chile: Testing Exploratorio y Mind maps
Meetup Agile Testing Chile: Testing Exploratorio y Mind mapsMeetup Agile Testing Chile: Testing Exploratorio y Mind maps
Meetup Agile Testing Chile: Testing Exploratorio y Mind mapsClaudia Badell
 
Introducción a automatización de pruebas web
Introducción a automatización de pruebas webIntroducción a automatización de pruebas web
Introducción a automatización de pruebas webFrancisco Moreno Sanz
 
Webinar plataforma Northem Quality: Testing Exploratorio y Mind maps
Webinar plataforma Northem Quality: Testing Exploratorio y Mind mapsWebinar plataforma Northem Quality: Testing Exploratorio y Mind maps
Webinar plataforma Northem Quality: Testing Exploratorio y Mind mapsClaudia Badell
 
Webinar plataforma TestingCR: Testing Exploratorio y Mind maps
Webinar plataforma TestingCR: Testing Exploratorio y Mind mapsWebinar plataforma TestingCR: Testing Exploratorio y Mind maps
Webinar plataforma TestingCR: Testing Exploratorio y Mind mapsClaudia Badell
 
Javier Verdugo. Implantando un Laboratorio de Calidad con Métodos Ágiles
Javier Verdugo. Implantando un Laboratorio de Calidad con Métodos ÁgilesJavier Verdugo. Implantando un Laboratorio de Calidad con Métodos Ágiles
Javier Verdugo. Implantando un Laboratorio de Calidad con Métodos Ágiles233 Grados de TI
 
Webinar plataforma ISQI: Testing Exploratorio y Mind maps
Webinar plataforma ISQI: Testing Exploratorio y Mind mapsWebinar plataforma ISQI: Testing Exploratorio y Mind maps
Webinar plataforma ISQI: Testing Exploratorio y Mind mapsClaudia Badell
 
Automatización de pruebas funcionales
Automatización de pruebas funcionalesAutomatización de pruebas funcionales
Automatización de pruebas funcionalesVicenç García-Altés
 
Mujeres que brillan - Animarse a recorrer - Claudia Badell
Mujeres que brillan - Animarse a recorrer - Claudia BadellMujeres que brillan - Animarse a recorrer - Claudia Badell
Mujeres que brillan - Animarse a recorrer - Claudia BadellClaudia Badell
 

La actualidad más candente (15)

Charla TestingUy 2019: Compartiendo el Sombrero del Testing
Charla TestingUy 2019: Compartiendo el Sombrero del TestingCharla TestingUy 2019: Compartiendo el Sombrero del Testing
Charla TestingUy 2019: Compartiendo el Sombrero del Testing
 
Webinar QALovers: Lecciones aprendidas al incorporar las pruebas como parte d...
Webinar QALovers: Lecciones aprendidas al incorporar las pruebas como parte d...Webinar QALovers: Lecciones aprendidas al incorporar las pruebas como parte d...
Webinar QALovers: Lecciones aprendidas al incorporar las pruebas como parte d...
 
Webinar TestingPY: Lecciones aprendidas al incorporar las pruebas como parte ...
Webinar TestingPY: Lecciones aprendidas al incorporar las pruebas como parte ...Webinar TestingPY: Lecciones aprendidas al incorporar las pruebas como parte ...
Webinar TestingPY: Lecciones aprendidas al incorporar las pruebas como parte ...
 
Charla TestingUy 2018: Mind maps para Potenciar las Pruebas Exploratorias
Charla TestingUy 2018: Mind maps para Potenciar las Pruebas ExploratoriasCharla TestingUy 2018: Mind maps para Potenciar las Pruebas Exploratorias
Charla TestingUy 2018: Mind maps para Potenciar las Pruebas Exploratorias
 
Alta automatización de pruebas de calidad de software, cambio de paradigmas
Alta automatización de pruebas de calidad de software, cambio de paradigmasAlta automatización de pruebas de calidad de software, cambio de paradigmas
Alta automatización de pruebas de calidad de software, cambio de paradigmas
 
Webinar plataforma QAMinds: Testing Exploratorio y Mind maps
Webinar plataforma QAMinds: Testing Exploratorio y Mind mapsWebinar plataforma QAMinds: Testing Exploratorio y Mind maps
Webinar plataforma QAMinds: Testing Exploratorio y Mind maps
 
Meetup Agile Testing Chile: Testing Exploratorio y Mind maps
Meetup Agile Testing Chile: Testing Exploratorio y Mind mapsMeetup Agile Testing Chile: Testing Exploratorio y Mind maps
Meetup Agile Testing Chile: Testing Exploratorio y Mind maps
 
Introducción a automatización de pruebas web
Introducción a automatización de pruebas webIntroducción a automatización de pruebas web
Introducción a automatización de pruebas web
 
Webinar plataforma Northem Quality: Testing Exploratorio y Mind maps
Webinar plataforma Northem Quality: Testing Exploratorio y Mind mapsWebinar plataforma Northem Quality: Testing Exploratorio y Mind maps
Webinar plataforma Northem Quality: Testing Exploratorio y Mind maps
 
Webinar plataforma TestingCR: Testing Exploratorio y Mind maps
Webinar plataforma TestingCR: Testing Exploratorio y Mind mapsWebinar plataforma TestingCR: Testing Exploratorio y Mind maps
Webinar plataforma TestingCR: Testing Exploratorio y Mind maps
 
Javier Verdugo. Implantando un Laboratorio de Calidad con Métodos Ágiles
Javier Verdugo. Implantando un Laboratorio de Calidad con Métodos ÁgilesJavier Verdugo. Implantando un Laboratorio de Calidad con Métodos Ágiles
Javier Verdugo. Implantando un Laboratorio de Calidad con Métodos Ágiles
 
Calidad en Agile - EducacionIT
Calidad en Agile - EducacionITCalidad en Agile - EducacionIT
Calidad en Agile - EducacionIT
 
Webinar plataforma ISQI: Testing Exploratorio y Mind maps
Webinar plataforma ISQI: Testing Exploratorio y Mind mapsWebinar plataforma ISQI: Testing Exploratorio y Mind maps
Webinar plataforma ISQI: Testing Exploratorio y Mind maps
 
Automatización de pruebas funcionales
Automatización de pruebas funcionalesAutomatización de pruebas funcionales
Automatización de pruebas funcionales
 
Mujeres que brillan - Animarse a recorrer - Claudia Badell
Mujeres que brillan - Animarse a recorrer - Claudia BadellMujeres que brillan - Animarse a recorrer - Claudia Badell
Mujeres que brillan - Animarse a recorrer - Claudia Badell
 

Similar a Testeas o k ase??

Build and test all, lo nuevo de GXtest para Desarrolladores
Build and test all, lo nuevo de GXtest para DesarrolladoresBuild and test all, lo nuevo de GXtest para Desarrolladores
Build and test all, lo nuevo de GXtest para DesarrolladoresAbstracta
 
Importancia del testing en los proyectos
Importancia del testing en los proyectosImportancia del testing en los proyectos
Importancia del testing en los proyectosSoftware Guru
 
Build and test all
Build and test allBuild and test all
Build and test allGeneXus
 
Rooted2020 compliance as-code_-_guillermo_obispo_-_jose_mariaperez_-_
Rooted2020 compliance as-code_-_guillermo_obispo_-_jose_mariaperez_-_Rooted2020 compliance as-code_-_guillermo_obispo_-_jose_mariaperez_-_
Rooted2020 compliance as-code_-_guillermo_obispo_-_jose_mariaperez_-_RootedCON
 
Android Studio y gradle. DroidconES 2014
Android Studio y gradle. DroidconES 2014Android Studio y gradle. DroidconES 2014
Android Studio y gradle. DroidconES 2014Kamil Zabdyr
 
Solución de problemas Google Play
Solución de problemas Google PlaySolución de problemas Google Play
Solución de problemas Google PlayGDG Lima
 
Buenas practicas desarrollando software
Buenas practicas desarrollando softwareBuenas practicas desarrollando software
Buenas practicas desarrollando softwareGabriel Moral
 
Del free style al mvp
Del free style al mvpDel free style al mvp
Del free style al mvpJuanjo Marti
 
Búsqueda de vulnerabilidades en aplicaciones de Android [GuadalajaraCON 2013]
Búsqueda de vulnerabilidades en aplicaciones de Android [GuadalajaraCON 2013]Búsqueda de vulnerabilidades en aplicaciones de Android [GuadalajaraCON 2013]
Búsqueda de vulnerabilidades en aplicaciones de Android [GuadalajaraCON 2013]Websec México, S.C.
 
Google apps script
Google apps scriptGoogle apps script
Google apps scriptGDG Lima
 
15 Upm Solo Pruebas 2009
15 Upm Solo Pruebas 200915 Upm Solo Pruebas 2009
15 Upm Solo Pruebas 2009Pepe
 
Control de calidad de software
Control de calidad de softwareControl de calidad de software
Control de calidad de softwareCristian Sánchez
 
Taller google Apps Script
Taller google Apps ScriptTaller google Apps Script
Taller google Apps ScriptGDG Lima
 
WorkWithPlus: Novedades y el testimonio de un referente de la comunidad a niv...
WorkWithPlus: Novedades y el testimonio de un referente de la comunidad a niv...WorkWithPlus: Novedades y el testimonio de un referente de la comunidad a niv...
WorkWithPlus: Novedades y el testimonio de un referente de la comunidad a niv...GeneXus
 

Similar a Testeas o k ase?? (20)

Build and test all, lo nuevo de GXtest para Desarrolladores
Build and test all, lo nuevo de GXtest para DesarrolladoresBuild and test all, lo nuevo de GXtest para Desarrolladores
Build and test all, lo nuevo de GXtest para Desarrolladores
 
Importancia del testing en los proyectos
Importancia del testing en los proyectosImportancia del testing en los proyectos
Importancia del testing en los proyectos
 
Build and test all
Build and test allBuild and test all
Build and test all
 
Symfony parte 16
Symfony parte 16Symfony parte 16
Symfony parte 16
 
Rooted2020 compliance as-code_-_guillermo_obispo_-_jose_mariaperez_-_
Rooted2020 compliance as-code_-_guillermo_obispo_-_jose_mariaperez_-_Rooted2020 compliance as-code_-_guillermo_obispo_-_jose_mariaperez_-_
Rooted2020 compliance as-code_-_guillermo_obispo_-_jose_mariaperez_-_
 
BDD y tests automatizados
BDD y tests automatizadosBDD y tests automatizados
BDD y tests automatizados
 
Android Studio y gradle. DroidconES 2014
Android Studio y gradle. DroidconES 2014Android Studio y gradle. DroidconES 2014
Android Studio y gradle. DroidconES 2014
 
Solución de problemas Google Play
Solución de problemas Google PlaySolución de problemas Google Play
Solución de problemas Google Play
 
Testing, tipos y otros flamewars
Testing, tipos y otros flamewarsTesting, tipos y otros flamewars
Testing, tipos y otros flamewars
 
BDD & Cucumber
BDD & CucumberBDD & Cucumber
BDD & Cucumber
 
Buenas practicas desarrollando software
Buenas practicas desarrollando softwareBuenas practicas desarrollando software
Buenas practicas desarrollando software
 
Del free style al mvp
Del free style al mvpDel free style al mvp
Del free style al mvp
 
Búsqueda de vulnerabilidades en aplicaciones de Android [GuadalajaraCON 2013]
Búsqueda de vulnerabilidades en aplicaciones de Android [GuadalajaraCON 2013]Búsqueda de vulnerabilidades en aplicaciones de Android [GuadalajaraCON 2013]
Búsqueda de vulnerabilidades en aplicaciones de Android [GuadalajaraCON 2013]
 
Google apps script
Google apps scriptGoogle apps script
Google apps script
 
15 Upm Solo Pruebas 2009
15 Upm Solo Pruebas 200915 Upm Solo Pruebas 2009
15 Upm Solo Pruebas 2009
 
Control de calidad de software
Control de calidad de softwareControl de calidad de software
Control de calidad de software
 
Taller google Apps Script
Taller google Apps ScriptTaller google Apps Script
Taller google Apps Script
 
Test unitarios
Test unitariosTest unitarios
Test unitarios
 
Symfony parte 17
Symfony parte 17Symfony parte 17
Symfony parte 17
 
WorkWithPlus: Novedades y el testimonio de un referente de la comunidad a niv...
WorkWithPlus: Novedades y el testimonio de un referente de la comunidad a niv...WorkWithPlus: Novedades y el testimonio de un referente de la comunidad a niv...
WorkWithPlus: Novedades y el testimonio de un referente de la comunidad a niv...
 

Testeas o k ase??

  • 1. Pablo Guardiola Testeas o k ase?? @Guardiola31337 - pguardiola.com
  • 2. Agenda Pablo Guardiola @Guardiola31337 - pguardiola.com ‣ Importancia del testing sobre dispositivos móviles ‣ Robolectric ‣ Demo
  • 3. Numerosas apps en los markets = Competencia brutal Pablo Guardiola ‣ ‣ @Guardiola31337 - pguardiola.com Número de apps Android en el market: 866033 Porcentaje de apps de baja calidad: 23 %
  • 4. Numerosas apps en los markets = Competencia brutal Pablo Guardiola ‣ ‣ @Guardiola31337 - pguardiola.com Porcentaje de apps con menos de 3 ratings: 43.9 % Porcentaje de apps entre 0 y 4 estrellas: 65.22 %
  • 5. ¿El código hace exactamente lo que quieres? Pablo Guardiola ‣ No cabrees a tus usuarios @Guardiola31337 - pguardiola.com
  • 6. ¿El código hace exactamente lo que quieres? Pablo Guardiola @Guardiola31337 - pguardiola.com
  • 7. ¿Podemos reducir el tiempo dedicado a testing usando tests automáticos? Pablo Guardiola ‣ @Guardiola31337 -pguardiola.com Testing manual = mucho tiempo
  • 8. ¿Podemos reducir el tiempo dedicado a testing usando tests automáticos? Pablo Guardiola ‣ @Guardiola31337 - pguardiola.com Testing automático
  • 9. Vivimos en un mundo ágil Pablo Guardiola ‣ @Guardiola31337 -pguardiola.com ¡Cuidado con las actualizaciones!
  • 10. Testeas o k ase?? Pablo Guardiola @Guardiola31337 -pguardiola.com
  • 11. Ventajas de hacer testing Pablo Guardiola ‣ @Guardiola31337 - pguardiola.com Incrementa el nivel de confianza que se tiene del código ‣ Hacer testing “obliga” a escribir código modular ‣ Se desarrolla un producto de calidad
  • 13. Android testing Pablo Guardiola @Guardiola31337 - pguardiola.com ‣ JUnit ‣ Los métodos de android.jar devuelven Stub!
  • 14. Otras opciones Pablo Guardiola @Guardiola31337 - pguardiola.com ‣ Android testing framework ‣ Tests deben ejecutarse en un terminal o emulador
  • 15. Otras opciones Pablo Guardiola @Guardiola31337 - pguardiola.com ‣ Separar código Java y Android ‣ POJO’s ‣ Tests instrumentales ‣ Mocking framework ‣ ¡¡¡NO HACER!!!
  • 16. Otras opciones Pablo Guardiola ‣ Entonces, ¿qué? @Guardiola31337 - pguardiola.com
  • 17. ¿Por qué usar Robolectric? Pablo Guardiola @Guardiola31337 - pguardiola.com ‣ Es rápido ‣ Interacción con las clases de Android ‣ Incluye HTTP/API testing ‣ Permite invocar métodos privados ‣ Muy fácil de integrar con otros frameworks
  • 18. Además, Robolectric te permite... Pablo Guardiola @Guardiola31337 - pguardiola.com ‣ Usar JUnit 4 ‣ Iteraciones rápidas ‣ Permite aplicar TDD en el desarrollo ‣ Verificar la lógica y el comportamiento frente a la implementación
  • 22. ¿Cómo funciona? Pablo Guardiola ‣ @Guardiola31337 - pguardiola.com Robolectric actúa como un proxy
  • 23. Show me the code! Pablo Guardiola ‣ @Guardiola31337 - pguardiola.com Se debe indicar con una anotación qué clase es la encargada de realizar el test @RunWith(RobolectricTestRunner.class) // <== REQUIRED for Robolectric! public class HomeActivityTest { @Test public void shouldHaveAButtonThatSaysPressMe() throws Exception { // test code here } }
  • 24. Show me the code! Pablo Guardiola ‣ @Guardiola31337 - pguardiola.com En ocasiones Robolectric está oculto... @RunWith(RobolectricTestRunner.class) public class HomeActivityTest { @Test public void shouldHaveHappySmiles() throws Exception { String appName = new MyActivity() .getResources().getString(R.string.app_name); assertThat(appName, equalTo("SampleRobolectric")); } } ‣ ¡Escondido! Pero haciendo su trabajo o/
  • 25. Shadows Pablo Guardiola ‣ @Guardiola31337 - pguardiola.com Métodos para acceder al estado de los objetos Android <ImageView android:id="@+id/pivotal_logo" android:layout_width="fill_parent" android:layout_height="wrap_content" android:src="@drawable/pivotallabs_logo" android:layout_marginBottom="10dip" > @Test public void shouldHaveALogo() throws Exception { ImageView pivotalLogo = (ImageView)activity.findViewById(R.id.pivotal_logo); ShadowImageView shadowPivotalLogo = Robolectric.shadowOf(pivotalLogo); assertThat(shadowPivotalLogo.resourceId, equalTo(R.drawable.pivotallabs_logo)); } ‣ Acceso a estado y variables, de otro modo sería imposible
  • 26. HTTP testing Pablo Guardiola @Guardiola31337 - pguardiola.com @RunWith(RobolectricTestRunner.class) public class HttpTest { @Test public void testGet_FormsCorrectRequest_noBasicAuth() throws Exception { Robolectric.addPendingHttpResponse(200, "OK"); new Http().get("www.codemotion.es",             Maps.<String, String>newHashMap(),             null,             null); assertThat(((HttpUriRequest) Robolectric.getSentHttpRequest(0)).getURI(),             equalTo(URI.create("www.codemotion.es"))); } }
  • 27. HTTP testing Pablo Guardiola @Guardiola31337 - pguardiola.com Robolectric.addPendingHttpResponse(200, "OK"); ‣ ‣ Robolectric hace de mock server, necesita saber cómo responder a la llamada para evitar RuntimeException Respuesta por defecto compartida @RunWith(RobolectricTestRunner.class) public class HttpTest { @Before public void setup() { Robolectric.addPendingHttpResponse(200, "OK"); } ... }
  • 28. HTTP testing Pablo Guardiola ‣ @Guardiola31337 - pguardiola.com Otros ejemplos @Test public void shouldReturnCorrectResponse() throws Exception { Robolectric .addPendingHttpResponse(666, "it's all cool"); Http.Response response = http.get("www.example.com", new HashMap<String, String>(), null, null);     assertThat(fromStream(response.getResponseBody()), equalTo("it's all cool"));     assertThat(response.getStatusCode(), equalTo(666)); } } ‣ Métodos correctos, cabeceras...
  • 29. Extendiendo Robolectric Pablo Guardiola ‣ ‣ @Guardiola31337 - pguardiola.com Robolectric no tiene funcionalidad para todo Robolectric permite extender las clases Shadow @Implements @Implementation Robolectric.getDefaultShadowClasses() __constructo__ @RealObject
  • 30. Inconvenientes Pablo Guardiola ‣ ‣ ‣ @Guardiola31337 - pguardiola.com No hay clases Shadow para todo No todo se comporta del mismo modo que en la DVM Android no es Java
  • 31. ¿Por qué no usar directamente el código Android? Pablo Guardiola ‣ ‣ ‣ @Guardiola31337 - pguardiola.com Difícil conseguir los .jar reales Difícil trabajar con código nativo Difícil dejar de usar las clases Shadow
  • 33. Robolectric 2.0 Pablo Guardiola @Guardiola31337 - pguardiola.com ‣ Uso del SDK de Android ‣ No más excepciones Stub! ‣ Objetivo eliminar el 99% de las clases Shadow
  • 34. Robolectric 2.0 Pablo Guardiola ‣ ‣ ‣ @Guardiola31337 - pguardiola.com El paquete de soporte no usa clases Shadow Fragments, action bar, loaders usan su implementación real Tests tendrán mismo comportamiento que en los dispositivos
  • 35. Robolectric 2.0 Pablo Guardiola @Guardiola31337 - pguardiola.com ‣ Se pueden testear estilos y temas ‣ Acceso a los recursos del sistema ‣ Soporte ActionBarSherlock ‣ Mejoras de rendimiento y corrección de bugs
  • 36. Robolectric 2.0 Pablo Guardiola ‣ @Guardiola31337 - pguardiola.com Testing bajo diferentes configuraciones del dispositivo @Test @Config("en") public void shouldGiveEnglishResponses() throws Exception { assertThat(activity.findViewById(R.id.message)) .hasText("Hello!"); } } @Test @Config("fr") public void shouldGiveFrenchResponses throws Exception { assertThat(activity.findViewById(R.id.message)) .hasText("Bonjour!"); } }
  • 37. Robolectric 2.0 Pablo Guardiola ‣ @Guardiola31337 - pguardiola.com ActivityController mayor control sobre el ciclo de vida FooActivity foo = Robolectric.buildActivity(FooActivity.class)         .create().start().resume().get(); ActivityController<FooActivity> fooController = Robolectric.buildActivity(FooActivity.class).create(); FooActivity foo = fooController.get(); // Ensure the user was injected. assertThat(foo.user).isNotNull(); // Log the user out. foo.user.expireSession(); fooController.start().resume(); // Ensure the activity is now finishing. assertThat(foo).isFinishing();
  • 38. Robolectric 2.0 Pablo Guardiola ‣ ‣ ‣ ‣ ‣ @Guardiola31337 - pguardiola.com El uso del SDK de Android está aumentando considerablemente Todo el mundo puede contribuir: https://github.com/robolectric/robolectric http://robolectric.org/ http://robolectric.blogspot.com.es/
  • 39. Demo Pablo Guardiola @Guardiola31337 - pguardiola.com Project name: SampleRobolectric Package name: com.pguardiola.samplerobolectric Activity name: MyActivity Add Framework Support -> Maven
  • 40. Demo Pablo Guardiola <groupId>com.pguardiola.samplerobolectric</groupId> <artifactId>SampleRobolectric</artifactId> <version>1.0-SNAPSHOT</version> <packaging>apk</packaging> <name>My Sample App</name> <dependencies> <dependency> <groupId>com.google.android</groupId> <artifactId>android</artifactId> <version>4.1.1.4</version> <scope>provided</scope> </dependency> <!-- Make sure this is below the android dependencies --> <dependency> <groupId>org.robolectric</groupId> <artifactId>robolectric</artifactId> <version>2.1.1</version> <scope>test</scope> </dependency> @Guardiola31337 - pguardiola.com
  • 41. Demo Pablo Guardiola @Guardiola31337 - pguardiola.com <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> </dependencies> <build> <finalName>${project.artifactId}</finalName> <plugins> <plugin> <groupId>com.jayway.maven.plugins.android.generation2</groupId> <artifactId>android-maven-plugin</artifactId> <version>3.6.1</version> <configuration> <sdk> <!-- platform or api level (api level 16 = platform 4.1)--> <platform>18</platform> </sdk> <undeployBeforeDeploy>true</undeployBeforeDeploy> </configuration> <extensions>true</extensions> </plugin> </plugins> </build>
  • 42. Demo Pablo Guardiola ‣ @Guardiola31337 - pguardiola.com Alt+Enter -> Create Test -> JUnit4 @RunWith(RobolectricTestRunner.class) public class MyActivityTest { @Test public void shouldHaveHappySmiles() throws Exception { String appName = new MyActivity().getResources() .getString(R.string.app_name); assertThat(appName, equalTo("SampleRobolectric")); } }
  • 43. Demo Pablo Guardiola @Guardiola31337 - pguardiola.com Imports ‣ import import import import org.junit.Test; org.junit.runner.RunWith; org.robolectric.RobolectricTestRunner; static org.hamcrest.CoreMatchers.equalTo; import static org.junit.Assert.assertThat;
  • 44. Demo Pablo Guardiola Run -> MyActivityTest MyActivityTest fails SampleRobolectric pass @Guardiola31337 - pguardiola.com
  • 46. Gracias Pablo Guardiola @Guardiola31337 - pguardiola.com Happy testing!! Pablo Guardiola @Guardiola31337