Test Driven Development Large Scale

86
Test-Driven Development on a Large Scale Project

Transcript of Test Driven Development Large Scale

Page 1: Test Driven Development Large Scale

Test-Driven Development

on a

Large Scale Project

Page 2: Test Driven Development Large Scale

SpeakerJan Van Reusel

Page 3: Test Driven Development Large Scale

Speaker1997

Jan Van Reusel

Page 4: Test Driven Development Large Scale

Speaker1997 1999

Jan Van Reusel

Page 5: Test Driven Development Large Scale

Speaker1997 1999 2002

Jan Van Reusel

Page 6: Test Driven Development Large Scale

Speaker1997 1999 2002 2003 2003

Jan Van Reusel

Page 7: Test Driven Development Large Scale

SpeakerDevelopment Manager

Page 8: Test Driven Development Large Scale

SpeakerWhat keeps me awake

at night?

Page 9: Test Driven Development Large Scale

...sometimes...

Page 10: Test Driven Development Large Scale

...more often...

Page 11: Test Driven Development Large Scale

...summer 2005...

Page 12: Test Driven Development Large Scale

Load factor

0

2

4

6

8

10

12

05/05 07/05 09/05 11/05 01/06 03/06 05/06 07/06 09/06

...summer 2006...

Page 13: Test Driven Development Large Scale

This SessionWhat did we do about it?

Page 14: Test Driven Development Large Scale

ContextVentouris Renewal Program

Page 15: Test Driven Development Large Scale

Accountancy

Bailiff

Bank

Payments

• receive

• reassign

• reimburse

• Self-employed activity

• Look up and process income data

• Career data

• Continued insurance

Calculation

Family allowance

FCP

Self-employed

NISSE

• Discharge

• Pension

• Decease

• Failure (insurance)

• Normal suspension: request

• equalization

• continued insurance

Suspension

Request remission /

exemptionDebt administration

• Reminder

• Summons

• Subpoena

Affiliation

File

Modifications

Page 16: Test Driven Development Large Scale

608

3 year

100 my

customers team size

Page 17: Test Driven Development Large Scale

Application clients

Application Infrastructure

Presentation Layer

Service Layer

Domain Layer

Data Source Layer

<<Oracle>>

DatabaseFile System

HTML Browser Batch ClientWeb Service Client NISSE

<<JCAPS>>

BPEL Engine

<<POJO / MDB>>

NISSE Gateway

<<POJO / MDB>>

Batch Dispatcher

<<Session Bean>>

Application Services

<<POJO>>

Business Object

<<POJO / MDB>>

File Gateway

<<JDO>>

Domain Store

<<JESS>>

Rule Engine

<<POJO>>

Document Gateway

<<Scriptura>>

Document Generator

<<JSF>>

Web User Interface

Page 18: Test Driven Development Large Scale

Why TDD?

Design

Documentation

Scope

Trust

Page 19: Test Driven Development Large Scale

Unit

Integration (Java)

Exploratory (proxy) Integration (XML)

Exploratory (customer)

System

Alfa

Beta

Data conversion

Performance

Fail over

Business Facing

Technology Facing

Support Programming

Critique Product

Brian Marick

Page 20: Test Driven Development Large Scale

Test Strategy

Page 21: Test Driven Development Large Scale

Developer 1 Machine Database Server

Build/Test Process Application Server

Database

Schema 1

Schema 2

Schema 3

Developer 2 Machine

Build/Test Process Application Server

Developer 3 Machine

Build/Test Process Application Server

Page 22: Test Driven Development Large Scale

Client Presentation DomainService Infrastructure

RDBMS

JSF

Component

Faces

Servlet

Session

Facade

Persistence

Manager

Facade

Impl

Data Source

Business

Object

Business

Object

JDO

Browser

Managed

Bean

Gateway

Page 23: Test Driven Development Large Scale

Client Presentation DomainService Infrastructure

RDBMS

JSF

Component

Faces

Servlet

Session

Facade

Persistence

Manager

Facade

Impl

Data Source

Business

Object

Business

Object

JDO

Browser

Managed

Bean

Gateway

Page 24: Test Driven Development Large Scale

http://xunitpatterns.com

Replace code on which SUT depends

Page 25: Test Driven Development Large Scale

http://xunitpatterns.com

Page 26: Test Driven Development Large Scale

http://xunitpatterns.com

Page 27: Test Driven Development Large Scale

http://xunitpatterns.com

Control indirect input

