SlideShare a Scribd company logo
1 of 15
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

More from Alessandro Colla

Cos’è la felicità per te?
Cos’è la felicità per te?Cos’è la felicità per te?
Cos’è la felicità per te?Alessandro Colla
 
Non dire che non hai tempo, semplicemente non sai usarlo!
Non dire che non hai tempo, semplicemente non sai usarlo!Non dire che non hai tempo, semplicemente non sai usarlo!
Non dire che non hai tempo, semplicemente non sai usarlo!Alessandro Colla
 
Assistant, the conversational side of Google
Assistant, the conversational side of GoogleAssistant, the conversational side of Google
Assistant, the conversational side of GoogleAlessandro Colla
 
Basi per la sicurezza in rete
Basi per la sicurezza in reteBasi per la sicurezza in rete
Basi per la sicurezza in reteAlessandro Colla
 
Responsive Web Design & Single Page Application
Responsive Web Design & Single Page ApplicationResponsive Web Design & Single Page Application
Responsive Web Design & Single Page ApplicationAlessandro Colla
 

More from Alessandro Colla (7)

Cos’è la felicità per te?
Cos’è la felicità per te?Cos’è la felicità per te?
Cos’è la felicità per te?
 
Non dire che non hai tempo, semplicemente non sai usarlo!
Non dire che non hai tempo, semplicemente non sai usarlo!Non dire che non hai tempo, semplicemente non sai usarlo!
Non dire che non hai tempo, semplicemente non sai usarlo!
 
Assistant, the conversational side of Google
Assistant, the conversational side of GoogleAssistant, the conversational side of Google
Assistant, the conversational side of Google
 
Basi per la sicurezza in rete
Basi per la sicurezza in reteBasi per la sicurezza in rete
Basi per la sicurezza in rete
 
Come ti piloto il drone
Come ti piloto il droneCome ti piloto il drone
Come ti piloto il drone
 
Responsive Web Design & Single Page Application
Responsive Web Design & Single Page ApplicationResponsive Web Design & Single Page Application
Responsive Web Design & Single Page Application
 
Nui for real
Nui for realNui for real
Nui for real
 

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

  1. Timebox 30 minuti
  2. Timebox 30 minuti
  3. Timebox 30 minuti
  4. Timebox 15 minuti
  5. Timebox 1 ora
  6. Timebox 1 ora
  7. Timebox 1 ora
  8. Timebox 1 ora
  9. Timebox 15 minuti