UN MICROSERVIZIO CQRS CON
EVENT SOURCING
Dallo sviluppo al testing non convenzionale
REPOSITORY (BRANCH: MASTER)
https://github.com/Iridio/
/CQRS-ES_testing_workshop
PROGRAMMA
 Introduzione
 Event storming
 Allestiamo il progetto
 Pausa
 Scriviamo i test
 Q&A
INTRODUZIONE
CQRS+ES
https://benwilcock.wordpress.com
EVENT STORMING
ALLESTIAMO IL PROGETTO
PAUSA
SCRIVIAMO I TEST
ESERCIZIO 1 – 50 MINUTI
Quando un utente del nostro sito inizia il processo di acquisto, il sistema blocca per 15 minuti i posti selezionati.
In questo esercizio dovrai scrivere il test ed il relativo codice per bloccare temporaneamente i posti selezionati
dall'utente. (Comando ReserveSeats)
Come spiegato, ricorda che i comandi sono imperativi, mentre gli eventi sono al passato in quanto è qualcosa che è
successo.
Ricorda inoltre, che il test parte da una lista di eventi (Given()) che rappresentano lo stato iniziale dell'aggregato, che è il
comando (When() ed OnHandler()) a far scatenare il tutto ed, infine, che devi specificare qual è o quali sono gli eventi che
ci aspettiamo siano creati dall'aggregato.
Si è deciso che l'aggregato espone la lista dei posti composti da numero, riga e stato. Lo stato non viene passato nel
comando in quanto superfluo, è il comando stesso che ci dice cosa fare con quei posti, pertanto lo stato sarà il nostro
aggregato ad impostarlo, proprio come il comando che abbiamo visto insieme.
Per incrociare i posti liberi con quelli occupati temporaneamente, puoi anche usare il comando Intersect di Linq oltre al
classico for/foreach
var seatsToCheck = seats.Intersect(seatsToReserve.ToEntity(SeatState.Free));
La classe CommandSpecification espone già un repository con i suoi metodi collegati ad un event store in memoria,
pertanto non dovrai fare nulla se non invocare Repository.GetById all'interno del tuo test.
ESERCIZIO 2 – 40 MINUTI
Se per qualche motivo ci dovesse arrivare un comando che cerca di riservare dei posti già occupati, dovremo emettere
un'eccezione e non generare alcun evento.
In realtà potremmo anche emettere un evento che avvisa che non si sono potuti occupare i posti, se invece la gestione dei
nostri comandi fosse sincrona l'eccezione sarebbe sufficiente.
Lo scopo dell'esercizio però è solo testare un'eccezione pertanto affronteremo questi discorsi davanti ad una birra, ma non
adesso :)
In questo esercizio dovrai scrivere un test che verifichi non vengano emessi eventi, ma bensì un eccezione.
Ricorda quindi di creare una situazione (Given()) ed un comando (When() ed OnHanlder()) che scatenino l'eccezione da
parte dell'aggregato.
La classe CommandSpecification espone una proprietà "ExpectedException" che non devi far altro che valorizzare nel
costruttore del tuo test.
Per esempio: ExpectedException = new Exception("la mia eccezione");
ESERCIZIO 3 – 30 MINUTI
Quando l'utente termina il pagamento dei posti che desidera, il nostro sistema dovrà trasformare lo stato dei posti
"reserved" in "booked".
Come spiegato ricorda che i comandi sono imperativi, mentre gli eventi sono al passato in quanto è qualcosa che è
successo.
In questo esercizio dovrai scrivere tutta la gestione scatenata dal comando "BookSeats"
QUESTIONS?
BIBLIOGRAFIA
 Domain-Driven Design: Tackling Complexity in the Heart of Software (E. Evans)
https://www.amazon.it/Domain-Driven-Design-Tackling-Complexity-Software-ebook/dp/B00794TAUG
 Implementing Domain-Driven Design (V. Vernon)
