GTDD Testgetriebene Entwicklung mit Groovyalt.java-forum-stuttgart.de/jfs/2007/folien/C6.pdf ·...

34
GTDD Testgetriebene Entwicklung mit Groovy Bernd Schiffer [email protected] Mitarbeit: Stefan Roock [email protected]

Transcript of GTDD Testgetriebene Entwicklung mit Groovyalt.java-forum-stuttgart.de/jfs/2007/folien/C6.pdf ·...

Page 1: GTDD Testgetriebene Entwicklung mit Groovyalt.java-forum-stuttgart.de/jfs/2007/folien/C6.pdf · 2007-07-06 · Demo: Live SMS-Feedback Groovy == cool Pupsi, ich liebe Dich!!! ...

GTDD

Testgetriebene Entwicklung mit

Groovy

Bernd Schiffer

[email protected]

Mitarbeit: Stefan Roock

[email protected]

Page 2: GTDD Testgetriebene Entwicklung mit Groovyalt.java-forum-stuttgart.de/jfs/2007/folien/C6.pdf · 2007-07-06 · Demo: Live SMS-Feedback Groovy == cool Pupsi, ich liebe Dich!!! ...

GTDD – Schiffer, Roock 2007 2

+49 172 44 256 68

Herzlich Willkommen!Stefan Roock

� akquinet AG

� Coach für agile Methoden, Projektleiter, Softwarearchitekt

� XP, Scrum, Akzeptanztests, TDD, Refactoring …

Bernd Schiffer

� akquinet AG

� Softwareentwickler

� XP, Scrum, TDD, Groovy, Grails

Page 3: GTDD Testgetriebene Entwicklung mit Groovyalt.java-forum-stuttgart.de/jfs/2007/folien/C6.pdf · 2007-07-06 · Demo: Live SMS-Feedback Groovy == cool Pupsi, ich liebe Dich!!! ...

GTDD – Schiffer, Roock 2007 3

+49 172 44 256 68

Was Sie heute erwartet� TDD und GTDD im Mix

� algorithmisches Beispiel

� OO-Beispiel

� Mocks unter Groovy

+ =

Page 4: GTDD Testgetriebene Entwicklung mit Groovyalt.java-forum-stuttgart.de/jfs/2007/folien/C6.pdf · 2007-07-06 · Demo: Live SMS-Feedback Groovy == cool Pupsi, ich liebe Dich!!! ...

GTDD – Schiffer, Roock 2007 4

+49 172 44 256 68

Demo: Live SMS-Feedback

Groovy == cool

Pupsi, ich liebe Dich!!!

Closures???

Groovy• Feature Rich• Java Friendly• …

Page 5: GTDD Testgetriebene Entwicklung mit Groovyalt.java-forum-stuttgart.de/jfs/2007/folien/C6.pdf · 2007-07-06 · Demo: Live SMS-Feedback Groovy == cool Pupsi, ich liebe Dich!!! ...

GTDD – Schiffer, Roock 2007 5

+49 172 44 256 68

TDD: Der Zyklus Red-Green-Refactor

Test schreiben(schlägt fehl)

Produktivcodeimplementieren

(Test läuft erfolg-reich durch)

Refaktorisieren

1

2

3

� Test-Driven Development

� Test-Driven Design

Page 6: GTDD Testgetriebene Entwicklung mit Groovyalt.java-forum-stuttgart.de/jfs/2007/folien/C6.pdf · 2007-07-06 · Demo: Live SMS-Feedback Groovy == cool Pupsi, ich liebe Dich!!! ...

GTDD – Schiffer, Roock 2007 6

+49 172 44 256 68

TDD: Zyklus im Detail

Page 7: GTDD Testgetriebene Entwicklung mit Groovyalt.java-forum-stuttgart.de/jfs/2007/folien/C6.pdf · 2007-07-06 · Demo: Live SMS-Feedback Groovy == cool Pupsi, ich liebe Dich!!! ...

GTDD – Schiffer, Roock 2007 7

