Agile Entwicklung für iOS und Android - xpdays.de · © 2015 andrena objects ag 1 Agile...

54
© 2015 andrena objects ag 1 Agile Entwicklung für iOS und Android Ilja Mutschnik und Simon Hartmann XPDays Germany 2015

Transcript of Agile Entwicklung für iOS und Android - xpdays.de · © 2015 andrena objects ag 1 Agile...

© 2015 andrena objects ag

1

Agile Entwicklung für iOS und AndroidIlja Mutschnik und Simon Hartmann

XPDays Germany 2015

© 2015 andrena objects ag

2

Agile DevelopmentObjective-C

Swift

Testing

Continuous Integration

Scrum

Clean Code

AppCode

Xcode

Nutzer Feedback

Code Metriken

TDD

Java

Android Studio

Continuous Deployment

© 2015 andrena objects ag

3

Agenda

1.Der App-Markt 1. „There’s an app for that!" 2. Agil für Mobil: Ein Überblick

2.Der Prozess: Wie nutzen wir ihn am besten? 1. UI/UX, Developer, Designer … und der Flow 2. Frühes Testen und die Kundeneinbeziehung 3. Kurze Zyklen: Continuous Integration und Deployment

3.Das Produkt: Wie kommt die Qualität in den Code? 1. Code Metriken 2. Tests und die Teststrategie 3. Refactoring

© 2015 andrena objects ag

4

Agile Entwicklung für iOS und Android

1.Der App-Markt oder „There’s an app for that!" 1. „There’s an app for that!" 2. Agil für Mobil: Ein Überblick

2.Der Prozess: Wie nutzen wir ihn am besten? 1. UI/UX, Developer, Designer … und der Flow 2. Frühes Testen und die Kundeneinbeziehung 3. Kurze Zyklen: Continuous Integration und Deployment

3.Das Produkt: Wie kommt die Qualität in den Code? 1. Code Metriken 2. Tests und die Teststrategie 3. Refactoring

© 2015 andrena objects ag

5

App-Markt: Kein Ende des Wachstums

© 2015 andrena objects ag

6

Also: Hauptsache Geschwindigkeit? Nein!

Stellenausschreibung eines großen App-Hersteller:

Skills & Requirements […]

Testing - Honestly, our code coverage is a little lacking. We'd love your help to change this.[…]

© 2015 andrena objects ag

7

Agile Entwicklung für iOS und Android

1.Der App-Markt oder „There’s an app for that!" 1. „There’s an app for that!" 2. Agil für Mobil: Ein Überblick

2.Der Prozess: Wie nutzen wir ihn am besten? 1. UI/UX, Developer, Designer … und der Flow 2. Frühes Testen und die Kundeneinbeziehung 3. Kurze Zyklen: Continuous Integration und Deployment

3.Das Produkt: Wie kommt die Qualität in den Code? 1. Code Metriken 2. Tests und die Teststrategie 3. Refactoring

© 2015 andrena objects ag

8

Der Scrum Flow

SPRINT

2-4 weeks24 hours

Product Backlog

Sprint Backlog

Product Increment

© 2015 andrena objects ag

• Kurze Zyklen • App muss nicht gleich gesamten Umfang haben

(Unterscheidung: public / in-house) • wenige bis keine überflüssigen Funktionen durch

schnelles Feedback • Kommunikation im Team und mit dem Kunden • Wer ist Kunde? Wie können wir mit „ihm“ sprechen? • Keine ausgelagerte Entwicklung

• Continuous Deployment mit hoher Automatisation nutzen

9

Die wichtigsten Aspekte

© 2015 andrena objects ag

• Sehr schnelllebiger Markt

• Technologien • Geräte • Nutzerverhalten • Design

• hoher Anspruch an Qualität und Design • App Store / Google Play als einziger Verkaufskanal (v.a.

iOS)

10

Was sind die Besonderheiten der mobilen Entwicklung?

© 2015 andrena objects ag

11

Ok, und wie machen wir es richtig?

QualitätCode MetrikenRefactoring

Clean Code

Design Patterns…

kurze Entwicklungszyklenenger Kundenkontakt

