PAUG - Intégration Continue - Décembre 2013

Aurélien Guillard
Aurélien GuillardAndroid Lead Developper à Karos
Intégration continue
HockeyApp - Robotium - Jenkins

Aurélien Guillard - @a_guillard
HockeyApp
Beta distribution et Crash report
HockeyApp - Beta distribution
● APKs hébergés chez
HockeyApp
● Alerte des beta testeurs
○ par mail
○ dans l’application

● Historique des versions
○ application Android
○ page web
HockeyApp - Crash report
●
●
●
●
●

Basé sur le volontariat des utilisateurs
Remontée des crashs en temps réel
Regroupement des crashs similaires
Fonctionne avec Proguard
Rapport quotidien par mail
HockeyApp - Statistiques
HockeyApp - Intégration
@Override

● Intégration simple
○ Un JAR à copier
○ 2 méthodes à
appeler

public void onCreate(Bundle savedInstanceState) {
checkForUpdates();
}
@Override
public void onResume() {
super.onResume();
checkForCrashes();
}
private void checkForCrashes() {
CrashManager.register(this, APP_ID);
}
private void checkForUpdates() {
UpdateManager.register(this, APP_ID);
}
HockeyApp - Combien ça coûte ?
Robotium
Implémentation de tests automatiques
Robotium ?
● Extension du framework d’instrumentation Android

Objectif :
Simplifier le
développement
des tests
Robotium - Exemple
@Override
public void setUp() throws Exception {
solo = new Solo(getInstrumentation(), getActivity());
}
@Override
public void tearDown() throws Exception {
solo.finishOpenedActivities();
}
public void testLogin() {
ScreenshotsUtils.takeScreenshot(solo, getActivity());
solo.enterText((EditText)solo.getView(R.id.mail_editText), "xxxxxxx.xxxxxx@xxxxx.com");
solo.enterText((EditText)solo.getView(R.id.password_editText), "xxxxxxxxxxx");
solo.clickOnView(solo.getView(R.id.connect_button));
assertTrue(solo.waitForActivity(HomeActivity.class));
}
Robotium - Test report
Jenkins
Serveur d’intégration continue
Jenkins
3 jobs
Jenkins - Job ‘viadeo android’
● Vérification toutes les 15 minutes si une
modification a eu lieu sur le repository GIT
● Si oui, update du code
● Compilation
● Envoi d’un mail en cas d’erreur
Jenkins - Job ‘push to HockeyApp’
●
●
●
●

Exécution à la main
Update du code
Compilation
Envoi de l’APK sur HockeyApp
○

plugin : https://wiki.jenkins-ci.org/display/JENKINS/Hockeyapp+Plugin
Jenkins - Job ‘viadeo android test’
● Vérification toutes les 15 minutes si une
modification a eu lieu sur le repository GIT
● Si oui, update du code
● Compilation
● Démarrage d’un émulateur
○

plugin : https://wiki.jenkins-ci.org/display/JENKINS/Android+Emulator+Plugin

● Installation de l’application dans l’émulateur
● Installation de l’application de test dans l’émulateur
● Exécution des tests
Jenkins - Récupération d’un rapport
● Utilisation d’un TestRunner alternatif
○ android junit report
manifest.xml
<instrumentation
android:name="com.zutubi.android.junitreport.JUnitReportTestRunner"
android:targetPackage="com.viadeo.android" />
ant.properties
test.runner=com.zutubi.android.junitreport.JUnitReportTestRunner

Plus d’info : http://zutubi.com/source/projects/android-junit-report/
Jenkins - Récupération d’un rapport
build.xml

● Création d’une
nouvelle target
Ant
● Copie du
rapport en
XML dans le
projet

<target name="fetch-test-report" >
<xpath
expression="/manifest/@package"
input="${tested.project.dir}/AndroidManifest.xml"
output="tested.manifest.package" />
<echo>Downloading XML test report...</echo>
<mkdir dir="junitreports" />
<exec
executable="${adb}"
failonerror="true" >
<arg line="${adb.device.arg}" />
<arg value="pull" />
<arg value="/data/data/${tested.manifest.package}/files/junit-report.xml" />
<arg value="junitreports/junit-report.xml" />
</exec>
</target>
Jenkins - Récupération d’un rapport
● Création d’une
nouvelle target Ant
● Copie du dossier de
screenshots robotium
dans le projet

build.xml
<target name="fetch-test-screenshots" >
<echo>Downloading test screenshots...</echo>
<mkdir dir="Robotium-Screenshots" />
<exec
executable="${adb}"
failonerror="true" >
<arg line="${adb.device.arg}" />
<arg value="pull" />
<arg value="/sdcard/Robotium-Screenshots" />
<arg value="Robotium-Screenshots" />
</exec>
</target>
Jenkins - Résultats des tests
Next Steps
● Ecrire plus de scénarios de tests
● Exécuter les tests sur Genymotion ?
● Passer de Ant à Gradle ?
1 sur 21