+49 172 44 256 68

Beispiel im Kleinen

class CaesarChiffreConverterTest

extends GroovyTestCase {

void

testMovesTextOneStepForward() {

assertEquals('b',

new CaesarChiffreConverter()

.convert('a'))

}

}

class CaesarChiffreConverter{

def convert(string) {}

}

Quelle der Darstellungsidee: Robert C. "Uncle Bob" Martin

expected:<b> but was:<null>

1

Page 8: GTDD Testgetriebene Entwicklung mit Groovyalt.java-forum-stuttgart.de/jfs/2007/folien/C6.pdf · 2007-07-06 · Demo: Live SMS-Feedback Groovy == cool Pupsi, ich liebe Dich!!! ...

GTDD – Schiffer, Roock 2007 8

+49 172 44 256 68

Beispiel im Kleinen

class CaesarChiffreConverterTest

extends GroovyTestCase {

void

testMovesTextOneStepForward() {

assertEquals('b',

new CaesarChiffreConverter()

.convert('a'))

}

}

class CaesarChiffreConverter{

def convert(string) { 'b' }

}

Quelle der Darstellungsidee: Robert C. "Uncle Bob" Martin

2

Page 9: GTDD Testgetriebene Entwicklung mit Groovyalt.java-forum-stuttgart.de/jfs/2007/folien/C6.pdf · 2007-07-06 · Demo: Live SMS-Feedback Groovy == cool Pupsi, ich liebe Dich!!! ...

GTDD – Schiffer, Roock 2007 9

+49 172 44 256 68

Beispiel im Kleinen

class CaesarChiffreConverterTest

extends GroovyTestCase {

void

testMovesTextOneStepForward() {

assertEquals('b',

new CaesarChiffreConverter()

.convert('a'))

}

}

class CaesarChiffreConverter{

def convert(string) {

'' + (char) ((int) string[0] + 1)

}

}

Quelle der Darstellungsidee: Robert C. "Uncle Bob" Martin

3

Page 10: GTDD Testgetriebene Entwicklung mit Groovyalt.java-forum-stuttgart.de/jfs/2007/folien/C6.pdf · 2007-07-06 · Demo: Live SMS-Feedback Groovy == cool Pupsi, ich liebe Dich!!! ...

GTDD – Schiffer, Roock 2007 10

+49 172 44 256 68

Beispiel im Kleinen

class CaesarChiffreConverterTest

extends GroovyTestCase {

void

testMovesTextOneStepForward() {

assertEquals('b',

new CaesarChiffreConverter()

.convert('a'))

assertEquals('bc',

new CaesarChiffreConverter()

.convert('ab'))

}

}

class CaesarChiffreConverter{

def convert(string) {

'' + (char) ((int) string[0] + 1)

}

}

Quelle der Darstellungsidee: Robert C. "Uncle Bob" Martin

4

Page 11: GTDD Testgetriebene Entwicklung mit Groovyalt.java-forum-stuttgart.de/jfs/2007/folien/C6.pdf · 2007-07-06 · Demo: Live SMS-Feedback Groovy == cool Pupsi, ich liebe Dich!!! ...

GTDD – Schiffer, Roock 2007 11

+49 172 44 256 68

Beispiel im Kleinen

class CaesarChiffreConverterTest

extends GroovyTestCase {

void

testMovesTextOneStepForward() {

assertEquals('b',

new CaesarChiffreConverter()

.convert('a'))

assertEquals('bc',

new CaesarChiffreConverter()

.convert('ab'))

}

}

class CaesarChiffreConverter{

def convert(string) {

string.collect{

(char) ((int) it + 1)

}.join()

}

}

Quelle der Darstellungsidee: Robert C. "Uncle Bob" Martin

5

Page 12: GTDD Testgetriebene Entwicklung mit Groovyalt.java-forum-stuttgart.de/jfs/2007/folien/C6.pdf · 2007-07-06 · Demo: Live SMS-Feedback Groovy == cool Pupsi, ich liebe Dich!!! ...