Page 28: Test Driven Development Large Scale

http://xunitpatterns.com

Verify indirect output

Page 29: Test Driven Development Large Scale

Client Presentation DomainService Infrastructure

RDBMS

JSF

Component

Faces

Servlet

Session

Facade

Persistence

Manager

Facade

Impl

Data Source

Business

Object

Business

Object

JDO

Browser

Managed

Bean

Gateway

Mock Object or Test Stub

Page 30: Test Driven Development Large Scale

Client Presentation DomainService Infrastructure

RDBMS

JSF

Component

Faces

Servlet

Session

Facade

Persistence

Manager

Facade

Impl

Data Source

Business

Object

Business

Object

JDO

Browser

Managed

Bean

Gateway

Page 31: Test Driven Development Large Scale

Client Presentation DomainService Infrastructure

RDBMS

JSF

Component

Faces

Servlet

Session

Facade

Persistence

Manager

Facade

Impl

Data Source

Business

Object

Business

Object

JDO

Browser

Managed

Bean

Gateway

Test

Helper

Page 32: Test Driven Development Large Scale

http://xunitpatterns.com

Page 33: Test Driven Development Large Scale

http://www.thoughtworks.com/object-mother-easing-test-object-creation.pdf

Object Mother

Page 34: Test Driven Development Large Scale

Client Presentation DomainService Infrastructure

RDBMS

JSF

Component

Faces

Servlet

Session

Facade

Persistence

Manager

Facade

Impl

Data Source

Business

Object

Business

Object

JDO

Browser

Managed

Bean

Gateway

Test

Helper

Object Mother

Mock Object Mock Object or Test Stub

Humble Object

Page 35: Test Driven Development Large Scale

Client Presentation DomainService Infrastructure

RDBMS

JSF

Component

Faces

Servlet

Session

Facade

Persistence

Manager

Facade

Impl

Data Source

Business

Object

Business

Object

JDO

Browser

Managed

Bean

Gateway

Page 36: Test Driven Development Large Scale

Client Presentation DomainService Infrastructure

RDBMS

JSF

Component

Faces

Servlet

Session

Facade

Persistence

Manager

Facade

Impl

Data Source

Business

Object

Business

Object

JDO

Browser

Managed

Bean

Gateway

Page 37: Test Driven Development Large Scale

Client Presentation DomainService Infrastructure

RDBMS

JSF

Component

Faces

Servlet

Session

Facade

Persistence

Manager

Facade

Impl

Data Source

Business

Object

Business

Object

JDO

Browser

Managed

Bean

Gateway

Page 38: Test Driven Development Large Scale

http://www.openqa.org/selenium

JUnit Test Process

Selenium Driver

Selenium Server

Selenese Proxy WebApp

Web Server

AUT WebApp

Browser Process

AUT

Selenium Browser Bot

Page 39: Test Driven Development Large Scale

http://www.openqa.org/selenium

JUnit Test Process

Selenium Driver

Selenium Server

Selenese Proxy WebApp

Web Server

AUT WebApp

Browser Process

AUT

Selenium Browser Bot1. Launches

Page 40: Test Driven Development Large Scale

http://www.openqa.org/selenium

JUnit Test Process

Selenium Driver

Selenium Server

Selenese Proxy WebApp

Web Server

AUT WebApp

Browser Process

AUT

Selenium Browser Bot1. Launches

2. Requests command

Page 41: Test Driven Development Large Scale

http://www.openqa.org/selenium

JUnit Test Process

Selenium Driver

Selenium Server

Selenese Proxy WebApp

Web Server

AUT WebApp

Browser Process

AUT

Selenium Browser Bot1. Launches

2. Requests command

3. Waits

Page 42: Test Driven Development Large Scale

http://www.openqa.org/selenium

JUnit Test Process

Selenium Driver

Selenium Server

Selenese Proxy WebApp

Web Server

AUT WebApp

Browser Process

AUT

Selenium Browser Bot1. Launches

2. Requests command

4. “Go to AUT” & request result

3. Waits

Page 43: Test Driven Development Large Scale

http://www.openqa.org/selenium

JUnit Test Process

Selenium Driver

Selenium Server

Selenese Proxy WebApp

Web Server

AUT WebApp

Browser Process

AUT

Selenium Browser Bot1. Launches

2. Requests command

4. “Go to AUT” & request result

3. Waits

Page 44: Test Driven Development Large Scale

http://www.openqa.org/selenium

JUnit Test Process

