Top Banner
102

Android Building, Testing and reversing

May 09, 2015

Download

Technology

Android Building, Testing and reversing
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Android Building, Testing and reversing
Page 2: Android Building, Testing and reversing

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 !

Page 3: Android Building, Testing and reversing

Agenda:

-Tools -Continuous Integration !

Page 4: Android Building, Testing and reversing

Ego slide Mobile Developer @ Sixt M. Sc. UCM/RWTH CS Teacher at Alcalá University !!! +EnriqueLópezMañas

@eenriquelopez

Page 5: Android Building, Testing and reversing

Ego slide Mobile Developer @ Sixt M.Sc. Politehnica Timisoara !!! +ami.antoch

Page 6: Android Building, Testing and reversing

Keywords Continuous Integration TDD JUnit / Unit Testing Instrumentation Behavior Driven Development Performance Testing Profiling

Page 7: Android Building, Testing and reversing

What you need • Java SE Version 1.6 • Android SDK Tools • Eclipse IDE for Java Developers • ADT • (Android Bundle)

Page 8: Android Building, Testing and reversing

Testing • Develop • Finding • Correcting

Page 9: Android Building, Testing and reversing

Is about productivity! $59.5 billion annually !1/3 could be saved !(National Institute of Standards and Technology (USA))

Page 10: Android Building, Testing and reversing

Why, what, how, whenDuring, before !Continuous Integration !Classes, methods, lines, basic blocks..

Page 11: Android Building, Testing and reversing

Activity lifecycle

Page 12: Android Building, Testing and reversing

Activity lifecycle

Databases and filesystem operations

Page 13: Android Building, Testing and reversing

Activity lifecycle

Databases and filesystem operations

Physical characteristics of the device

Page 14: Android Building, Testing and reversing

Activity lifecycle

Databases and filesystem operations

Physical characteristics of the device

(AVD and Genymotion)

Page 15: Android Building, Testing and reversing

UnitTests Written by programmers for programmers

JUnit

Page 16: Android Building, Testing and reversing

Elements of a test The fixture

Method setUp()

Method tearDown()

Test preconditions (retrospection vs. annotations)

Page 17: Android Building, Testing and reversing

Assertions • assertEquals() • assertFalse() • assertNotNull() • assertNotSame() • assertNull() • assertSame() • assertTrue() • fail()

Page 18: Android Building, Testing and reversing

Mock objects Mimic objects

• MockApplication • MockContentProvider • MockContentResolver • MockContext • MockCursor • MockDialogInterface • MockPackageManager • MockResources

Page 19: Android Building, Testing and reversing

UI Tests Annotation @UIThreadTest

Class TouchUtils

• Click • Drag • LongClick • Scroll • Tap • Touch

Page 20: Android Building, Testing and reversing

Environments Eclipse…

…but also IntelliJ!

…and Netbeans!

Page 21: Android Building, Testing and reversing

Instrumentation Foundation

Control application under test and permit injection

Page 22: Android Building, Testing and reversing

Project Test MyProject

MyProjectTest

Page 23: Android Building, Testing and reversing

Testing Target Device

AVD Machines

GenyMotion

Page 24: Android Building, Testing and reversing

Summary

Page 25: Android Building, Testing and reversing

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

Page 26: Android Building, Testing and reversing

Create project

Page 27: Android Building, Testing and reversing

AVD

Page 28: Android Building, Testing and reversing

Genymotion

Page 29: Android Building, Testing and reversing

DDMS

Page 30: Android Building, Testing and reversing

TestAnnotations@SmallTest

@MediumTest

@LargeTest

@Smoke

@FlakyTest (tolerance=4)

@UIThreadTest

@Suppress

Page 31: Android Building, Testing and reversing

Running Test From Eclipse

Page 32: Android Building, Testing and reversing
Page 33: Android Building, Testing and reversing

Running Single Test

Page 34: Android Building, Testing and reversing

Running from the emulator

Page 35: Android Building, Testing and reversing

Running from the command line

Page 36: Android Building, Testing and reversing

Running from the command line

• All • From an specific test case • Specific test by name • By category • (create custom annotations)

Page 37: Android Building, Testing and reversing

Debug bugs