GTDD – Schiffer, Roock 2007 12

+49 172 44 256 68

Beispiel im Kleinen

class CaesarChiffreConverterTest

extends GroovyTestCase {

void

testMovesTextOneStepForward() {

assertEquals('b',

new CaesarChiffreConverter()

.convert('a'))

assertEquals('bc',

new CaesarChiffreConverter()

.convert('ab'))

}

}

class CaesarChiffreConverter{

def convert(string) {

string.collect{

(char) ((int) it + 1)

}.join()

}

}

Quelle der Darstellungsidee: Robert C. "Uncle Bob" Martin

6

Page 13: GTDD Testgetriebene Entwicklung mit Groovyalt.java-forum-stuttgart.de/jfs/2007/folien/C6.pdf · 2007-07-06 · Demo: Live SMS-Feedback Groovy == cool Pupsi, ich liebe Dich!!! ...

GTDD – Schiffer, Roock 2007 13

+49 172 44 256 68

GroovyTestCase� basiert noch auf JUnit 3.8.1

� in Groovy 1.1 Support für Annotations � JUnit 4 und TestNG

� groovy IrgendEinTest.groovy � JUnits Text-UI

� mit GroovyTestSuite kompilierbar und in Java ausführbar

� mit Groovy Javacode testen!

� mit groovy.util.AllTestSuite in IDE verwenden

� Aufsammeln und Ausführen aller Tests!

Quelle: teilw. http://groovy.codehaus.org/Unit+Testing

Page 14: GTDD Testgetriebene Entwicklung mit Groovyalt.java-forum-stuttgart.de/jfs/2007/folien/C6.pdf · 2007-07-06 · Demo: Live SMS-Feedback Groovy == cool Pupsi, ich liebe Dich!!! ...

GTDD – Schiffer, Roock 2007 14

+49 172 44 256 68

GroovyTestCase� zusätzliche Methoden

� assertArrayEquals(Object[] expected, Object[] value)

� assertLength(int length, char[] array)

� assertLength(int length, int[] array)

� assertLength(int length, Object[] array)

� assertContains(char expected, char[] array)

� assertContains(int expected, int[] array)

� assertToString(Object value, String expected)

� assertInspect(Object value, String expected)

� assertScript(String script)

� shouldFail(Closure code)

� shouldFail(Class clazz, Closure code) Quelle: teilw. http://groovy.codehaus.org/Unit+Testing

Echte Perlen!Echte Perlen!

Page 15: GTDD Testgetriebene Entwicklung mit Groovyalt.java-forum-stuttgart.de/jfs/2007/folien/C6.pdf · 2007-07-06 · Demo: Live SMS-Feedback Groovy == cool Pupsi, ich liebe Dich!!! ...

GTDD – Schiffer, Roock 2007 15

+49 172 44 256 68

Dem Kind einen Namen geben� Benennungsschema für Tests ist wichtig.

� Klasse CaesarChiffreConverter wird getestet von

CaesarChiffreConverterTest

� Testmethodename ergibt mit Testklassenname einen Satz:

class CaesarChiffreConverterTest {

void testMovesTextOneStepForward() {...} }

ergibt Satz:

Caesar Chiffre converter (Test) (test) moves text one step forward.

� Tests sind so verständlich, dass man aus Ihnen die Benutzung

der getesteten Klassen ablesen kann.

Page 16: GTDD Testgetriebene Entwicklung mit Groovyalt.java-forum-stuttgart.de/jfs/2007/folien/C6.pdf · 2007-07-06 · Demo: Live SMS-Feedback Groovy == cool Pupsi, ich liebe Dich!!! ...

GTDD – Schiffer, Roock 2007 16

+49 172 44 256 68

� Ideal: Wenn sich Fachlogik ändert,

schlägt genau ein Test fehl.

� Praxis: Wenn sich Fachlogik ändert,

schlagen wenige Tests fehl.

� Voraussetzung: Entkopplung!

Gute Tests