https://www.amazon.it/Implementing-Domain-Driven-Design-Vaughn-Vernon-ebook/dp/B00BCLEBN8/
 Introducing Event storming (A.Brandolini)
https://leanpub.com/introducing_eventstorming
 REST in Practice: Hypermedia and Systems Architecture (J.Webber)
https://www.amazon.it/REST-Practice-Hypermedia-Systems-Architecture/dp/0596805829
 Enterprise Integration Patterns (G. Hohpe)
https://www.amazon.it/Enterprise-Integration-Patterns-Designing-Deploying/dp/0321200683/
IAD18 - Testing di un microservizio CQRS con Event sourcing

More Related Content

PDF
Java OCA teoria 5
PPTX
Come testare il comportamento del dominio
PDF
Open domus 2016
PDF
Cqrs and IoT: a match made in heaven
PDF
[Alam aeki] Guida illustrata alla modellazione di un dominio con Event Sourci...
PDF
[AxonIQ Italia Community] Architetture distribuite a eventi: sono adatte al m...
PPTX
Lo sai che si può fare DDD in Javascript grazie a Typescript? Visual Studio e...
PDF
Baby Steps TripServiceKata
Java OCA teoria 5
Come testare il comportamento del dominio
Open domus 2016
Cqrs and IoT: a match made in heaven
[Alam aeki] Guida illustrata alla modellazione di un dominio con Event Sourci...
[AxonIQ Italia Community] Architetture distribuite a eventi: sono adatte al m...
Lo sai che si può fare DDD in Javascript grazie a Typescript? Visual Studio e...
Baby Steps TripServiceKata

Similar to IAD18 - Testing di un microservizio CQRS con Event sourcing (10)

PDF
Never Mind the Bollocks: here's the Domain Driven Design
PDF
Event based modelling and prototyping
PPT
Introduzione al Test Driven Development
PPTX
Dal requisito all'implementazione @ CD2010
PPTX
Uno sguardo a CQRS ed EventSourcing
PDF
Idea - post-it - test verdi.
PDF
Alam aeki 2015
PDF
Applicazioni intelligenzaartificiale
PDF
Innovazione: Architetture | Strumenti | Processi
PDF
L'illusione dell'ortogonalità
Never Mind the Bollocks: here's the Domain Driven Design
Event based modelling and prototyping
Introduzione al Test Driven Development
Dal requisito all'implementazione @ CD2010
Uno sguardo a CQRS ed EventSourcing
Idea - post-it - test verdi.
Alam aeki 2015
Applicazioni intelligenzaartificiale
Innovazione: Architetture | Strumenti | Processi
L'illusione dell'ortogonalità
Ad

More from Alessandro Colla (8)

PDF
Non agire più velocemente della tua capacità di prendere decisioni
PPTX
Cos’è la felicità per te?
PPTX
Non dire che non hai tempo, semplicemente non sai usarlo!
PPTX
Assistant, the conversational side of Google
PPTX
Basi per la sicurezza in rete
PPTX
Come ti piloto il drone
PPTX
Responsive Web Design & Single Page Application
PPTX
Nui for real
Non agire più velocemente della tua capacità di prendere decisioni
Cos’è la felicità per te?
Non dire che non hai tempo, semplicemente non sai usarlo!
Assistant, the conversational side of Google
Basi per la sicurezza in rete
Come ti piloto il drone
Responsive Web Design & Single Page Application
Nui for real
Ad

