Download - Testing and Building Android

Transcript
Page 1: Testing and Building Android
Page 2: 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 !

Page 3: Testing and Building Android

Agenda:

-Tools -Continuous Integration !

Page 4: Testing and Building Android

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

@eenriquelopez

Page 5: Testing and Building Android

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

Page 6: Testing and Building Android

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

Page 7: Testing and Building Android

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

Page 8: Testing and Building Android

Testing • Develop • Finding • Correcting

Page 9: Testing and Building Android

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

Page 10: Testing and Building Android

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

Page 11: Testing and Building Android

Activity lifecycle

Page 12: Testing and Building Android

Activity lifecycle

Databases and filesystem operations

Page 13: Testing and Building Android

Activity lifecycle

Databases and filesystem operations

Physical characteristics of the device

Page 14: Testing and Building Android

Activity lifecycle

Databases and filesystem operations

Physical characteristics of the device

(AVD and Genymotion)

Page 15: Testing and Building Android

UnitTests Written by programmers for programmers

JUnit

Page 16: Testing and Building Android

Elements of a test The fixture

Method setUp()

Method tearDown()

Test preconditions (retrospection vs. annotations)

Page 17: Testing and Building Android

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

Page 18: Testing and Building Android

Mock objects Mimic objects

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

Page 19: Testing and Building Android

UI Tests Annotation @UIThreadTest

Class TouchUtils

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

Page 20: Testing and Building Android

Environments Eclipse…

…but also IntelliJ!

…and Netbeans!

Page 21: Testing and Building Android

Instrumentation Foundation

Control application under test and permit injection

Page 22: Testing and Building Android

Project Test MyProject

MyProjectTest

Page 23: Testing and Building Android

Testing Target Device

AVD Machines

GenyMotion

Page 24: Testing and Building Android

Summary

Page 25: Testing and Building Android

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: Testing and Building Android

Create project

Page 27: Testing and Building Android

AVD

Page 28: Testing and Building Android

Genymotion

Page 29: Testing and Building Android

DDMS

Page 30: Testing and Building Android

TestAnnotations@SmallTest

@MediumTest

@LargeTest

@Smoke

@FlakyTest (tolerance=4)

@UIThreadTest

@Suppress

Page 31: Testing and Building Android

Running Test From Eclipse

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

Running Single Test

Page 34: Testing and Building Android

Running from the emulator

Page 35: Testing and Building Android

Running from the command line

Page 36: Testing and Building Android

Running from the command line

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

Page 37: Testing and Building Android

Debug bugs

Page 38: Testing and Building Android

Summary • Created first Android project

• Followed best practice creating companion project

• Simple test class

• Eclipse

• Command line options

Page 39: Testing and Building Android

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

Page 40: Testing and Building Android

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

• uiaumatorviewer • uiautomator

Tools

Page 41: Testing and Building Android

Integration tests Individual components work jointly

Page 42: Testing and Building Android

Integration tests Individual components work jointly

Acceptance tests QA, Business language

Page 43: Testing and Building Android

Performance tests Performance behavior

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

Page 44: Testing and Building Android

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

Page 45: Testing and Building Android

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: Testing and Building Android

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: Testing and Building Android