Page 17: GTDD Testgetriebene Entwicklung mit Groovyalt.java-forum-stuttgart.de/jfs/2007/folien/C6.pdf · 2007-07-06 · Demo: Live SMS-Feedback Groovy == cool Pupsi, ich liebe Dich!!! ...

GTDD – Schiffer, Roock 2007 17

+49 172 44 256 68

TDDesign� Spezifikation

statt

Verifikation

Page 18: GTDD Testgetriebene Entwicklung mit Groovyalt.java-forum-stuttgart.de/jfs/2007/folien/C6.pdf · 2007-07-06 · Demo: Live SMS-Feedback Groovy == cool Pupsi, ich liebe Dich!!! ...

GTDD – Schiffer, Roock 2007 18

+49 172 44 256 68

Quick Design Session� alleine, im Pair, im Team

� Erfahrung nutzen (auch von Externen!),

sonst Fehler

� BDUF im Groben

� Anforderungen erörtern

� Namen überlegen

� Pattern-Einsatz erwägen

Page 19: GTDD Testgetriebene Entwicklung mit Groovyalt.java-forum-stuttgart.de/jfs/2007/folien/C6.pdf · 2007-07-06 · Demo: Live SMS-Feedback Groovy == cool Pupsi, ich liebe Dich!!! ...

GTDD – Schiffer, Roock 2007 19

+49 172 44 256 68

Demo: Systemarchitektur

Mobilfunk-netz

UMTS-Karte

SMS-Software

SMS-DB(Textfile)

SMS-Feedback-

Viewer

Notebook

Datenfluss

Page 20: GTDD Testgetriebene Entwicklung mit Groovyalt.java-forum-stuttgart.de/jfs/2007/folien/C6.pdf · 2007-07-06 · Demo: Live SMS-Feedback Groovy == cool Pupsi, ich liebe Dich!!! ...

GTDD – Schiffer, Roock 2007 20

+49 172 44 256 68

Upfront-Design

SMS-DB

SmsRepository

SmsReader

SmsViewer UI Layer

Domain Layer

Data Layer

3 Schichten-Architektur

Jede Menge Testprobleme!(Erfahrung!!)

Page 21: GTDD Testgetriebene Entwicklung mit Groovyalt.java-forum-stuttgart.de/jfs/2007/folien/C6.pdf · 2007-07-06 · Demo: Live SMS-Feedback Groovy == cool Pupsi, ich liebe Dich!!! ...

GTDD – Schiffer, Roock 2007 21

+49 172 44 256 68

Entkopplung via TDD und Mocks

SmsReader

<<Interface>>SmsDisplay

<<Interface>>SmsDatabase

SmsReaderTest

Impl/Mock Impl/Mock

Page 22: GTDD Testgetriebene Entwicklung mit Groovyalt.java-forum-stuttgart.de/jfs/2007/folien/C6.pdf · 2007-07-06 · Demo: Live SMS-Feedback Groovy == cool Pupsi, ich liebe Dich!!! ...

GTDD – Schiffer, Roock 2007 22

+49 172 44 256 68

Design via TDDevelopment

SMS-DB

SmsReader

ConsoleSmsDisplay

UI Layer

Domain Layer

Data Layer

<<Interface>>SmsDisplay

<<Interface>>SmsDatabase

VodafoneMobileClientSmsDatabase

Page 23: GTDD Testgetriebene Entwicklung mit Groovyalt.java-forum-stuttgart.de/jfs/2007/folien/C6.pdf · 2007-07-06 · Demo: Live SMS-Feedback Groovy == cool Pupsi, ich liebe Dich!!! ...

GTDD – Schiffer, Roock 2007 23

+49 172 44 256 68

SmsReaderTest – Der Codeclass SmsReaderTest extends GroovyTestCase {

void testShowsMessages() {

def control = EasyMock.createControl()

def database = control.createMock(SmsDatabase.class)

def display = control.createMock(SmsDisplay.class)

def reader = new SmsReader(display:display, database:database)

def smsList = [new Sms(phone:"1",message:"m1"),new Sms(phone:"2",message:"m2")]

EasyMock.expect(database.readSms()).andReturn(smsList)

EasyMock.expect(display.display(smsList[0]))

EasyMock.expect(display.display(smsList[1]))

control.replay()

reader.showSms()

control.verify()

} /* ... */ }