Page 38: Android Building, Testing and reversing

Summary • Created first Android project

• Followed best practice creating companion project

• Simple test class

• Eclipse

• Command line options

Page 39: Android Building, Testing and reversing

Mockup• All Mock implementations • All methods non functional • Throw UnsupportedOperationExceiption

Page 40: Android Building, Testing and reversing

UI Testing • Android SDK Tools, 21+ • API 16+

• uiaumatorviewer • uiautomator

Tools

Page 41: Android Building, Testing and reversing

Integration tests Individual components work jointly

Page 42: Android Building, Testing and reversing

Integration tests Individual components work jointly

Acceptance tests QA, Business language

Page 43: Android Building, Testing and reversing

Performance tests Performance behavior

System test • GUI Test • Smoke Tests • Performance • Installation

Page 44: Android Building, Testing and reversing

Benchmarking • Traditional logging statement methods • Creating Android performance tests • Using profiling tools • Microbenchmarks using Caliper

Page 45: Android Building, Testing and reversing

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(); } !

Page 46: Android Building, Testing and reversing

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."); } }

Page 47: Android Building, Testing and reversing

Android performance tests Classes hidden only for System apps :(

Page 48: Android Building, Testing and reversing

Assertions in depth • assertEquals • assertFalse • assertNotNull • assertNotSame • assertNull • assertSame • assertTrue • assertFail

Page 49: Android Building, Testing and reversing

Assertions in depth public void testNotImplementedYet() { fail("Not implemented yet"); }

Page 50: Android Building, Testing and reversing

Assertions in depth public void testShouldThrowException() { try { MyFirstProjectActivity.methodThatShouldThrowException(); fail("Exception was not thrown"); } catch ( Exception ex ) { // do nothing } }

Page 51: Android Building, Testing and reversing

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); }

Page 52: Android Building, Testing and reversing

Static imports public void testAlignment() { final int margin = 0; ... android.test.ViewAsserts.assertRightAligned( mMessage, mCapitalize, margin); !}

Page 53: Android Building, Testing and reversing

Static importsimport static android.test.ViewAsserts.assertRightAligned; public void testAlignment() { final int margin = 0; assertRightAligned(mMessage, mCapitalize, margin); }

Page 54: Android Building, Testing and reversing

View assertions assertBaselineAligned

Page 55: Android Building, Testing and reversing

View assertions assertBaselineAlignedassertBotomAligned

Page 56: Android Building, Testing and reversing

View assertions assertBaselineAlignedassertBotomAligned assertGroupContains

Page 57: Android Building, Testing and reversing

View assertions assertBaselineAlignedassertBotomAligned assertGroupContains assertGroupIntegrity

Page 58: Android Building, Testing and reversing

View assertions assertBaselineAlignedassertBotomAligned assertGroupContains assertGroupIntegrity assertGroupNotContains

Page 59: Android Building, Testing and reversing

View assertions assertBaselineAlignedassertBotomAligned assertGroupContains assertGroupIntegrity assertGroupNotContains assertHasScreenCoordinates

Page 60: Android Building, Testing and reversing

View assertions assertBaselineAlignedassertBotomAligned assertGroupContains assertGroupIntegrity assertGroupNotContains assertHasScreenCoordinates assertHorizontalCenterAligned

Page 61: Android Building, Testing and reversing

View assertions assertLeftAligned

Page 62: Android Building, Testing and reversing

View assertions assertLeftAligned assertOffScreenAbove

Page 63: Android Building, Testing and reversing

View assertions assertLeftAligned assertOffScreenAbove assertOffScreenBelow

Page 64: Android Building, Testing and reversing

View assertions assertLeftAligned assertOffScreenAbove assertOffScreenBelow assertOnScreen

Page 65: Android Building, Testing and reversing

View assertions assertLeftAligned assertOffScreenAbove assertOffScreenBelow assertOnScreen assertRightAligned

Page 66: Android Building, Testing and reversing

View assertions assertLeftAligned assertOffScreenAbove assertOffScreenBelow assertOnScreen assertRightAligned assertTopAligned

Page 67: Android Building, Testing and reversing

View assertions assertLeftAligned assertOffScreenAbove assertOffScreenBelow assertOnScreen assertRightAligned assertTopAligned assertVerticalCenterAligned

Page 68: Android Building, Testing and reversing

Examplepublic void testUserInterfaceLayout() { final int margin = 0; final View origin = mActivity.getWindow().getDecorView(); assertOnScreen(origin, mMessage); assertOnScreen(origin, mCapitalize); assertRightAligned(mMessage, mCapitalize, margin); }

Page 69: Android Building, Testing and reversing

Even more assertions assertAssignableFrom

Page 70: Android Building, Testing and reversing

Even more assertions assertAssignableFrom

assertContainsRegex

Page 71: Android Building, Testing and reversing

Even more assertions assertAssignableFrom

assertContainsRegex assertContainsInAnyOrder

Page 72: Android Building, Testing and reversing

Even more assertions assertAssignableFrom

assertContainsRegex assertContainsInAnyOrder assertContainsInOrder

Page 73: Android Building, Testing and reversing

Even more assertions assertAssignableFrom

assertContainsRegex assertContainsInAnyOrder assertContainsInOrder assertEmpty

Page 74: Android Building, Testing and reversing

Even more assertions assertAssignableFrom

assertContainsRegex assertContainsInAnyOrder assertContainsInOrder assertEmpty assertEquals

Page 75: Android Building, Testing and reversing

Even more assertions assertMatchesRegex

Page 76: Android Building, Testing and reversing

Even more assertions

assertMatchesRegex assertNotContainsRegex

Page 77: Android Building, Testing and reversing

Even more assertions

assertMatchesRegex assertNotContainsRegex assertNotEmpty

Page 78: Android Building, Testing and reversing

Even more assertions

assertMatchesRegex assertNotContainsRegex assertNotEmpty assertNotMatchesRegex

Page 79: Android Building, Testing and reversing

Even more assertions

assertMatchesRegex assertNotContainsRegex assertNotEmpty assertNotMatchesRegex checkEqualsAndHashCodeMethods

Page 80: Android Building, Testing and reversing

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); }