Scrum

fast feedback iterative Planung

Cont. Integration & Deployment

richtige Frameworks und Tools

Extreme Programming

Tests

© 2015 andrena objects ag

12

Agile Entwicklung für iOS und Android

1.Der App-Markt oder „There’s an app for that!" 1. „There’s an app for that!" 2. Agil für Mobil: Ein Überblick

2.Der Prozess: Wie nutzen wir ihn am besten? 1. UI/UX, Developer, Designer … und der Flow 2. Frühes Testen und die Kundeneinbeziehung 3. Kurze Zyklen: Continuous Integration und Deployment

3.Das Produkt: Wie kommt die Qualität in den Code? 1. Code Metriken 2. Tests und die Teststrategie 3. Refactoring

© 2015 andrena objects ag

13

User Experience: Developer und Designer

Agile iOS Stewart Gleadow @stewgleadow

© 2015 andrena objects ag

14

User Experience: Developer und Designer

Agile iOS Stewart Gleadow @stewgleadow

© 2015 andrena objects ag

15

Der Anfang: Von der Idee zum Design

Mockup Implementierung…schleife Design 1.0

© 2015 andrena objects ag

16

Es geht besser…

Mockup Design-Prototyp Implementierung

© 2015 andrena objects ag

17

Es geht besser…

+Sketch

Schnelles UI DesignLive Preview auf realem Device

Klick-Dummy aus Sketch

© 2015 andrena objects ag

18

Agile Entwicklung für iOS und Android

1.Der App-Markt oder „There’s an app for that!" 1. „There’s an app for that!" 2. Agil für Mobil: Ein Überblick

2.Der Prozess: Wie nutzen wir ihn am besten? 1. UI/UX, Developer, Designer … und der Flow 2. Frühes Testen und die Kundeneinbeziehung 3. Kurze Zyklen: Continuous Integration und Deployment

3.Das Produkt: Wie kommt die Qualität in den Code? 1. Code Metriken 2. Tests und die Teststrategie 3. Refactoring

© 2015 andrena objects ag

19

Kundeneinbeziehung

Wie erhalten wir Kundenfeedback?

Direktes FeedbackPersönlicher Kontakt mit PO

Tester „live“ beobachtenFeedbackoption in der App

Store Reviews

Indirektes FeedbackBeta-VerteilungCrashreports

Mobile Analytics

© 2015 andrena objects ag

20

Feedback Frameworks: Wunschkriterien

• Crashreports• Beta-Verteilung• Analytics (je nach Projekt)• Unterstützung von iOS und Android• Kostengünstig

© 2015 andrena objects ag

21

Kundeneinbeziehung

https://www.crashlytics.com/ www.google.com/analytics/mobile/

© 2015 andrena objects ag

22

Crashlytics

Desktop Integration

Beta Verteilung User Statistics + Event tracking

© 2015 andrena objects ag

23

Crashlytics: Crashreports

© 2015 andrena objects ag

24

Google Analytics: Genauere Benutzerdaten

© 2015 andrena objects ag

25

Agile Entwicklung für iOS und Android

1.Der App-Markt oder „There’s an app for that!" 1. „There’s an app for that!" 2. Agil für Mobil: Ein Überblick

2.Der Prozess: Wie nutzen wir ihn am besten? 1. UI/UX, Developer, Designer … und der Flow 2. Frühes Testen und die Kundeneinbeziehung 3. Kurze Zyklen: Continuous Integration und Deployment

3.Das Produkt: Wie kommt die Qualität in den Code? 1. Code Metriken 2. Tests und die Teststrategie 3. Refactoring

© 2015 andrena objects ag

26

Continuous Integration iOS

Xcode Server Jenkins

Einrichtung ++ o

Wartung + o

Anpassung - ++

Automatisches Deployment

++ ++

Git Branches/Tags +/- +/+

Feedback ++ (Xcode Integration)

++

© 2015 andrena objects ag

27

Xcode: Bot Einstellungen

© 2015 andrena objects ag

28

Continuous Delivery iOS: Fastlane

© 2015 andrena objects ag

29

Continuous Delivery iOS: Fastlane platform :ios do before_all do ensure_git_status_clean end

