ian robinson testable foundations

12
Founding Sponsors This Presentation Courtesy of the International SOA Symposium October 7-8, 2008 Amsterdam Arena www.soasymposium.com [email protected] Gold Sponsors Platinum Sponsors Silver Sponsors Testable Foundations for ServiceOriented Development Ian Robinson http://iansrobinson.com

Upload: soa-symposium

Post on 15-May-2015

227 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: Ian  Robinson    Testable  Foundations

Founding Sponsors

This Presentation Courtesy of the International SOA SymposiumOctober 7-8, 2008 Amsterdam [email protected]

Gold Sponsors

Platinum Sponsors

Silver Sponsors

Testable Foundations for Service‐Oriented Development

Ian Robinson

http://iansrobinson.com

Page 2: Ian  Robinson    Testable  Foundations

Tests, Testing and Testability

Design & discovery

Asserted behaviour

Tests

Micro Alignment

Stories

Tests

Business‐IT Alignment

Page 3: Ian  Robinson    Testable  Foundations

A Map of the Territories: From What to How

Who?What?

Why?What? How?

StakeholdersStakeholders

OutcomesOutcomes

BenefitsBenefits

ForcesForces

ObstaclesObstacles

CapabilitiesCapabilities

ServicesServices

ProcessesProcesses

TechnologiesTechnologies

want deliver

motivateprevent

realise

provide

host

implement

Stories, Capabilities, Services and Contracts

Stories Capabilities

ServicesContracts

Describe goals & outcomes

Resources to realise outcomes

Host capabilities

Assert interactions between services

Page 4: Ian  Robinson    Testable  Foundations

(Behaviour‐Driven Development) Stories

As a <role>I want <feature>So that <benefit>

As a <role>I want <feature>So that <benefit>

As anI wantSo that

Order Management serviceto fulfill orders based on current offeringsI can meet customer expectations efficiently 

Outside‐in

External behaviour

Value

Outcomes

Capabilities

CapabilitiesCapabilities

ResourcesResourcesPeoplePeople ProcessesProcesses TechnologyTechnology

OutcomesOutcomes

What What not not HowHow

StableStableProcessesProcesses TechnologyTechnologychangechange changeschanges

Page 5: Ian  Robinson    Testable  Foundations

Execute

Contracts

Design

Consumer Contract

Adopt

Consumer‐Driven Contract

Communicate

Produce

(Validate according to…)

Consume

(Use according to…)

XmlUnit

public class ArtistUpdatedTestCase extends XMLTestCase {

...

protected String xml;

public void testXPaths() throws Exception {assertXpathExists("/n:ArtistUpdated", xml);

assertXpathExists("/n:ArtistUpdated/a:Artist", xml);assertXpathExists("/n:ArtistUpdated/a:Artist/a:GlobalArtistCode", xml);assertXpathExists("/n:ArtistUpdated/a:Artist/a:DefaultName", xml);

assertXpathExists("/n:ArtistUpdated/a:Artist/a:MainRepertoireOwnerCompany", xml);

assertXpathExists("/n:ArtistUpdated/a:Artist/a:MainRepertoireOwnerCompany/" + "s:OperatingCompanyCode", xml);

assertXpathExists("/n:ArtistUpdated/a:Artist/a:MainRepertoireOwnerCompany/" + "s:Name", xml);

assertXpathExists("/n:ArtistUpdated/a:Artist/a:ChangedDate", xml); }

}

Page 6: Ian  Robinson    Testable  Foundations

Schematron

<?xml version="1.0" encoding="utf-8" ?><schema xmlns="http://www.ascc.net/xml/schematron">

<title>ArtistUpdated Contract</title>

<ns uri="http://example.com/notifications" prefix="n"/><ns uri="http://example.com/artist" prefix="a"/><ns uri="http://example.com/sharedtypes" prefix="s"/>

<phase id="validateStructure"><active pattern="structure"/>

</phase>

<pattern name="Validate structure" id="structure"><rule context="/">

<assert test="n:ArtistUpdated"/></rule><rule context="n:ArtistUpdated">

<assert test="a:Artist"/></rule><rule context="n:ArtistUpdated/a:Artist">

<assert test="a:GlobalArtistCode"/><assert test="a:DefaultName"/><assert test="a:MainRepertoireOwnerCompany"/><assert test="a:ChangedDate"/>

</rule><rule context="n:ArtistUpdated/a:Artist/a:MainRepertoireOwnerCompany">

<assert test="s:OperatingCompanyCode"/><assert test="s:Name"/>

</rule></pattern>

</schema>

Schematron rules

Schematron rules

Intermediate transform

Intermediate transform XSLTXSLT

XMLXML

ResultsResults

An External DSL for Consumer Contracts