Page 81: Android Building, Testing and reversing

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); }

Page 82: Android Building, Testing and reversing

assertReadingContentUriRequiresPermission

public void testReadingContacts() { final Uri URI = ContactsContract.AUTHORITY_URI; final String PERMISSION = android.Manifest.permission.READ_CONTACTS; assertReadingContentUriRequiresPermission(URI, PERMISSION); }

Page 83: Android Building, Testing and reversing

assertWritingContentUriRequiresPermission

public void testWritingContacts() { final Uri URI = ContactsContract.AUTHORITY_URI; final String PERMISSION = android.Manifest.permission.WRITE_CONTACTS; assertWritingContentUriRequiresPermission(URI, PERMISSION); }

Page 84: Android Building, Testing and reversing

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); }

Page 85: Android Building, Testing and reversing

Example project

Page 86: Android Building, Testing and reversing

SummaryUsed several types of assertion Explained mock objects Exemplified different tests

Page 87: Android Building, Testing and reversing

Test Driven Development

Page 88: Android Building, Testing and reversing

Test Driven Development

Page 89: Android Building, Testing and reversing

Test Driven Development • Difficult to divert code • Focus

NO SILVER BULLET

Page 90: Android Building, Testing and reversing

Example project - temperature converter

Page 91: Android Building, Testing and reversing

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()

Page 92: Android Building, Testing and reversing

Concept design

Page 93: Android Building, Testing and reversing

Create projects

Page 94: Android Building, Testing and reversing

From requirement to tests

Page 95: Android Building, Testing and reversing

AVD and Emulator Options

Page 96: Android Building, Testing and reversing

Headless emulator

emulator -avd test -no-window -no-audio -no-boot-anim -port 5580 &

Page 97: Android Building, Testing and reversing

Monkeyrunner

Page 98: Android Building, Testing and reversing

Building with ant android update project —path .

Page 99: Android Building, Testing and reversing

Jenkins

Page 100: Android Building, Testing and reversing

Testing recipes

Page 101: Android Building, Testing and reversing
Page 102: Android Building, Testing and reversing

Thank you !

+ Enrique López Mañas

@eenriquelopez