lane :beta do sigh

ipa( configuration: "Beta", scheme: "Wikipedia Beta", )

deliver end

lane :store do snapshot sigh

ipa( configuration: "Wikipedia", scheme: "Wikipedia", ) deliver end

end

© 2015 andrena objects ag

30

Continuous Integration: Android

Vorteile:1. Viele Plugins2. Kostenlos3. Große Community

Jenkins

© 2015 andrena objects ag

31

Agile Entwicklung für iOS und Android

1.Der App-Markt oder „There’s an app for that!" 1. „There’s an app for that!" 2. Agil für Mobil: Ein Überblick

2.Der Prozess: Wie nutzen wir ihn am besten? 1. UI/UX, Developer, Designer … und der Flow 2. Frühes Testen und die Kundeneinbeziehung 3. Kurze Zyklen: Continuous Integration und Deployment

3.Das Produkt: Wie kommt die Qualität in den Code? 1. Code Metriken 2. Tests und die Teststrategie 3. Refactoring

© 2015 andrena objects ag

32

Wie messen wir Softwarequalität?

© 2015 andrena objects ag

33

andrena objects: Messung der Qualität mit SQI

Aus den Indikatormetriken wird der Softwarequalitätsindex (SQI) berechnet

https://www.andrena.de/code-assessment

© 2015 andrena objects ag

34

Wichtige Metriken und Tests

Static Analysis

Zyklische Abhängigkeit

UI Tests Code CoverageUnit Tests

Zyklomatische Komplexität Code Duplications

Methodenlänge

© 2015 andrena objects ag

35

Objective C: Jenkins + Toolset

Static Analysis

Zyklische Abhängigkeit

UI Tests Code CoverageUnit Tests

xcodebuild, ocunit2junit

OCLint, Clang, hfcca, objc_dep, Graphviz + Eigenentwicklung

gcovrUIAutomation, Appium, …

© 2015 andrena objects ag

36

Swift: Lokal und auf Xcode Server

SonarQube: ca. 90 Metriken (alle oben) - 5000 EUR Lizenz - (online demo) Tailor: Static Analyzer (26 Regeln) SwiftLint: „A tool to enforce Swift style and conventions.“

Static Analysis

Zyklische Abhängigkeit

UI Tests Code CoverageUnit Tests

Zykl. Komplexität Duplications Methodenlänge

Xcode Xcode Xcode

© 2015 andrena objects ag

37

Android

Static Analysis

Zyklische Abhängigkeit

UI Tests Code CoverageUnit Tests

Zykl. Komplexität Duplications Methodenlänge

Robolectric, JUnit Espresso, Spoon JaCoCo

Android Lint Android Studio

© 2015 andrena objects ag

38

Agile Entwicklung für iOS und Android

1.Der App-Markt oder „There’s an app for that!" 1. „There’s an app for that!" 2. Agil für Mobil: Ein Überblick

2.Der Prozess: Wie nutzen wir ihn am besten? 1. UI/UX, Developer, Designer … und der Flow 2. Frühes Testen und die Kundeneinbeziehung 3. Kurze Zyklen: Continuous Integration und Deployment

3.Das Produkt: Wie kommt die Qualität in den Code? 1. Code Metriken 2. Tests und die Teststrategie 3. Refactoring

© 2015 andrena objects ag

39

Mobile: Wichtige Aspekte beim Testen

• Unterschiedliche Geräte • Test: Mix aus Simulator und echten Geräten • Viele Variablen beim Nutzer

• Netzwerk-Verfügbarkeit • Displaygrößen • OS-Versionen • Hardware-Rechte(!)

© 2015 andrena objects ag

40

Teststrategien: Die klassische Testpyramide

© 2015 andrena objects ag

41

Teststrategie: Die mobile Testpyramide

Unit Tests

Beta Tester

autom. UI Tests

Integrations-/Akzeptanztestsz.B. Schnittstellen

Klassen, Methoden

© 2015 andrena objects ag

• Swift 2: @testable • Test-Framework empfehlenswert für

• bessere Lesbarkeit • bessere Strukturierung der Tests • aussagekräftigere Fehlermeldungen