Selenium Driver

Selenium Server

Selenese Proxy WebApp

Web Server

AUT WebApp

Browser Process

AUT

Selenium Browser Bot1. Launches

2. Requests command

4. “Go to AUT” & request result

5. “Go to AUT”

3. Waits

Page 45: Test Driven Development Large Scale

http://www.openqa.org/selenium

JUnit Test Process

Selenium Driver

Selenium Server

Selenese Proxy WebApp

Web Server

AUT WebApp

Browser Process

AUT

Selenium Browser Bot1. Launches

2. Requests command

4. “Go to AUT” & request result

5. “Go to AUT”

6. “Go to AUT”

3. Waits

Page 46: Test Driven Development Large Scale

http://www.openqa.org/selenium

JUnit Test Process

Selenium Driver

Selenium Server

Selenese Proxy WebApp

Web Server

AUT WebApp

Browser Process

AUT

Selenium Browser Bot1. Launches

2. Requests command

4. “Go to AUT” & request result

5. “Go to AUT” 7. HTTP Request

6. “Go to AUT”

3. Waits

Page 47: Test Driven Development Large Scale

http://www.openqa.org/selenium

JUnit Test Process

Selenium Driver

Selenium Server

Selenese Proxy WebApp

Web Server

AUT WebApp

Browser Process

AUT

Selenium Browser Bot1. Launches

2. Requests command

4. “Go to AUT” & request result

5. “Go to AUT” 7. HTTP Request 8. HTTP Response

6. “Go to AUT”

3. Waits

Page 48: Test Driven Development Large Scale

http://www.openqa.org/selenium

JUnit Test Process

Selenium Driver

Selenium Server

Selenese Proxy WebApp

Web Server

AUT WebApp

Browser Process

AUT

Selenium Browser Bot1. Launches

2. Requests command

4. “Go to AUT” & request result

5. “Go to AUT” 7. HTTP Request 8. HTTP Response

6. “Go to AUT” 9. Gets result

3. Waits

Page 49: Test Driven Development Large Scale

http://www.openqa.org/selenium

JUnit Test Process

Selenium Driver

Selenium Server

Selenese Proxy WebApp

Web Server

AUT WebApp

Browser Process

AUT

Selenium Browser Bot1. Launches

2. Requests command

4. “Go to AUT” & request result

5. “Go to AUT” 7. HTTP Request 8. HTTP Response

10. Returns result &

requests command

6. “Go to AUT” 9. Gets result

3. Waits

Page 50: Test Driven Development Large Scale

http://www.openqa.org/selenium

JUnit Test Process

Selenium Driver

Selenium Server

Selenese Proxy WebApp

Web Server

AUT WebApp

Browser Process

AUT

Selenium Browser Bot1. Launches

2. Requests command

4. “Go to AUT” & request result

5. “Go to AUT” 7. HTTP Request 8. HTTP Response

10. Returns result &

requests command

6. “Go to AUT” 9. Gets result

3. Waits

11. Waits

Page 51: Test Driven Development Large Scale

http://www.openqa.org/selenium

JUnit Test Process

Selenium Driver

Selenium Server

Selenese Proxy WebApp

Web Server

AUT WebApp

Browser Process

AUT

Selenium Browser Bot1. Launches

2. Requests command

4. “Go to AUT” & request result

5. “Go to AUT” 7. HTTP Request 8. HTTP Response

10. Returns result &

requests command

6. “Go to AUT” 9. Gets result12. Result

3. Waits

11. Waits

Page 52: Test Driven Development Large Scale

http://www.openqa.org/selenium

JUnit Test Process

Selenium Driver

Selenium Server

Selenese Proxy WebApp

Web Server

AUT WebApp

Browser Process

AUT

Selenium Browser Bot1. Launches

2. Requests command

4. “Go to AUT” & request result

5. “Go to AUT” 7. HTTP Request 8. HTTP Response

10. Returns result &

requests command

6. “Go to AUT” 9. Gets result12. Result

13. Asserts on result

3. Waits

11. Waits

Page 53: Test Driven Development Large Scale

import com.thoughtworks.selenium.*;

import junit.framework.*;

public class GoogleTest extends TestCase {

private Selenium sel;

public void setUp() {

sel = new DefaultSelenium("localhost",

4444, "*firefox", "http://www.google.com");

sel.start();

}

public void testGoogle() {

sel.open("http://www.google.com/webhp");

sel.type("q", "hello world");

sel.click("btnG");

sel.waitForPageToLoad("5000");

assertEquals("hello world - Google Search", sel.getTitle());

}

public void tearDown() {

sel.stop();

}

}