Page 24: GTDD Testgetriebene Entwicklung mit Groovyalt.java-forum-stuttgart.de/jfs/2007/folien/C6.pdf · 2007-07-06 · Demo: Live SMS-Feedback Groovy == cool Pupsi, ich liebe Dich!!! ...

GTDD – Schiffer, Roock 2007 24

+49 172 44 256 68

SmsReader – Der Codeclass SmsReader {

SmsDatabase database

SmsDisplay display

def showSms() {

def someSms = database.readSms()

someSms.each{sms ->

display.display(sms)

}

}

}

Page 25: GTDD Testgetriebene Entwicklung mit Groovyalt.java-forum-stuttgart.de/jfs/2007/folien/C6.pdf · 2007-07-06 · Demo: Live SMS-Feedback Groovy == cool Pupsi, ich liebe Dich!!! ...

GTDD – Schiffer, Roock 2007 25

+49 172 44 256 68

Test-Frameworks� JUnit + EasyMock ist super!

� Beispiele für Groovy und anderen Mock-Frameworks unterhttp://groovy.codehaus.org/Testing+Guide

� GSpec

� Instinct

� JBehave

� JDummy

� JMock

� JMockit

� Popper

� RMock

� TestNG

Page 26: GTDD Testgetriebene Entwicklung mit Groovyalt.java-forum-stuttgart.de/jfs/2007/folien/C6.pdf · 2007-07-06 · Demo: Live SMS-Feedback Groovy == cool Pupsi, ich liebe Dich!!! ...

GTDD – Schiffer, Roock 2007 26

+49 172 44 256 68

Maps statt Mocksclass Auto {

def motor

def getMotor() {

pruefeDies(motor)

pruefeDas(motor)

motor

}

void pruefeDies(motor) { /*...*/ }

void pruefeDas(motor) { /*...*/ }}

class MotorMock { /*...*/ }

class Motor { /*...*/ }

// echtes Objekt

new Auto(motor:new Motor()).motor

// Mock

[motor:new MotorMock()].motor

siehe http://groovy.codehaus.org/Developer+Testing+using+Maps+and+Expandos+instead+of+Mocks

Page 27: GTDD Testgetriebene Entwicklung mit Groovyalt.java-forum-stuttgart.de/jfs/2007/folien/C6.pdf · 2007-07-06 · Demo: Live SMS-Feedback Groovy == cool Pupsi, ich liebe Dich!!! ...

GTDD – Schiffer, Roock 2007 27

+49 172 44 256 68

Expandos statt Mocksclass Auto {

def starte() {

if(isHoechstUnwahrscheinlicherFall())

throw new Exception()

leiteStartprozedurEin()

}

def isHoechstUnwahrscheinlicherFall() {

/* ... */

}

}

// echtes Objekt

new Auto().starte()

// Mock

def autoMock =

new Expando()

autoMock.starte = {

throw

new Exception("erwartet")

}

autoMock.starte()

// � Exception!

siehe http://groovy.codehaus.org/Developer+Testing+using+Maps+and+Expandos+instead+of+Mocks

Page 28: GTDD Testgetriebene Entwicklung mit Groovyalt.java-forum-stuttgart.de/jfs/2007/folien/C6.pdf · 2007-07-06 · Demo: Live SMS-Feedback Groovy == cool Pupsi, ich liebe Dich!!! ...

GTDD – Schiffer, Roock 2007 28

+49 172 44 256 68

Closures statt Mocksinterface Auto {

def legeGangEin(gang)

def schalteWischer(stufe)

}

def legeGangEin =

{ gang -> assert gang == 1 }

def schalteWischer =

{ stufe -> assert stufe == 2 }

def autoMock =

[legeGangEin:legeGangEin,

schalteWischer:schalteWischer]

