mit pact rest-schnittstellen innerhalb und außerhalb des ... · o pact file o pact verification o...

59
© 2018 andrena objects ag Experts in agile software engineering Entwicklertag Karlsruhe 2019 Mit Pact REST-Schnittstellen innerhalb und außerhalb des Teams definieren und stabilisieren 03.06.19 Karlsruhe Eva Ziebarth Marvin Kranz [email protected] [email protected]

Upload: others

Post on 27-May-2020

11 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Experts in agile software engineering

Entwicklertag Karlsruhe 2019

Mit Pact REST-Schnittstellen innerhalb und außerhalb des Teams definieren und stabilisieren

03.06.19

Karlsruhe

Eva Ziebarth

Marvin Kranz

[email protected]

[email protected]

Page 2: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Experts in agile software engineering2

Agenda

1. Motivation

2. Consumer Driven Contract Testing – Was ist das?

3. Einführung im Projekt

4. Fazit

Page 3: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Motivation

Page 4: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Experts in agile software engineering

Motivation - Schnittstellen innerhalb eines Teams

4

Was kann schiefgehen?

Service A Service BGET

Erweiterungen

Bug Fixes

Frontend BackendGET

Missverständnisse

Refactorings

Page 5: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Experts in agile software engineering

Motivation

o Automatische Refactorings

5

Beispiele aus der Praxis

Uff! Endlich fertig! Noch nicht perfekt …. Aber für einen

ersten Versuch mit REST… morgen

mehr…

So viele Resharper-Warnungen?!? Ich mach

das mal besser weg…

??? ???

Page 6: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Experts in agile software engineering

Motivation

o Funktionale Anpassungen

6

Beispiele aus der Praxis Uff! Gerade noch geschafft die REST-

Schnittstelle zu erweitern!

???

Für das Release brauche ich noch

dringend…

POPO

Page 7: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Experts in agile software engineering

Motivation - Schnittstellen zwischen Teams

7

Was kann schiefgehen?

ServiceTeam A

ServiceTeam B

GET

Coding Conventions

Erweiterungen

Bug Fixes

Missverständnisse

QualitätsverständnisRefactorings

Page 8: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Experts in agile software engineering

Motivation

8

Wie können Schnittstellen stabil gehalten werden?

o Mündlich

o Schriftlich

o Automatisiert?

→ Consumer Driven Contract Testing!

Page 9: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Consumer Driven Contract TestingWas ist das?

Page 10: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Experts in agile software engineering

Consumer Driven Contract Testing

o Konzept besteht schon lange

o im Microservice-Umfeld an Präsenz gewonnen

o Vertrag zwischen Konsument und Produzent einer Schnittstelle

o Produzent führt Tests des Konsumenten aus

10

Allgemein

Page 11: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Experts in agile software engineering

Consumer Driven Contract Testing

o Tool für Contract Testing

o Technologieunabhängig