Recommandé

Chaine de production pipeline par
Chaine de production   pipelineChaine de production   pipeline
Chaine de production pipelineNicolas wallerand
804 vues31 diapositives
Gitlab CI : Integration et Déploiement Continue par
Gitlab CI : Integration et Déploiement ContinueGitlab CI : Integration et Déploiement Continue
Gitlab CI : Integration et Déploiement ContinueVincent Composieux
4.2K vues30 diapositives
Meetup PM2 @delicious-insights par
Meetup PM2 @delicious-insightsMeetup PM2 @delicious-insights
Meetup PM2 @delicious-insightsAlexandre Strzelewicz
486 vues47 diapositives
Du Docker dans notre workflow de dev par
Du Docker dans notre workflow de devDu Docker dans notre workflow de dev
Du Docker dans notre workflow de devKodo Kojo
193 vues31 diapositives
Introduction à SBT par
Introduction à SBTIntroduction à SBT
Introduction à SBTJean Detoeuf
81 vues25 diapositives
Bootcamp d'Initiation à Android - 2013/11/30 - Live coding : Hello world! par
Bootcamp d'Initiation à Android  - 2013/11/30 - Live coding :   Hello world!Bootcamp d'Initiation à Android  - 2013/11/30 - Live coding :   Hello world!
Bootcamp d'Initiation à Android - 2013/11/30 - Live coding : Hello world!Horacio Gonzalez
12.6K vues17 diapositives

Contenu connexe

En vedette

Concept de l’Intégration Continue par
Concept de l’Intégration ContinueConcept de l’Intégration Continue
Concept de l’Intégration ContinueFrédéric Sagez
2.4K vues17 diapositives
Intégration continue par
Intégration continueIntégration continue
Intégration continueKlee Group
5.4K vues47 diapositives
Java Basics for selenium par
Java Basics for seleniumJava Basics for selenium
Java Basics for seleniumapoorvams
71.9K vues73 diapositives
Selenium ppt par
Selenium pptSelenium ppt
Selenium pptPavan Kumar
84.2K vues13 diapositives
Resultado 2 par
Resultado 2Resultado 2
Resultado 2Sarahi Pech
385 vues30 diapositives
L'innovation en boutique par
L'innovation en boutiqueL'innovation en boutique
L'innovation en boutiqueConnected Futures
1.1K vues9 diapositives

En vedette(20)

Intégration continue par Klee Group
Intégration continueIntégration continue
Intégration continue
Klee Group5.4K vues
Java Basics for selenium par apoorvams
Java Basics for seleniumJava Basics for selenium
Java Basics for selenium
apoorvams71.9K vues
Elementos de un pc par alvariiito
Elementos de un pcElementos de un pc
Elementos de un pc
alvariiito462 vues
"COMERCIALES VENEZOLANOS LANZADOS AL AIRE EN 1990 HASTA PRINCIPIOS DEL 2000 Y... par Dinora Hernandez Arias
"COMERCIALES VENEZOLANOS LANZADOS AL AIRE EN 1990 HASTA PRINCIPIOS DEL 2000 Y..."COMERCIALES VENEZOLANOS LANZADOS AL AIRE EN 1990 HASTA PRINCIPIOS DEL 2000 Y...
"COMERCIALES VENEZOLANOS LANZADOS AL AIRE EN 1990 HASTA PRINCIPIOS DEL 2000 Y...
1400 1500مخطوطة أثرية كاملة للمصحف ترجع للقرن الخامس الميلادي par سمير بسيوني
 1400 1500مخطوطة  أثرية كاملة للمصحف ترجع للقرن الخامس الميلادي   1400 1500مخطوطة  أثرية كاملة للمصحف ترجع للقرن الخامس الميلادي
1400 1500مخطوطة أثرية كاملة للمصحف ترجع للقرن الخامس الميلادي
¿Qué es un Blog? par FridaSaad
  ¿Qué es un Blog?  ¿Qué es un Blog?
¿Qué es un Blog?
FridaSaad293 vues
La revolución energética y la sostenibilidad par Beatriz Onni
La revolución energética y la sostenibilidadLa revolución energética y la sostenibilidad
La revolución energética y la sostenibilidad
Beatriz Onni223 vues
Obesidad y sobrepeso (Presentación) par rubijimenezo
Obesidad y sobrepeso (Presentación)Obesidad y sobrepeso (Presentación)
Obesidad y sobrepeso (Presentación)
rubijimenezo4.1K vues
Vie à lasne de septembre 2014 partie 1 de 2 - site par comlasne
Vie à lasne de septembre 2014   partie 1 de 2 - siteVie à lasne de septembre 2014   partie 1 de 2 - site
Vie à lasne de septembre 2014 partie 1 de 2 - site
comlasne1.5K vues