42

Unit Test (iOS)

- XCTAssertTrue(contains(sillyMonkeys, kiki), "Expected sillyMonkeys to contain 'Kiki'")

+ expect(sillyMonkeys).to(contain(kiki))// Nimble

© 2015 andrena objects ag

43

Unit-Tests (iOS): Quick (BDD)

import Quick import Nimble

class TableOfContentsSpec: QuickSpec { override func spec() { describe("the 'Documentation' directory") { it("has everything you need to get started") { let sections = Directory("Documentation").sections expect(sections).to(contain("Installing Quick")) }

context("if it doesn't have what you're looking for") { it("needs to be updated") { let you = You(awesome: true) expect{you.submittedAnIssue}.toEventually(beTruthy()) } } } } }

© 2015 andrena objects ag

44

Unit-Tests (iOS): Code Coverage Xcode Integration

© 2015 andrena objects ag

45

Unit Test (android): RobolectricProblem: Ausführung der Unit-Tests auf einem Gerät bzw. Emulator dauert sehr lange

Lösung: Robolectric -> Tests laufen auf JVM -> Implementierungen für android.jar-Classen

@RunWith(RobolectricGradleTestRunner.class) public class SomeActivityTest {

private SomeActivity activity;

@Before public void before() { activity = Robolectric.buildActivity(SomeActivity.class).create().get(); } @Test public void buttonClickShouldStartNewActivity() { … Intent intent = Robolectric.shadowOf(activity).peekNextStartedActivity(); … assertEquals(OtherActivity.class.getCanonicalName(), intent.getComponent().getClassName()); } }

© 2015 andrena objects ag

46

Unit Test (android): Mockito und Hamcrest Matchers

@RunWith(RobolectricGradleTestRunner.class) public class SomeActivityTest {

@Mock private DbManager dbManager;

@Before public void before() { MockitoAnnotations.initMocks(this); } @Test public void buttonClickShouldStartNewActivity() { when(dbManager.getEntryForId(„42“)).thenReturn(„Max Mustermann“)

//do something with dbManager mock

assertThat(dbManager.getEntryForId(„42“), is(equalTo(„Max Mustermann“))); verify(dbManager).getEntryForId(Matchers.eq(42)); ;}

© 2015 andrena objects ag

47

UI Test (android): Espresso

Automatische Synchronisation mit UI

Einfache API •auswählen: onView(Matcher<View>) •ausführen: perform(ViewAction) •prüfen: check(ViewAssertion)

Beispiel:

onView(withId(R.id.button)) .perform(click()); onView(withId(R.id.textView)) .check(matches(withText(„abc“)));

© 2015 andrena objects ag

48

Agile Entwicklung für iOS und Android

1.Der App-Markt oder „There’s an app for that!" 1. „There’s an app for that!" 2. Agil für Mobil: Ein Überblick

2.Der Prozess: Wie nutzen wir ihn am besten? 1. UI/UX, Developer, Designer … und der Flow 2. Frühes Testen und die Kundeneinbeziehung 3. Kurze Zyklen: Continuous Integration und Deployment

3.Das Produkt: Wie kommt die Qualität in den Code? 1. Code Metriken 2. Tests und die Teststrategie 3. Refactoring

© 2015 andrena objects ag

49

iOS: Die Entwicklungssprache

Objective-C

© 2015 andrena objects ag

50

iOS: Die Entwicklungsumgebung

© 2015 andrena objects ag

51

AppCode (JetBrains)

+ -Sehr gutes Refactoring (ObjC) kein kompletter Workflow

UI anpassbar noch: Kein Refactoring von Swift Code

Plugins

auto imports

Quickfixes

„Code inspections“

© 2015 andrena objects ag

52

IDE: Die Lösung (… hoffentlich bald wieder)

Xcode

Konfiguration Interface Builder

CoreData UI Debugging

UI Tests

+

AppCode

Development Refactoring Debugging

© 2015 andrena objects ag

53

Android: Die Entwicklungsumgebung

© 2015 andrena objects ag

54

Danke für die Aufmerksamkeit

Fragen