as Auto

autoMock.legeGangEin(1)

autoMock.schalteWischer(2)

siehe http://groovy.codehaus.org/Developer+Testing+using+Maps+and+Expandos+instead+of+Mocks

Page 29: GTDD Testgetriebene Entwicklung mit Groovyalt.java-forum-stuttgart.de/jfs/2007/folien/C6.pdf · 2007-07-06 · Demo: Live SMS-Feedback Groovy == cool Pupsi, ich liebe Dich!!! ...

GTDD – Schiffer, Roock 2007 29

+49 172 44 256 68

Behaviour-based vs. State-based Testing

� Verhaltensbasiert

� Protokoll definieren (Record-Phase)

� Verhalten auslösen (Replay-Phase)

� Protokoll checken (Verify-Phase)

EasyMock.expect(database.readSms()).andReturn(smsList)

EasyMock.expect(display.display(smsList[0]))

EasyMock.expect(display.display(smsList[1]))

control.replay()

reader.showSms()

control.verify()

Page 30: GTDD Testgetriebene Entwicklung mit Groovyalt.java-forum-stuttgart.de/jfs/2007/folien/C6.pdf · 2007-07-06 · Demo: Live SMS-Feedback Groovy == cool Pupsi, ich liebe Dich!!! ...

GTDD – Schiffer, Roock 2007 30

+49 172 44 256 68

Behaviour-based vs. State-based Testing

� Zustandsbasiert

� Signale und Input senden

� Zustand ermitteln

def result = new CaesarChiffreConverter().convert('ab')

assertEquals('bc', result)

Page 31: GTDD Testgetriebene Entwicklung mit Groovyalt.java-forum-stuttgart.de/jfs/2007/folien/C6.pdf · 2007-07-06 · Demo: Live SMS-Feedback Groovy == cool Pupsi, ich liebe Dich!!! ...

GTDD – Schiffer, Roock 2007 31

+49 172 44 256 68

� Groovy ist deutlich prägnanter als Java

� TDD führt zu entkoppelten Entwürfen

� Dependency-Inversion-Principle von Robert C. Martin

� Dependency-Injection, Inversion-of-Control

� Kurze Laufzeiten der Unittests (< 10 Sek. möglich)

� Eine Logikänderung verursacht wenige Testfehlschläge

Ein paar Worte zum Schluss

Page 32: GTDD Testgetriebene Entwicklung mit Groovyalt.java-forum-stuttgart.de/jfs/2007/folien/C6.pdf · 2007-07-06 · Demo: Live SMS-Feedback Groovy == cool Pupsi, ich liebe Dich!!! ...

GTDD – Schiffer, Roock 2007 32

+49 172 44 256 68

Lust bekommen auf mehr?� Groovy: http://groovy.codehaus.org

� Groovy-Mailinglisten: http://groovy.codehaus.org/Mailing+Lists

� Groovy Testing Guide:

http://groovy.codehaus.org/Testing+Guide

� Grails: http://grails.org/

� TDD: http://www.testdriven.com

� TDD-Mailingliste:

http://tech.groups.yahoo.com/group/testdrivendevelopment/

GTDD mit Webframework!

Page 33: GTDD Testgetriebene Entwicklung mit Groovyalt.java-forum-stuttgart.de/jfs/2007/folien/C6.pdf · 2007-07-06 · Demo: Live SMS-Feedback Groovy == cool Pupsi, ich liebe Dich!!! ...

GTDD – Schiffer, Roock 2007 33

+49 172 44 256 68

Lust bekommen auf mehr?

Page 34: GTDD Testgetriebene Entwicklung mit Groovyalt.java-forum-stuttgart.de/jfs/2007/folien/C6.pdf · 2007-07-06 · Demo: Live SMS-Feedback Groovy == cool Pupsi, ich liebe Dich!!! ...

GTDD – Schiffer, Roock 2007 34

+49 172 44 256 68

Noch Fragen?

Vielen Dank für die Aufmerksamkeit