IAD18 - Testing di un microservizio CQRS con Event sourcing

  • 1. UN MICROSERVIZIO CQRS CON EVENT SOURCING Dallo sviluppo al testing non convenzionale
  • 3. PROGRAMMA  Introduzione  Event storming  Allestiamo il progetto  Pausa  Scriviamo i test  Q&A
  • 10. ESERCIZIO 1 – 50 MINUTI Quando un utente del nostro sito inizia il processo di acquisto, il sistema blocca per 15 minuti i posti selezionati. In questo esercizio dovrai scrivere il test ed il relativo codice per bloccare temporaneamente i posti selezionati dall'utente. (Comando ReserveSeats) Come spiegato, ricorda che i comandi sono imperativi, mentre gli eventi sono al passato in quanto è qualcosa che è successo. Ricorda inoltre, che il test parte da una lista di eventi (Given()) che rappresentano lo stato iniziale dell'aggregato, che è il comando (When() ed OnHandler()) a far scatenare il tutto ed, infine, che devi specificare qual è o quali sono gli eventi che ci aspettiamo siano creati dall'aggregato. Si è deciso che l'aggregato espone la lista dei posti composti da numero, riga e stato. Lo stato non viene passato nel comando in quanto superfluo, è il comando stesso che ci dice cosa fare con quei posti, pertanto lo stato sarà il nostro aggregato ad impostarlo, proprio come il comando che abbiamo visto insieme. Per incrociare i posti liberi con quelli occupati temporaneamente, puoi anche usare il comando Intersect di Linq oltre al classico for/foreach var seatsToCheck = seats.Intersect(seatsToReserve.ToEntity(SeatState.Free)); La classe CommandSpecification espone già un repository con i suoi metodi collegati ad un event store in memoria, pertanto non dovrai fare nulla se non invocare Repository.GetById all'interno del tuo test.
  • 11. ESERCIZIO 2 – 40 MINUTI Se per qualche motivo ci dovesse arrivare un comando che cerca di riservare dei posti già occupati, dovremo emettere un'eccezione e non generare alcun evento. In realtà potremmo anche emettere un evento che avvisa che non si sono potuti occupare i posti, se invece la gestione dei nostri comandi fosse sincrona l'eccezione sarebbe sufficiente. Lo scopo dell'esercizio però è solo testare un'eccezione pertanto affronteremo questi discorsi davanti ad una birra, ma non adesso :) In questo esercizio dovrai scrivere un test che verifichi non vengano emessi eventi, ma bensì un eccezione. Ricorda quindi di creare una situazione (Given()) ed un comando (When() ed OnHanlder()) che scatenino l'eccezione da parte dell'aggregato. La classe CommandSpecification espone una proprietà "ExpectedException" che non devi far altro che valorizzare nel costruttore del tuo test. Per esempio: ExpectedException = new Exception("la mia eccezione");
  • 12. ESERCIZIO 3 – 30 MINUTI Quando l'utente termina il pagamento dei posti che desidera, il nostro sistema dovrà trasformare lo stato dei posti "reserved" in "booked". Come spiegato ricorda che i comandi sono imperativi, mentre gli eventi sono al passato in quanto è qualcosa che è successo. In questo esercizio dovrai scrivere tutta la gestione scatenata dal comando "BookSeats"
  • 14. BIBLIOGRAFIA  Domain-Driven Design: Tackling Complexity in the Heart of Software (E. Evans) https://www.amazon.it/Domain-Driven-Design-Tackling-Complexity-Software-ebook/dp/B00794TAUG  Implementing Domain-Driven Design (V. Vernon) https://www.amazon.it/Implementing-Domain-Driven-Design-Vaughn-Vernon-ebook/dp/B00BCLEBN8/  Introducing Event storming (A.Brandolini) https://leanpub.com/introducing_eventstorming  REST in Practice: Hypermedia and Systems Architecture (J.Webber) https://www.amazon.it/REST-Practice-Hypermedia-Systems-Architecture/dp/0596805829  Enterprise Integration Patterns (G. Hohpe) https://www.amazon.it/Enterprise-Integration-Patterns-Designing-Deploying/dp/0321200683/

Editor's Notes

  • #5: Timebox 30 minuti
  • #7: Timebox 30 minuti
  • #8: Timebox 30 minuti
  • #9: Timebox 15 minuti
  • #10: Timebox 1 ora
  • #11: Timebox 1 ora
  • #12: Timebox 1 ora
  • #13: Timebox 1 ora
  • #14: Timebox 15 minuti