Android Building, Testing and reversing

102

description

Android Building, Testing and reversing

Transcript of Android Building, Testing and reversing

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