SlideShare a Scribd company logo
Testing and Building Android
Agenda: -Intro
-Android Testing
-Creating a project
-JUnit Testing
-Mock Objects + UI Testing
-Integration and acceptance test
-Performance and system testing
-Advance assertions
-TDD
-Real App Dev
!
Agenda:
-Tools
-Continuous Integration
!
Ego slide Mobile Developer @ Sixt
M. Sc. UCM/RWTH
CS Teacher at Alcalá University
!
!
! +EnriqueLópezMañas
@eenriquelopez
Ego slide Mobile Developer @ Sixt
M.Sc. Politehnica Timisoara
!
!
! +ami.antoch
Keywords
Continuous Integration
TDD
JUnit / Unit Testing
Instrumentation
Behavior Driven Development
Performance Testing
Profiling
What you need • Java SE Version 1.6
• Android SDK Tools
• Eclipse IDE for Java Developers
• ADT
• (Android Bundle)
Testing • Develop
• Finding
• Correcting
Is about productivity! $59.5 billion annually
!
1/3 could be saved
!
(National Institute of Standards and
Technology (USA))
Why, what, how, when
During, before
!
Continuous Integration
!
Classes, methods, lines, basic
blocks..
Activity lifecycle
Activity lifecycle
Databases and filesystem operations
Activity lifecycle
Databases and filesystem operations
Physical characteristics of the device
Activity lifecycle
Databases and filesystem operations
Physical characteristics of the device
(AVD and Genymotion)
UnitTests Written by programmers for programmers
JUnit
Elements of a test The fixture
Method setUp()
Method tearDown()
Test preconditions (retrospection vs. annotations)
Assertions • assertEquals()
• assertFalse()
• assertNotNull()
• assertNotSame()
• assertNull()
• assertSame()
• assertTrue()
• fail()
Mock objects Mimic objects
• MockApplication
• MockContentProvider
• MockContentResolver
• MockContext
• MockCursor
• MockDialogInterface
• MockPackageManager
• MockResources
UI Tests Annotation @UIThreadTest
Class TouchUtils
• Click
• Drag
• LongClick
• Scroll
• Tap
• Touch
Environments Eclipse…
…but also IntelliJ!
…and Netbeans!
Instrumentation Foundation
Control application under test and permit
injection
Project Test MyProject
MyProjectTest
Testing Target Device
AVD Machines
GenyMotion
Summary
Android Testing
Best practice: test should live in a separate
correlated project
• Stripped (not included in main)
• Easier to run in Emulator
• Takes less time
• Encourages code reusability
Create project
AVD
Genymotion
DDMS
TestAnnotations
@SmallTest
@MediumTest
@LargeTest
@Smoke
@FlakyTest (tolerance=4)
@UIThreadTest
@Suppress
Running Test From Eclipse
Testing and Building Android
Running Single Test
Running from the emulator
Running from the command line
Running from the command line
• All
• From an specific test case
• Specific test by name
• By category
• (create custom annotations)
Debug bugs
Summary • Created first Android project
• Followed best practice creating companion project
• Simple test class
• Eclipse
• Command line options
Mockup
• All Mock implementations
• All methods non functional
• Throw UnsupportedOperationExceiption
UI Testing • Android SDK Tools, 21+
• API 16+
• uiaumatorviewer
• uiautomator
Tools
Integration tests Individual components work jointly
Integration tests Individual components work jointly
Acceptance tests QA, Business language
Performance tests Performance behavior
System test • GUI Test
• Smoke Tests
• Performance
• Installation
Benchmarking • Traditional logging statement methods
• Creating Android performance tests
• Using profiling tools
• Microbenchmarks using Caliper
Benchmarking
/* (non-Javadoc)
* @see android.text.TextWatcher#onTextChanged(
* java.lang.CharSequence, int, int, int)
*/
public void onTextChanged(CharSequence s, int start,
int before, int count) {
if (!mDest.hasWindowFocus() || mDest.hasFocus() ||
s == null ) {
return; }
final String str = s.toString();
if ( "".equals(str) ) {
mDest.setText("");
return;
}
final long t0;
if ( BENCHMARK_TEMPERATURE_CONVERSION ) {
t0 = System.currentTimeMillis();
}
!
Benchmarking

try {
final double temp = Double.parseDouble(str);
final double result = (mOp == OP.C2F) ?

 TemperatureConverter.celsiusToFarenheit(temp);
TemperatureConverter.fahrenheitToCelsius(temp);
final String resultString = String.format("%.2f", result);
mDest.setNumber(result);
mDest.setSelection(resultString.length());
} catch (NumberFormatException e) {
// WARNING
// this is generated while a number is entered,
// for example just a '-'
// so we don't want to show the error
} catch (Exception e) {
mSource.setError("ERROR: " + e.getLocalizedMessage());
}
if ( BENCHMARK_TEMPERATURE_CONVERSION ) {
long t = System.currentTimeMillis() - t0;
Log.i(TAG, "TemperatureConversion took " + t +
" ms to complete.");
}
}
Android performance tests
Classes hidden only for System
apps :(
Assertions in depth • assertEquals
• assertFalse
• assertNotNull
• assertNotSame
• assertNull
• assertSame
• assertTrue
• assertFail
Assertions in depth public void testNotImplementedYet() {
fail("Not implemented yet");
}
Assertions in depth public void testShouldThrowException() {
try {
MyFirstProjectActivity.methodThatShouldThrowException();
fail("Exception was not thrown");
} catch ( Exception ex ) {
// do nothing
}
}
Custom messages public void testMax() {

final int a = 1;

final int b = 2;

final int expected = b;

final int actual = Math.max(a, b);

assertEquals("Expection " + expected + " but was " + actual,
expected, actual);
}
Static imports public void testAlignment() {
final int margin = 0;
...
android.test.ViewAsserts.assertRightAligned(
mMessage, mCapitalize, margin);
!
}
Static imports
import static android.test.ViewAsserts.assertRightAligned;
public void testAlignment() {

final int margin = 0;

assertRightAligned(mMessage, mCapitalize, margin);
}
View assertions assertBaselineAligned
View assertions assertBaselineAligned

assertBotomAligned
View assertions assertBaselineAligned

assertBotomAligned
assertGroupContains
View assertions assertBaselineAligned

assertBotomAligned
assertGroupContains
assertGroupIntegrity
View assertions assertBaselineAligned

assertBotomAligned
assertGroupContains
assertGroupIntegrity
assertGroupNotContains
View assertions assertBaselineAligned

assertBotomAligned
assertGroupContains
assertGroupIntegrity
assertGroupNotContains
assertHasScreenCoordinates
View assertions assertBaselineAligned

assertBotomAligned
assertGroupContains
assertGroupIntegrity
assertGroupNotContains
assertHasScreenCoordinates
assertHorizontalCenterAligned
View assertions assertLeftAligned
View assertions assertLeftAligned
assertOffScreenAbove
View assertions assertLeftAligned
assertOffScreenAbove
assertOffScreenBelow
View assertions assertLeftAligned
assertOffScreenAbove
assertOffScreenBelow
assertOnScreen
View assertions assertLeftAligned
assertOffScreenAbove
assertOffScreenBelow
assertOnScreen
assertRightAligned
View assertions assertLeftAligned
assertOffScreenAbove
assertOffScreenBelow
assertOnScreen
assertRightAligned
assertTopAligned
View assertions assertLeftAligned
assertOffScreenAbove
assertOffScreenBelow
assertOnScreen
assertRightAligned
assertTopAligned
assertVerticalCenterAligned
Example
public void testUserInterfaceLayout() {

final int margin = 0;

final View origin = mActivity.getWindow().getDecorView(); 
assertOnScreen(origin, mMessage); 
assertOnScreen(origin, mCapitalize);
assertRightAligned(mMessage, mCapitalize, margin);
}
Even more 

assertions
assertAssignableFrom
Even more 

assertions
assertAssignableFrom
assertContainsRegex
Even more 

assertions
assertAssignableFrom
assertContainsRegex
assertContainsInAnyOrder
Even more 

assertions
assertAssignableFrom
assertContainsRegex
assertContainsInAnyOrder
assertContainsInOrder
Even more 

assertions
assertAssignableFrom
assertContainsRegex
assertContainsInAnyOrder
assertContainsInOrder
assertEmpty
Even more 

assertions
assertAssignableFrom
assertContainsRegex
assertContainsInAnyOrder
assertContainsInOrder
assertEmpty
assertEquals
Even more 

assertions
assertMatchesRegex
Even more 

assertions
assertMatchesRegex
assertNotContainsRegex
Even more 

assertions
assertMatchesRegex
assertNotContainsRegex
assertNotEmpty
Even more 

assertions
assertMatchesRegex
assertNotContainsRegex
assertNotEmpty
assertNotMatchesRegex
Even more 

assertions
assertMatchesRegex
assertNotContainsRegex
assertNotEmpty
assertNotMatchesRegex
checkEqualsAndHashCodeMethods
Example
@UiThreadTest
public void testNoErrorInCapitalization() {
final String msg = "this is a sample";
mMessage.setText(msg);
mCapitalize.performClick();
final String actual = mMessage.getText().toString(); 
final String notExpectedRegexp = “(?i:ERROR)";
assertNotContainsRegex("Capitalization found error:",
notExpectedRegexp, actual);
}
assertActivityRequiresPermission

 
 public void testActivityPermission() {

 
 final String PKG = "com.example.aatg.myfirstproject";

 
 final String ACTIVITY = PKG + ".MyFirstProjectActivity";

 
 final String PERMISSION = android.Manifest.permission.WRITE_EXTERNAL_STORAGE;

 
 assertActivityRequiresPermission(PKG, ACTIVITY, PERMISSION);

 }
assertReadingContentUriRequiresPermission
public void testReadingContacts() {
final Uri URI = ContactsContract.AUTHORITY_URI;
final String PERMISSION =
android.Manifest.permission.READ_CONTACTS;
assertReadingContentUriRequiresPermission(URI, PERMISSION);
}
assertWritingContentUriRequiresPermission
public void testWritingContacts() {
final Uri URI = ContactsContract.AUTHORITY_URI;
final String PERMISSION =
android.Manifest.permission.WRITE_CONTACTS;
assertWritingContentUriRequiresPermission(URI, PERMISSION);
}
ActivityMonitor
public void testFollowLink() {
final Instrumentation inst = getInstrumentation();
IntentFilter intentFilter = new IntentFilter(Intent.ACTION_VIEW);
intentFilter.addDataScheme("http");
intentFilter.addCategory(Intent.CATEGORY_BROWSABLE);
ActivityMonitor monitor = inst.addMonitor(intentFilter, null, false); 
assertEquals(0, monitor.getHits()); 
TouchUtils.clickView(this, mLink); 
monitor.waitForActivityWithTimeout(5000); 
assertEquals(1, monitor.getHits()); 
inst.removeMonitor(monitor);
}
Example project
Summary
Used several types of assertion
Explained mock objects
Exemplified different tests
Test Driven Development
Test Driven Development
Test Driven Development • Difficult to divert code
• Focus
NO SILVER BULLET
Example project - temperature converter
Requirements:
• Application convert from Celsius to F.
• … and viceversa
• Two fields to input data
• When temperature is entered, other field updates
• Error displayed
• Some space reserved keyboard
• Entry fields start empty
• Digits right aligned
• Last entered values retained after onPause()
Concept design
Create projects
From requirement to tests
AVD and Emulator Options
Headless emulator
emulator -avd test -no-window -no-audio -no-boot-anim -port 5580 &
Monkeyrunner
Building with ant android update project —path .
Jenkins
Testing recipes
Testing and Building Android
Thank you !
+ Enrique López Mañas
@eenriquelopez

More Related Content

What's hot (20)

PPT
SF JUG - GWT Can Help You Create Amazing Apps - 2009-10-13
Fred Sauer
 
PDF
Learn How to Unit Test Your Android Application (with Robolectric)
Marakana Inc.
 
PDF
Testing iOS10 Apps with Appium and its new XCUITest backend
Testplus GmbH
 
PPTX
QA Fest 2018. Adam Stasiak. React Native is Coming – the story of hybrid mobi...
QAFest
 
PDF
A Gentle Introduction to Angular Schematics - Angular SF 2019
Matt Raible
 
PDF
Ten Minutes To Tellurium
John.Jian.Fang
 
PDF
A Gentle Introduction to Angular Schematics - Devoxx Belgium 2019
Matt Raible
 
PDF
Basic Tutorial of React for Programmers
David Rodenas
 
KEY
Kirin - Making Single Page Web Apps with a Native UI
jhugman
 
PDF
Bootiful Development with Spring Boot and React - UberConf 2018
Matt Raible
 
PDF
Unit testing and Android
Tomáš Kypta
 
PPTX
Automated integration tests for ajax applications (с. карпушин, auriga)
Mobile Developer Day
 
PDF
JavaScript Library Overview
jeresig
 
PDF
Guide to the jungle of testing frameworks
Tomáš Kypta
 
PDF
Reactive Thinking in Java with RxJava2
Yakov Fain
 
PDF
Angular 2 for Java Developers
Yakov Fain
 
PDF
Easy tests with Selenide and Easyb
Iakiv Kramarenko
 
PPTX
React inter3
Oswald Campesato
 
PDF
vJUG - The JavaFX Ecosystem
Andres Almiray
 
PDF
Alexey Buzdin "Maslow's Pyramid of Android Testing"
IT Event
 
SF JUG - GWT Can Help You Create Amazing Apps - 2009-10-13
Fred Sauer
 
Learn How to Unit Test Your Android Application (with Robolectric)
Marakana Inc.
 
Testing iOS10 Apps with Appium and its new XCUITest backend
Testplus GmbH
 
QA Fest 2018. Adam Stasiak. React Native is Coming – the story of hybrid mobi...
QAFest
 
A Gentle Introduction to Angular Schematics - Angular SF 2019
Matt Raible
 
Ten Minutes To Tellurium
John.Jian.Fang
 
A Gentle Introduction to Angular Schematics - Devoxx Belgium 2019
Matt Raible
 
Basic Tutorial of React for Programmers
David Rodenas
 
Kirin - Making Single Page Web Apps with a Native UI
jhugman
 
Bootiful Development with Spring Boot and React - UberConf 2018
Matt Raible
 
Unit testing and Android
Tomáš Kypta
 
Automated integration tests for ajax applications (с. карпушин, auriga)
Mobile Developer Day
 
JavaScript Library Overview
jeresig
 
Guide to the jungle of testing frameworks
Tomáš Kypta
 
Reactive Thinking in Java with RxJava2
Yakov Fain
 
Angular 2 for Java Developers
Yakov Fain
 
Easy tests with Selenide and Easyb
Iakiv Kramarenko
 
React inter3
Oswald Campesato
 
vJUG - The JavaFX Ecosystem
Andres Almiray
 
Alexey Buzdin "Maslow's Pyramid of Android Testing"
IT Event
 

Similar to Testing and Building Android (20)

PDF
Android Building, Testing and reversing
Enrique López Mañas
 
PDF
Oh so you test? - A guide to testing on Android from Unit to Mutation
Paul Blundell
 
PDF
Play with Testing on Android - Gilang Ramadhan (Academy Content Writer at Dic...
DicodingEvent
 
PPT
Android the Agile way
Ashwin Raghav
 
PPTX
The real beginner's guide to android testing
Eric (Trung Dung) Nguyen
 
PDF
A guide to Android automated testing
jotaemepereira
 
PDF
Cracking android app. Мокиенко Сергей
Alina Dolgikh
 
PDF
Android testing part i
Kan-Han (John) Lu
 
PDF
Matteo Vaccari - TDD per Android | Codemotion Milan 2015
Codemotion
 
PDF
TDD and mobile development: some forgotten techniques, illustrated with Android
Codemotion
 
PDF
Unit & Automation Testing in Android - Stanislav Gatsev, Melon
beITconference
 
PDF
Robotium Tutorial
Mobile March
 
PDF
Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt
Infinum
 
PDF
Testing Android
Marc Chung
 
PPTX
Testing Android Application, Droidcon Torino
Pietro Alberto Rossi
 
PDF
Unit Testing on Android - Droidcon Berlin 2015
Buşra Deniz, CSM
 
PDF
Software Testing - Invited Lecture at UNSW Sydney
julien.ponge
 
PPTX
Unit Testing in Android
Md Shamsul Arafin Mahtab
 
PDF
Agile mobile
Godfrey Nolan
 
Android Building, Testing and reversing
Enrique López Mañas
 
Oh so you test? - A guide to testing on Android from Unit to Mutation
Paul Blundell
 
Play with Testing on Android - Gilang Ramadhan (Academy Content Writer at Dic...
DicodingEvent
 
Android the Agile way
Ashwin Raghav
 
The real beginner's guide to android testing
Eric (Trung Dung) Nguyen
 
A guide to Android automated testing
jotaemepereira
 
Cracking android app. Мокиенко Сергей
Alina Dolgikh
 
Android testing part i
Kan-Han (John) Lu
 
Matteo Vaccari - TDD per Android | Codemotion Milan 2015
Codemotion
 
TDD and mobile development: some forgotten techniques, illustrated with Android
Codemotion
 
Unit & Automation Testing in Android - Stanislav Gatsev, Melon
beITconference
 
Robotium Tutorial
Mobile March
 
Infinum Android Talks #13 - Developing Android Apps Like Navy Seals by Ivan Kušt
Infinum
 
Testing Android
Marc Chung
 
Testing Android Application, Droidcon Torino
Pietro Alberto Rossi
 
Unit Testing on Android - Droidcon Berlin 2015
Buşra Deniz, CSM
 
Software Testing - Invited Lecture at UNSW Sydney
julien.ponge
 
Unit Testing in Android
Md Shamsul Arafin Mahtab
 
Agile mobile
Godfrey Nolan
 
Ad

More from Droidcon Berlin (20)

PDF
Droidcon de 2014 google cast
Droidcon Berlin
 
PDF
Android programming -_pushing_the_limits
Droidcon Berlin
 
PDF
Raspberry Pi
Droidcon Berlin
 
PDF
Android industrial mobility
Droidcon Berlin
 
PDF
Details matter in ux
Droidcon Berlin
 
PDF
From sensor data_to_android_and_back
Droidcon Berlin
 
PDF
droidparts
Droidcon Berlin
 
PDF
new_age_graphics_android_x86
Droidcon Berlin
 
PDF
5 tips of monetization
Droidcon Berlin
 
PDF
Matchinguu droidcon presentation
Droidcon Berlin
 
PDF
Cgm life sdk_droidcon_2014_v3
Droidcon Berlin
 
PDF
The artofcalabash peterkrauss
Droidcon Berlin
 
PDF
Raesch, gries droidcon 2014
Droidcon Berlin
 
PDF
Android open gl2_droidcon_2014
Droidcon Berlin
 
PDF
20140508 quantified self droidcon
Droidcon Berlin
 
PDF
Tuning android for low ram devices
Droidcon Berlin
 
PDF
Froyo to kit kat two years developing & maintaining deliradio
Droidcon Berlin
 
PDF
Droidcon2013 security genes_trendmicro
Droidcon Berlin
 
PDF
Droidcon2013 commercialsuccess rannenberg
Droidcon Berlin
 
PDF
Droidcon2013 bootstrap luedeke
Droidcon Berlin
 
Droidcon de 2014 google cast
Droidcon Berlin
 
Android programming -_pushing_the_limits
Droidcon Berlin
 
Raspberry Pi
Droidcon Berlin
 
Android industrial mobility
Droidcon Berlin
 
Details matter in ux
Droidcon Berlin
 
From sensor data_to_android_and_back
Droidcon Berlin
 
droidparts
Droidcon Berlin
 
new_age_graphics_android_x86
Droidcon Berlin
 
5 tips of monetization
Droidcon Berlin
 
Matchinguu droidcon presentation
Droidcon Berlin
 
Cgm life sdk_droidcon_2014_v3
Droidcon Berlin
 
The artofcalabash peterkrauss
Droidcon Berlin
 
Raesch, gries droidcon 2014
Droidcon Berlin
 
Android open gl2_droidcon_2014
Droidcon Berlin
 
20140508 quantified self droidcon
Droidcon Berlin
 
Tuning android for low ram devices
Droidcon Berlin
 
Froyo to kit kat two years developing & maintaining deliradio
Droidcon Berlin
 
Droidcon2013 security genes_trendmicro
Droidcon Berlin
 
Droidcon2013 commercialsuccess rannenberg
Droidcon Berlin
 
Droidcon2013 bootstrap luedeke
Droidcon Berlin
 
Ad

Recently uploaded (8)

PPT
lec2 wireless transmission exlaining.ppt
212231
 
PDF
💡 Digital Marketing Decoded: Mastering Online Growth Strategies for 2025 🚀
marketingaura24
 
PDF
Building Smart, Scalable Solutions with Android App Development
Brancosoft Private Limited
 
PDF
Call For Papers - International Journal on Natural Language Computing (IJNLC)
kevig
 
PPT
lect 1 Introduction.ppt11112222333344455
212231
 
PPTX
Mobile Apps Helping Business Grow in 2025
Infylo Techsolutions
 
PDF
INTERLINGUAL SYNTACTIC PARSING: AN OPTIMIZED HEAD-DRIVEN PARSING FOR ENGLISH ...
kevig
 
PPTX
The Intersection of Emoji and NFT. What can be the Consequences?
Refit Global
 
lec2 wireless transmission exlaining.ppt
212231
 
💡 Digital Marketing Decoded: Mastering Online Growth Strategies for 2025 🚀
marketingaura24
 
Building Smart, Scalable Solutions with Android App Development
Brancosoft Private Limited
 
Call For Papers - International Journal on Natural Language Computing (IJNLC)
kevig
 
lect 1 Introduction.ppt11112222333344455
212231
 
Mobile Apps Helping Business Grow in 2025
Infylo Techsolutions
 
INTERLINGUAL SYNTACTIC PARSING: AN OPTIMIZED HEAD-DRIVEN PARSING FOR ENGLISH ...
kevig
 
The Intersection of Emoji and NFT. What can be the Consequences?
Refit Global
 

Testing and Building Android