Android performance tests Classes hidden only for System apps :(

Page 48: Testing and Building Android

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

Page 49: Testing and Building Android

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

Page 50: Testing and Building Android

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

Page 51: Testing and Building Android

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: Testing and Building Android

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

Page 53: Testing and Building Android

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

Page 54: Testing and Building Android

View assertions assertBaselineAligned

Page 55: Testing and Building Android

View assertions assertBaselineAlignedassertBotomAligned

Page 56: Testing and Building Android

View assertions assertBaselineAlignedassertBotomAligned assertGroupContains

Page 57: Testing and Building Android

View assertions assertBaselineAlignedassertBotomAligned assertGroupContains assertGroupIntegrity

Page 58: Testing and Building Android

View assertions assertBaselineAlignedassertBotomAligned assertGroupContains assertGroupIntegrity assertGroupNotContains

Page 59: Testing and Building Android

View assertions assertBaselineAlignedassertBotomAligned assertGroupContains assertGroupIntegrity assertGroupNotContains assertHasScreenCoordinates

Page 60: Testing and Building Android

View assertions assertBaselineAlignedassertBotomAligned assertGroupContains assertGroupIntegrity assertGroupNotContains assertHasScreenCoordinates assertHorizontalCenterAligned

Page 61: Testing and Building Android

View assertions assertLeftAligned

Page 62: Testing and Building Android

View assertions assertLeftAligned assertOffScreenAbove

Page 63: Testing and Building Android

View assertions assertLeftAligned assertOffScreenAbove assertOffScreenBelow

Page 64: Testing and Building Android

View assertions assertLeftAligned assertOffScreenAbove assertOffScreenBelow assertOnScreen

Page 65: Testing and Building Android

View assertions assertLeftAligned assertOffScreenAbove assertOffScreenBelow assertOnScreen assertRightAligned

Page 66: Testing and Building Android

View assertions assertLeftAligned assertOffScreenAbove assertOffScreenBelow assertOnScreen assertRightAligned assertTopAligned

Page 67: Testing and Building Android

View assertions assertLeftAligned assertOffScreenAbove assertOffScreenBelow assertOnScreen assertRightAligned assertTopAligned assertVerticalCenterAligned

Page 68: Testing and Building Android

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: Testing and Building Android

Even more assertions assertAssignableFrom

Page 70: Testing and Building Android

Even more assertions assertAssignableFrom

assertContainsRegex

Page 71: Testing and Building Android

Even more assertions assertAssignableFrom

assertContainsRegex assertContainsInAnyOrder

Page 72: Testing and Building Android

Even more assertions assertAssignableFrom

assertContainsRegex assertContainsInAnyOrder assertContainsInOrder

Page 73: Testing and Building Android

Even more assertions assertAssignableFrom

assertContainsRegex assertContainsInAnyOrder assertContainsInOrder assertEmpty

Page 74: Testing and Building Android

Even more assertions assertAssignableFrom

assertContainsRegex assertContainsInAnyOrder assertContainsInOrder assertEmpty assertEquals

Page 75: Testing and Building Android

Even more assertions assertMatchesRegex

Page 76: Testing and Building Android

Even more assertions

assertMatchesRegex assertNotContainsRegex

Page 77: Testing and Building Android

Even more assertions

assertMatchesRegex assertNotContainsRegex assertNotEmpty

Page 78: Testing and Building Android

Even more assertions

assertMatchesRegex assertNotContainsRegex assertNotEmpty assertNotMatchesRegex

Page 79: Testing and Building Android

Even more assertions

assertMatchesRegex assertNotContainsRegex assertNotEmpty assertNotMatchesRegex checkEqualsAndHashCodeMethods

Page 80: Testing and Building Android

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: Testing and Building Android

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: Testing and Building Android

assertReadingContentUriRequiresPermission

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

Page 83: Testing and Building Android

assertWritingContentUriRequiresPermission

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

Page 84: Testing and Building Android

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: Testing and Building Android

Example project

Page 86: Testing and Building Android

SummaryUsed several types of assertion Explained mock objects Exemplified different tests

Page 87: Testing and Building Android

Test Driven Development

Page 88: Testing and Building Android

Test Driven Development

Page 89: Testing and Building Android

Test Driven Development • Difficult to divert code • Focus

NO SILVER BULLET

Page 90: Testing and Building Android

Example project - temperature converter

Page 91: Testing and Building Android

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: Testing and Building Android

Concept design

Page 93: Testing and Building Android

Create projects

Page 94: Testing and Building Android

From requirement to tests

Page 95: Testing and Building Android

AVD and Emulator Options

Page 96: Testing and Building Android

Headless emulator

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

Page 97: Testing and Building Android

Monkeyrunner

Page 98: Testing and Building Android

Building with ant android update project —path .

Page 99: Testing and Building Android

Jenkins

Page 100: Testing and Building Android

Testing recipes

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

Thank you !

+ Enrique López Mañas

@eenriquelopez