o Bibliotheken für verschiedene Sprachen (z.B. C#, Javascript, Java...)

o Vertrag wird dynamisch durch Unittests erstellt

11

Pact - Überblick

Page 12: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Experts in agile software engineering

Consumer Driven Contract Testing

o Service Consumer

o Service Provider

o Mock Service Provider

o Interaction

o Pact File

o Pact Verification

o Provider State

o Pact Specification

12

Pact - Terminologie

Setzt einen HTTP-Request ab

Page 13: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Experts in agile software engineering

Consumer Driven Contract Testing

o Service Consumer

o Service Provider

o Mock Service Provider

o Interaction

o Pact File

o Pact Verification

o Provider State

o Pact Specification

13

Pact - Terminologie

Setzt einen HTTP-Request abAntwortet auf HTTP-Request

Page 14: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Experts in agile software engineering

Consumer Driven Contract Testing

o Service Consumer

o Service Provider

o Mock Service Provider

o Interaction

o Pact File

o Pact Verification

o Provider State

o Pact Specification

14

Pact - Terminologie

Setzt einen HTTP-Request abAntwortet auf HTTP-RequestDient als Mock im Consumer

Test

Page 15: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Experts in agile software engineering

Consumer Driven Contract Testing

o Service Consumer

o Service Provider

o Mock Service Provider

o Interaction

o Pact File

o Pact Verification

o Provider State

o Pact Specification

15

Pact - Terminologie

Setzt einen HTTP-Request abAntwortet auf HTTP-RequestDient als Mock im Consumer

TestKombination aus Anfrage

und Antwort

Page 16: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Experts in agile software engineering

Consumer Driven Contract Testing

o Service Consumer

o Service Provider

o Mock Service Provider

o Interaction

o Pact File

o Pact Verification

o Provider State

o Pact Specification

16

Pact - Terminologie

Setzt einen HTTP-Request abAntwortet auf HTTP-RequestDient als Mock im Consumer

TestKombination aus Anfrage

und AntwortJSON-Datei, die serialisierte

Interactions enthält

Page 17: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Experts in agile software engineering

Consumer Driven Contract Testing

o Service Consumer

o Service Provider

o Mock Service Provider

o Interaction

o Pact File

o Pact Verification

o Provider State

o Pact Specification

17

Pact - Terminologie

Setzt einen HTTP-Request abAntwortet auf HTTP-RequestDient als Mock im Consumer

TestKombination aus Anfrage

und AntwortJSON-Datei, die serialisierte

Interactions enthältVergleich Pact File mit tatsächlicher Antwort

Page 18: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Experts in agile software engineering

Consumer Driven Contract Testing

o Service Consumer

o Service Provider

o Mock Service Provider

o Interaction

o Pact File

o Pact Verification

o Provider State

o Pact Specification

18

Pact - Terminologie

Setzt einen HTTP-Request abAntwortet auf HTTP-RequestDient als Mock im Consumer

TestKombination aus Anfrage

und AntwortJSON-Datei, die serialisierte

Interactions enthältVergleich Pact File mit tatsächlicher Antwort

Zustand, der vom Consumer definiert und vom Provider

bereitgestellt wird

Page 19: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Experts in agile software engineering

Consumer Driven Contract Testing

o Service Consumer

o Service Provider

o Mock Service Provider

o Interaction

o Pact File

o Pact Verification

o Provider State

o Pact Specification

19

Pact - Terminologie

Setzt einen HTTP-Request abAntwortet auf HTTP-RequestDient als Mock im Consumer

TestKombination aus Anfrage

und AntwortJSON-Datei, die serialisierte

Interactions enthältVergleich Pact File mit tatsächlicher Antwort

Zustand, der vom Consumer definiert und vom Provider

bereitgestellt wird

Beschreibt die plattformunabhängige

Struktur der JSON-Datei

Page 20: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Experts in agile software engineering

Consumer Driven Contract Testing

20

Pact - Test bei Konsument

© 2015 Pact Foundation

Page 21: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Experts in agile software engineering

Consumer Driven Contract Testing

21

Pact - Test bei Produzent

© 2015 Pact Foundation

Page 22: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Experts in agile software engineering

Consumer Driven Contract Testing

22

Pact Broker

© 2013 Bethany Skurrie

Page 23: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Einführung im Projekt

Page 24: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Experts in agile software engineering

Einführung im Projekt

24

Untersuchung - Einsatzgebiete:

Im Team:

o Server-Client-Schnittstellen (Provider in C#, Consumer in Typescript)

o Zwischen Microservices (Provider und Consumer in C#)

TS C#

C#

C#

C#C#

Page 25: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Experts in agile software engineering

Einführung im Projekt

25

Untersuchung - Einsatzgebiete:

Zwischen unterschiedlichen Teams:

o Grenzen zwischen Microservices (Provider und Consumer in C#)

o Server-Client-Schnittstelle (Provider in C#, Consumer in Typescript)

C# C#

C#

Page 26: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Experts in agile software engineering

Einführung im Projekt

26

Untersuchung - Einsatzgebiete:

C#-Provider

TS-Consumer

C#-Consumer

Page 27: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Experts in agile software engineering

Einführung im Projekt

27

Untersuchung - Einsatzgebiete:

Zur Zeit noch nicht viele Teams an den untersuchten Schnittstellen beteiligt

Noch keine Notwendigkeit für einen Pact-Broker.

Anstelle dessen: Austausch der json-Datei via git (so auch automatisiert)

JSON

Testprojekt

git

Testprojekt

Consumer Provider

Page 28: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Experts in agile software engineering

Einführung im Projekt

28

Untersuchung - Einsatzgebiete:

TS-Consumer

C#-Consumer

C#-Provider

Page 29: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Experts in agile software engineering

Einführung im Projekt

29

Untersuchung - Testprojekt in C#

o DogAPI.Contract: Enthält Dog-Klasse und Json-Settings

o DogAPI.Provider: Server, der Liste von Hunden einliest und über eine REST-Schnittstelle zurückgibt (Owin)

o DogAPI.Consumer: Client, der Abfragen an die REST-Schnittstelle macht

Page 30: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Experts in agile software engineering

Einführung im Projekt

30

Untersuchung - Testprojekt in C#

o Einbindung von PactNet: Es müssen die nuget-Pakete PactNet und PactNet.Windows(auch unterschiedliche Linux oder OSX möglich) eingebunden werden

Page 31: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Experts in agile software engineering

Einführung im Projekt

31

Untersuchung - Einsatzgebiete:

C#-Consumer

Page 32: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Experts in agile software engineering

Einführung im Projekt

32

Untersuchung - Testprojekt in C#

o Einbindung von Pact.Net im Consumer:

o 1. Schritt: Instanziieren eines PactBuilders:

public DogApiProviderMockSetup()

{

var currentDirectory = GetCurrentDirectory();

PactBuilder = new PactBuilder(new PactConfig {

SpecificationVersion = "2.0.0",

PactDir = currentDirectory + @"\..\..\..\pacts",

LogDir = currentDirectory + @"\..\..\..\logs" });

PactBuilder.ServiceConsumer("Dog API")

.HasPactWith("C# Client");

MockProviderService = PactBuilder.MockService(MockServerPort);

}

Page 33: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Experts in agile software engineering

Einführung im Projekt

33

Untersuchung - Testprojekt in C#

o Einbindung von Pact.Net im Consumer:

o 2. Schritt: Service Mock hoch- und herunterfahren[OneTimeSetUp]

public void Setup()

{

. . .

_mockProviderService = new DogApiProviderMockSetup().MockProviderService;

_mockProviderService.ClearInteractions(); //stelle sicher, dass nur die später konfigurierten

//Interactions berücksichtigt werden

}

[OneTimeTearDown]

public void TearDown()

{

_dogApiMockSetup.ShutdownServerAndSaveToFile();

}

public void

ShutdownServerAndSaveToFile()

{

PactBuilder.Build();

}

Page 34: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Experts in agile software engineering

Einführung im Projekt

34

Untersuchung - Testprojekt in C#

o Einbindung von Pact.Net im Consumer:

o 3. Schritt: Definition einer Interaction_mockProviderService.Given("There is a dog with id '1'")

.UponReceiving("A GET request to retrieve the dog")

.With(new ProviderServiceRequest{

Method = HttpVerb.Get,

Path = "/dogs/1",

Headers = new Dictionary<string, object>{{ "Accept", "application/json" }}

})

.WillRespondWith(new ProviderServiceResponse{

Status = 200,

Body = Match.Type(testDog.ConvertToRestResponseBodyItem()),

Headers = new Dictionary<string, object>{{

"Content-Type", "application/json; charset=utf-8" }}

});

Page 35: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Experts in agile software engineering

Einführung im Projekt

35

Untersuchung - Testprojekt in C#

o Einbindung von Pact.Net im Consumer:

o 4. Schritt: Test der Client-Methode.

var consumer = new DogApiClient($"http://localhost:{MockServerPort}");

var result = consumer.GetDog(testDog.Id);

Assert.That(result.Id, Is.EqualTo(testDog.Id));

Assert.That(result.Name, Is.EqualTo(testDog.Name));

Assert.That(result.Race, Is.EqualTo(testDog.Race));

_mockProviderService.VerifyInteractions();

Page 36: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Experts in agile software engineering

Einführung im Projekt

36

Untersuchung - Testprojekt in C#

o Einbindung von Pact.Net im Consumer:

o 4. Schritt: Test der Client-Methode

var consumer = new DogApiClient($"http://localhost:{MockServerPort}");

var result = consumer.GetDog(testDog.Id);

Assert.That(result.Id, Is.EqualTo(testDog.Id));

Assert.That(result.Name, Is.EqualTo(testDog.Name));

Assert.That(result.Race, Is.EqualTo(testDog.Race));

_mockProviderService.VerifyInteractions();

MockProviderService = PactBuilder.MockService(MockServerPort);

Page 37: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Experts in agile software engineering

Einführung im Projekt

37

Untersuchung - Testprojekt in C#

o Einbindung von Pact.Net im Consumer:

o 4. Schritt: Test der Client-Methode

var consumer = new DogApiClient($"http://localhost:{MockServerPort}");

var result = consumer.GetDog(testDog.Id);

Assert.That(result.Id, Is.EqualTo(testDog.Id));

Assert.That(result.Name, Is.EqualTo(testDog.Name));

Assert.That(result.Race, Is.EqualTo(testDog.Race));

_mockProviderService.VerifyInteractions();

Page 38: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Experts in agile software engineering

Einführung im Projekt

38

Untersuchung - Einsatzgebiete:

C#-Provider

C#-Consumer

Page 39: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Experts in agile software engineering

Einführung im Projekt

39

Untersuchung - Testprojekt in C#

o Einbindung von Pact.Net im Provider:

o 1. Schritt: Instanziieren eines PactVerifiers:

using (WebApp.Start<ServerStartup>(serviceUri)){

IPactVerifier pactVerifier = new PactVerifier(config);

pactVerifier.ProviderState($"{serviceUri}/provider-states")

.ServiceProvider("Dog API", $"http://localhost:{MockServerPort}")

.HonoursPactWith("C# Consumer")

.PactUri(DatabaseFileReader.GetCurrentDirectory()

+ @"\..\..\..\pacts\consumer-dog_api.json");

}

PactBuilder.ServiceConsumer(C# Consumer")

.HasPactWith("Dog API");

Page 40: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Experts in agile software engineering

Einführung im Projekt

40

Untersuchung - Testprojekt in C#

o Einbindung von Pact.Net im Provider:

o 1. Schritt: Instanziieren eines PactVerifiers:

using (WebApp.Start<ServerStartup>(serviceUri)){

IPactVerifier pactVerifier = new PactVerifier(config);

pactVerifier.ProviderState($"{serviceUri}/provider-states")

.ServiceProvider("Dog API", $"http://localhost:{MockServerPort}")

.HonoursPactWith("C# Consumer")

.PactUri(DatabaseFileReader.GetCurrentDirectory()

+ @"\..\..\..\pacts\consumer-dog_api.json");

}

MockProviderService = PactBuilder.MockService(MockServerPort);

Page 41: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Experts in agile software engineering

Einführung im Projekt

41

Untersuchung - Testprojekt in C#

o Einbindung von Pact.Net im Provider:

o 1. Schritt: Instanziieren eines PactVerifiers:

using (WebApp.Start<ServerStartup>(serviceUri)){

IPactVerifier pactVerifier = new PactVerifier(config);

pactVerifier.ProviderState($"{serviceUri}/provider-states")

.ServiceProvider("Dog API", $"http://localhost:{MockServerPort}")

.HonoursPactWith("C# Consumer")

.PactUri(DatabaseFileReader.GetCurrentDirectory()

+ @"\..\..\..\pacts\consumer-dog_api.json");

}

Page 42: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Experts in agile software engineering

Einführung im Projekt

42

Untersuchung -Testprojekt in C#

o Einbindung von Pact.Net im Provider:

o 2. Schritt: Verifizieren des Contracts:

using (WebApp.Start<ServerStartup>(serviceUri)){

pactVerifier.Verify();

}

Page 43: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

C#-Provider

Experts in agile software engineering

Einführung im Projekt

43

Untersuchung - Einsatzgebiete:

C#-Consumer

TS-Consumer

Page 44: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Experts in agile software engineering

Einführung im Projekt

44

Untersuchung - Testprojekt in Typescript

o Consumer: Master-Detail-App, die eine Liste von Hunden und Details zu einem ausgewählten Hund anzeigt (Angular).

Page 45: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Experts in agile software engineering

Einführung im Projekt

45

Untersuchung - Testprojekt in Typescript

o Einbindung von Pact (Testrunner Karma):

o 1. Schritt: NPM-Pakete einbinden.

"devDependencies": {…"@pact-foundation/karma-pact": "^2.2.0","@pact-foundation/pact-node": "^8.1.2","@pact-foundation/pact-web": "^8.2.0",…"typescript": "~3.2.2"

}

Achtung: Unterschiede bei Testrunnern (Hier: Karma)

Page 46: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Experts in agile software engineering

Einführung im Projekt

46

Untersuchung - Testprojekt in Typescript

o Einbindung von Pact (Testrunner Karma):

o 2. Schritt: Instanziieren eines Pact-Provider-Mocks

beforeAll((done) => {this.provider = new PactWeb(pactConfig);setTimeout(done, 2000);this.provider.removeInteractions();

});…afterAll((done) => {

this.provider.finalize().then(() => done()).catch((error) => done.fail(error));

});

Page 47: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Experts in agile software engineering

Einführung im Projekt

47

Untersuchung - Testprojekt in Typescript

o Einbindung von Pact (Testrunner Karma):

o 3. Definition einer Interaction:

public addInteraction = (interaction: InteractionObject, done)=> {

this.provider.addInteraction(interaction).then(() => done()).catch((error) => done.fail(error));

}

public create = (): InteractionObject => {…

}

Page 48: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Experts in agile software engineering

Einführung im Projekt

48

Untersuchung - Testprojekt in Typescript

o Einbindung von Pact (Testrunner Karma):

o 3. Definition einer Interaction:

public create = (): InteractionObject => {return {

state: ʺState nameʺ,uponReceiving: ʺState nameʺ,withRequest: this.request,willRespondWith: this.response,

}}

Page 49: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Experts in agile software engineering

Einführung im Projekt

49

Untersuchung - Testprojekt in Typescript

o Einbindung von Pact (Testrunner Karma):

o 3. Definition einer Interaction:

public create = (): InteractionObject => {return {

state: ʺState nameʺ,uponReceiving: ʺState nameʺ,withRequest: this.request,willRespondWith: this.response,

}}

this.request = {method: "GET",path: "/dogs",headers: this.requestHeaders

}

Page 50: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Experts in agile software engineering

Einführung im Projekt

50

Untersuchung - Testprojekt in Typescript

o Einbindung von Pact (Testrunner Karma):

o 3. Definition einer Interaction:

public create = (): InteractionObject => {return {

state: ʺState nameʺ,uponReceiving: ʺState nameʺ,withRequest: this.request,willRespondWith: this.response,

}}

this.resonse = {status: 200,headers: this.headers,body: this.listOfDogs

}

Page 51: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Experts in agile software engineering

Einführung im Projekt

51

Untersuchung - Testprojekt in Typescript

o Einbindung von Pact (Testrunner Karma):

o 4. Test der Client-Methode:

let dogService = TestBed.get(DogService);

const requestResultVerifier = (dogs) => {expect(dogs).toEqual(testDogs);this.provider.verify();done();

}

dogService.getDogList().subscribe(requestResultVerifier);

Page 52: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Experts in agile software engineering

Einführung im Projekt

52

Untersuchung – Verbinden von Typescript und C#

o Zuätzlicher Testcase in C# Provider: Vertrag des Typescript-Clients einbinden.

o Automatisierte Aktualisierung der Datei: Über git.

public void DogsApiWorksWithTsConsumerTests()

{

using (WebApp.Start<ServerStartup>(serviceUri))

{

new PactVerifier(config).ProviderState($"{serviceUri}/provider-states")

.ServiceProvider("Dog API", serviceUri)

.HonoursPactWith(„Typescript Consumer")

.PactUri(DatabaseFileReader.GetCurrentDirectory()

+ @"\contracts\typescriptClient.json")

.Verify();

}

}

Page 53: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Beispiele für konkrete Problemlösungen

53Experts in agile software engineering

PactTypescript C#

ServerClient

Page 54: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Beispiele für konkrete Problemlösungen

54Experts in agile software engineering

C#

Pact

C#C#

Page 55: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Beispiele für konkrete Problemlösungen

55

Schwierigkeiten:

o Akzeptanz für Mehraufwand schaffen

o Mehrere Teams involviert

o Austausch der Verträge

Experts in agile software engineering

Page 56: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Beispiele für konkrete Problemlösungen

56

Schwierigkeiten:

o C#: Ruby-Prozess wird manchmal nicht beendet => nächster Testdurchlauf wird rot

o Typescript: Bei komplexerer Netzwerkstruktur update der npm-Packages schwer

o Typescript: z.T. keine Typisierung in verfügbaren Beispielen => Aufräumarbeiten für Verständnis notwendig

o Typescript: Unterschiedliche Abhängigkeiten für unterschiedliche Testrunner (keine dediziert für unseren -> keine Lösung 😢) => Forschungsarbeit notwendig

Experts in agile software engineering

Page 57: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Fazit

o Gewisse Einstiegshürde

o Firewallkonfigurationen in Unternehmen können hinderlich sein

o CDC hat sehr viel Potential

o Wir werden Pact weiter nutzen!

57Experts in agile software engineering

Page 58: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Bitte geben Sie uns jetzt Ihr Feedback!Mit Pact REST-Schnittstellen innerhalbund außerhalb des Teams definieren und stabilisierenEva Ziebarth, Marvin Kranz

Nächste Vorträge in diesem Raum

13:30 Event Sourcing - Wahrscheinlichmachen Sie es falsch, David Schmitz14:30 Verbesserte Observability unterVerwendung offener, OpenCensus-basierter Application-Monitoring-Lösungen, Dr. Alexander Wert15:45 Size does matter! Why and how you should use JVM-Microframeworks, Christian Schwörer

Page 59: Mit Pact REST-Schnittstellen innerhalb und außerhalb des ... · o Pact File o Pact Verification o Provider State o Pact Specification 18 Pact - Terminologie Setzt einen HTTPAntwortet

© 2018 andrena objects ag

Experts in agile software engineering

Referenzen

59

https://docs.pact.io/

https://github.com/pact-foundation/pact-net

https://github.com/pact-foundation/pact_broker

https://martinfowler.com/articles/consumerDrivenContracts.html