Similaire à PAUG - Intégration Continue - Décembre 2013

Evolutions scub foundation 3.0 = 4.0 par
Evolutions scub foundation 3.0 =  4.0Evolutions scub foundation 3.0 =  4.0
Evolutions scub foundation 3.0 = 4.0adrienhautot
1.2K vues59 diapositives
publier une application Node sur heroku par
publier une application Node sur herokupublier une application Node sur heroku
publier une application Node sur herokueric German
1.3K vues8 diapositives
Python application packaging @ MeilleursAgents par
Python application packaging @ MeilleursAgentsPython application packaging @ MeilleursAgents
Python application packaging @ MeilleursAgentsNicolas Mussat
304 vues18 diapositives
Acra par
Acra Acra
Acra ODC Orange Developer Center
2K vues25 diapositives
20091006 Dev Forum Fr 001Introduction à GWT en utilisant AppCase SDK par
20091006 Dev Forum Fr 001Introduction à GWT en utilisant AppCase SDK20091006 Dev Forum Fr 001Introduction à GWT en utilisant AppCase SDK
20091006 Dev Forum Fr 001Introduction à GWT en utilisant AppCase SDKGreenIvory
1.2K vues19 diapositives
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter... par
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...XavierPestel
803 vues178 diapositives

Similaire à PAUG - Intégration Continue - Décembre 2013(20)

Evolutions scub foundation 3.0 = 4.0 par adrienhautot
Evolutions scub foundation 3.0 =  4.0Evolutions scub foundation 3.0 =  4.0
Evolutions scub foundation 3.0 = 4.0
adrienhautot1.2K vues
publier une application Node sur heroku par eric German
publier une application Node sur herokupublier une application Node sur heroku
publier une application Node sur heroku
eric German1.3K vues
Python application packaging @ MeilleursAgents par Nicolas Mussat
Python application packaging @ MeilleursAgentsPython application packaging @ MeilleursAgents
Python application packaging @ MeilleursAgents
Nicolas Mussat304 vues
20091006 Dev Forum Fr 001Introduction à GWT en utilisant AppCase SDK par GreenIvory
20091006 Dev Forum Fr 001Introduction à GWT en utilisant AppCase SDK20091006 Dev Forum Fr 001Introduction à GWT en utilisant AppCase SDK
20091006 Dev Forum Fr 001Introduction à GWT en utilisant AppCase SDK
GreenIvory1.2K vues
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter... par XavierPestel
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...
XavierPestel803 vues
Intégration continue des projets PHP avec Jenkins par Hugo Hamon
Intégration continue des projets PHP avec JenkinsIntégration continue des projets PHP avec Jenkins
Intégration continue des projets PHP avec Jenkins
Hugo Hamon20.1K vues
Retour d'expérience technique Go, gRPC, Kubernetes par Vincent Composieux
Retour d'expérience technique Go, gRPC, KubernetesRetour d'expérience technique Go, gRPC, Kubernetes
Retour d'expérience technique Go, gRPC, Kubernetes
Vincent Composieux1.1K vues
Intégration Continue PHP avec Jenkins CI par Hugo Hamon
Intégration Continue PHP avec Jenkins CIIntégration Continue PHP avec Jenkins CI
Intégration Continue PHP avec Jenkins CI
Hugo Hamon9.1K vues
Automatisez vos tâches répétitives avec Grunt (Blend 2013) par Corinne Schillinger
Automatisez vos tâches répétitives avec Grunt (Blend 2013)Automatisez vos tâches répétitives avec Grunt (Blend 2013)
Automatisez vos tâches répétitives avec Grunt (Blend 2013)
React Native - Développez vos application native en JS par Yann Duval
React Native - Développez vos application native en JSReact Native - Développez vos application native en JS
React Native - Développez vos application native en JS
Yann Duval309 vues
Présentation du versioning avec Git par msadouni
Présentation du versioning avec GitPrésentation du versioning avec Git
Présentation du versioning avec Git
msadouni1.2K vues
Partie 2: Angular par Habib Ayad
Partie 2: AngularPartie 2: Angular
Partie 2: Angular
Habib Ayad163 vues
CI, CD, pipelines, conteneurs : la cohabitation est elle possible ? par Membré Guillaume
CI, CD, pipelines, conteneurs : la cohabitation est elle possible ?CI, CD, pipelines, conteneurs : la cohabitation est elle possible ?
CI, CD, pipelines, conteneurs : la cohabitation est elle possible ?
Comment construire son laboratoire de tests mobiles avec HP Mobile Center par Guillaume Deshayes
Comment construire son laboratoire de tests mobiles avec HP Mobile CenterComment construire son laboratoire de tests mobiles avec HP Mobile Center
Comment construire son laboratoire de tests mobiles avec HP Mobile Center