Page 54: Test Driven Development Large Scale
Page 55: Test Driven Development Large Scale

Test Smells

Page 56: Test Driven Development Large Scale

Load factor

0

2

4

6

8

10

12

05/05 07/05 09/05 11/05 01/06 03/06 05/06 07/06 09/06

Buggy Tests

Page 57: Test Driven Development Large Scale

Buggy Tests

Page 58: Test Driven Development Large Scale

Load factor

0

2

4

6

8

10

12

05/05 07/05 09/05 11/05 01/06 03/06 05/06 07/06 09/06

High Test Maintenance Cost

Page 59: Test Driven Development Large Scale

High Test Maintenance Cost

Page 60: Test Driven Development Large Scale

High Test Maintenance Cost

Page 61: Test Driven Development Large Scale

High Test Maintenance Cost

Page 62: Test Driven Development Large Scale

http://xunitpatterns.com

High Test Maintenance Cost

Page 63: Test Driven Development Large Scale

Client Presentation DomainService Infrastructure

RDBMS

JSF

Component

Faces

Servlet

Session

Facade

Persistence

Manager

Facade

Impl

Data Source

Business

Object

Business

Object

JDO

Browser

Managed

Bean

Gateway

Mock Object

Mock Object

High Test Maintenance Cost

Page 64: Test Driven Development Large Scale

High Test Maintenance Cost

Page 65: Test Driven Development Large Scale

High Test Maintenance Cost

Page 66: Test Driven Development Large Scale

High Test Maintenance Cost

Page 67: Test Driven Development Large Scale

High Test Maintenance Cost

Page 68: Test Driven Development Large Scale

Load factor

0

2

4

6

8

10

12

05/05 07/05 09/05 11/05 01/06 03/06 05/06 07/06 09/06

Slow Tests

Page 69: Test Driven Development Large Scale

Slow Tests

Page 70: Test Driven Development Large Scale

Slow Tests

Page 71: Test Driven Development Large Scale

Slow Tests

Page 72: Test Driven Development Large Scale

Client Presentation DomainService Infrastructure

RDBMS

JSF

Component

Faces

Servlet

Session

Facade

Persistence

Manager

Facade

Impl

Data Source

Business

Object

Business

Object

JDO

Browser

Managed

Bean

Gateway

Mock Object

Slow Tests

Page 73: Test Driven Development Large Scale

Slow Tests

Page 74: Test Driven Development Large Scale

Slow Tests

Page 75: Test Driven Development Large Scale

!2HRSbuild

time

test

maintenance

Not Enough

Page 76: Test Driven Development Large Scale

Not EnoughLost ability to

respond to change

Page 77: Test Driven Development Large Scale

Not EnoughToo many tests

too much overlap

Page 78: Test Driven Development Large Scale

Not EnoughSlow component usage

Page 79: Test Driven Development Large Scale

Client Presentation DomainService Infrastructure

RDBMS

JSF

Component

Faces

Servlet

Session

Facade

Persistence

Manager

Facade

Impl

Data Source

Business

Object

Business

Object

JDO

Browser

Managed

Bean

Gateway

Page 80: Test Driven Development Large Scale

Not EnoughTest type number % time %

predeploy 5020 66 170 3

postdeploy 2606 34 5072 97

Page 81: Test Driven Development Large Scale

Not EnoughTest type number % time %

predeploy 5020 66 170 3

postdeploy 2606 34 5072 97

Reduce to smoke tests

Page 82: Test Driven Development Large Scale

Result!10 minute build

Page 83: Test Driven Development Large Scale

Client Presentation DomainService Infrastructure

RDBMS

JSF

Component

Faces

Servlet

Session

Facade

Persistence

Manager

Facade

Impl

Data Source

Business

Object

Business

Object

JDO

Browser

Managed

Bean

Gateway

Page 84: Test Driven Development Large Scale

Conclusion

Continuous design

Educate your team

Be agile with test strategy

Tests as we

ll!

Tests as we

ll!

Tests as we

ll!

Tests as we

ll!

Page 85: Test Driven Development Large Scale

More?

Agile Applied on The Largest J2EE Project in The Beneluxby

Johan Lybaert

Agile Development Workshopby

Kathleen Cornelis

www.ardatissoftwarefactory.com

Page 86: Test Driven Development Large Scale