ArtistUpdated [http://example.com/notifications]Artist[http://example.com/artist]

GlobalArtistCode : intDefaultName : stringMainRepertoireOwnerCompany : companyType (0..1)ChangedDate : datetime

Company[http://example.com/company] id(companyType)OperatingCompanyCode : stringName : string

Declarative

What Hownot

Page 7: Ian  Robinson    Testable  Foundations

Validating XML

ArtistUpdated [http://example.com/notifications]

Artist[http://example.com/artist]

GlobalArtistCode : intDefaultName : string

MainRepertoireOwnerCompany : companyType (0..1)

ChangedDate : datetime

Company[http://example.com/company] id(companyType)OperatingCompanyCode : string

Name : string

<ArtistUpdated xmlns="http://example.com/notifications"><Artist xmlns="http://example.com/artist">

<GlobalArtistCode>13570</GlobalArtistCode><DefaultName>Tom Waits</DefaultName><MainRepertoireOwnerCompany xmlns:c="xmlns="http://example.com/company">

<c:OperatingCompanyCode>HF32L</c:OperatingCompanyCode><c:Name>Mercury Records Ltd</c:Name>

</MainRepertoireOwnerCompany><ChangedDate>2008-09-10T13:57:14+01:00</ChangedDate>...

</Artist><ArtistUpdated>

Validating JSON

ArtistUpdated [http://example.com/notifications]

Artist[http://example.com/artist]

GlobalArtistCode : intDefaultName : string

MainRepertoireOwnerCompany : companyType (0..1)

ChangedDate : datetime

Company[http://example.com/company] id(companyType)OperatingCompanyCode : string

Name : string

{"ArtistUpdated": {

"Artist": {"GlobalArtistCode": 13570,"DefaultName": "Tom Waits","MainRepertoireOwnerCompany": {

"OperatingCompanyCode": "HF32L","Name": "Mercury Records Ltd",

},"ChangedDate": "2008-09-10T13:57:14+01:00"

}}

}

Page 8: Ian  Robinson    Testable  Foundations

Validating YAML

ArtistUpdated [http://example.com/notifications]

Artist[http://example.com/artist]

GlobalArtistCode : intDefaultName : string

MainRepertoireOwnerCompany : companyType (0..1)

ChangedDate : datetime

Company[http://example.com/company] id(companyType)OperatingCompanyCode : string

Name : string

ArtistUpdated:Artist:

GlobalArtistCode: 13570DefaultName: Tom WaitsMainRepertoireOwnerCompany:

OperatingCompanyCode: HF32LName: Mercury Records Ltd

ChangedDate: 2008-09-10T13:57:14+01:00

ArtistUpdated [http://example.com/notifications]Artist[http://example.com/artist]

GlobalArtistCode : intDefaultName : stringMainRepertoireOwnerCompany : companyType (0..1)ChangedDate : datetime

Company[http://example.com/company] id(companyType)OperatingCompanyCode : stringName : string

Transformations

ContractContract ASTAST

ValidatorValidator

GraphGraph

SerializerSerializer

Page 9: Ian  Robinson    Testable  Foundations

Validating Forms

ArtistUpdated [http://example.com/notifications]

Artist[http://example.com/artist]

GlobalArtistCode : intDefaultName : string

MainRepertoireOwnerCompany : companyType (0..1)

ChangedDate : datetime

Company[http://example.com/company] id(companyType)OperatingCompanyCode : string

Name : string

POST /notifications HTTP/1.1Host: example.comContent-Type: application/x-www-form-urlencodedContent-Length: 301

ArtistUpdated_Artist_GlobalArtistCode=13570&ArtistUpdated_Artist_DefaultName=Tom+Waits&ArtistUpdated_Artist_MainRepertoireOwnerCompany_OperatingCompanyCode=HF32L&ArtistUpdated_Artist_MainRepertoireOwnerCompany_Name=Mercury+Records+Ltd&ArtistUpdated_Artist_ChangedDate=2008-09-10T13%3A57%3A14%2B01%3A00

expectsexpects

expectsexpects

expectsexpects

expectsexpectsexpectsexpects

expectsexpectsexpectsexpects

expectsexpects

offersoffers

hashas

hashas

hashashas

Name = ChangedDateType = datetimeName = ChangedDateType = datetime

Name = DefaultNameType = stringName = DefaultNameType = string

Name = GlobalArtistCodeType = intName = GlobalArtistCodeType = int

Name = ArtistName = Artist

Name = ArtistUpdatedName = ArtistUpdated

Social Networks for Contracts

WarehouseWarehouse MarketingMarketingProduct CatalogProduct Catalog

Page 10: Ian  Robinson    Testable  Foundations

Generating Consumer‐Driven Contracts

ArtistUpdatedArtist

GlobalArtistCode : intChangedDate : datetime

ArtistUpdatedArtist

GlobalArtistCode : intDefaultName : stringChangedDate : datetime

ArtistUpdatedArtist

DefaultName : stringChangedDate : datetime

Execute

Design

Services Share Contract, Not Type

Consumer‐Driven Contract

Consumer Contract

Produce Consume

ValidatorValidator

GraphGraph

SerializerSerializer

ContractContract

Page 11: Ian  Robinson    Testable  Foundations

Summary

• How do we get started?– Iteratively fill out map of the territories

• 4 core artefacts:– Stories– Capabilities– Services– Contracts

• Consumer and consumer‐driven contracts:– Tests exchanged between teams– DSL for consumer contracts

Consumer‐Driven Contracts

• http://www.martinfowler.com/articles/consumerDrivenContracts.html

• http://www.infoq.com/articles/consumer‐driven‐contracts• http://iansrobinson.com/

Page 12: Ian  Robinson    Testable  Foundations

Thank you

http://iansrobinson.com