PAUG - Intégration Continue - Décembre 2013

  • 1. Intégration continue HockeyApp - Robotium - Jenkins Aurélien Guillard - @a_guillard
  • 3. HockeyApp - Beta distribution ● APKs hébergés chez HockeyApp ● Alerte des beta testeurs ○ par mail ○ dans l’application ● Historique des versions ○ application Android ○ page web
  • 4. HockeyApp - Crash report ● ● ● ● ● Basé sur le volontariat des utilisateurs Remontée des crashs en temps réel Regroupement des crashs similaires Fonctionne avec Proguard Rapport quotidien par mail
  • 6. HockeyApp - Intégration @Override ● Intégration simple ○ Un JAR à copier ○ 2 méthodes à appeler public void onCreate(Bundle savedInstanceState) { checkForUpdates(); } @Override public void onResume() { super.onResume(); checkForCrashes(); } private void checkForCrashes() { CrashManager.register(this, APP_ID); } private void checkForUpdates() { UpdateManager.register(this, APP_ID); }
  • 7. HockeyApp - Combien ça coûte ?
  • 9. Robotium ? ● Extension du framework d’instrumentation Android Objectif : Simplifier le développement des tests
  • 10. Robotium - Exemple @Override public void setUp() throws Exception { solo = new Solo(getInstrumentation(), getActivity()); } @Override public void tearDown() throws Exception { solo.finishOpenedActivities(); } public void testLogin() { ScreenshotsUtils.takeScreenshot(solo, getActivity()); solo.enterText((EditText)solo.getView(R.id.mail_editText), "xxxxxxx.xxxxxx@xxxxx.com"); solo.enterText((EditText)solo.getView(R.id.password_editText), "xxxxxxxxxxx"); solo.clickOnView(solo.getView(R.id.connect_button)); assertTrue(solo.waitForActivity(HomeActivity.class)); }
  • 11. Robotium - Test report
  • 14. Jenkins - Job ‘viadeo android’ ● Vérification toutes les 15 minutes si une modification a eu lieu sur le repository GIT ● Si oui, update du code ● Compilation ● Envoi d’un mail en cas d’erreur
  • 15. Jenkins - Job ‘push to HockeyApp’ ● ● ● ● Exécution à la main Update du code Compilation Envoi de l’APK sur HockeyApp ○ plugin : https://wiki.jenkins-ci.org/display/JENKINS/Hockeyapp+Plugin
  • 16. Jenkins - Job ‘viadeo android test’ ● Vérification toutes les 15 minutes si une modification a eu lieu sur le repository GIT ● Si oui, update du code ● Compilation ● Démarrage d’un émulateur ○ plugin : https://wiki.jenkins-ci.org/display/JENKINS/Android+Emulator+Plugin ● Installation de l’application dans l’émulateur ● Installation de l’application de test dans l’émulateur ● Exécution des tests
  • 17. Jenkins - Récupération d’un rapport ● Utilisation d’un TestRunner alternatif ○ android junit report manifest.xml <instrumentation android:name="com.zutubi.android.junitreport.JUnitReportTestRunner" android:targetPackage="com.viadeo.android" /> ant.properties test.runner=com.zutubi.android.junitreport.JUnitReportTestRunner Plus d’info : http://zutubi.com/source/projects/android-junit-report/
  • 18. Jenkins - Récupération d’un rapport build.xml ● Création d’une nouvelle target Ant ● Copie du rapport en XML dans le projet <target name="fetch-test-report" > <xpath expression="/manifest/@package" input="${tested.project.dir}/AndroidManifest.xml" output="tested.manifest.package" /> <echo>Downloading XML test report...</echo> <mkdir dir="junitreports" /> <exec executable="${adb}" failonerror="true" > <arg line="${adb.device.arg}" /> <arg value="pull" /> <arg value="/data/data/${tested.manifest.package}/files/junit-report.xml" /> <arg value="junitreports/junit-report.xml" /> </exec> </target>
  • 19. Jenkins - Récupération d’un rapport ● Création d’une nouvelle target Ant ● Copie du dossier de screenshots robotium dans le projet build.xml <target name="fetch-test-screenshots" > <echo>Downloading test screenshots...</echo> <mkdir dir="Robotium-Screenshots" /> <exec executable="${adb}" failonerror="true" > <arg line="${adb.device.arg}" /> <arg value="pull" /> <arg value="/sdcard/Robotium-Screenshots" /> <arg value="Robotium-Screenshots" /> </exec> </target>
  • 20. Jenkins - Résultats des tests
  • 21. Next Steps ● Ecrire plus de scénarios de tests ● Exécuter les tests sur Genymotion ? ● Passer de Ant à Gradle ?