dennis doomen | @ddoomen | aviva solutions | the continuous … · 2019-11-04 · 1. design the...

30
Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous Improver

Upload: others

Post on 09-Jun-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,

Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous Improver

Page 2: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,
Page 3: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,
Page 4: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,

An opinionated definition

Page 5: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,
Page 6: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,
Page 7: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,
Page 8: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,
Page 9: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,
Page 10: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,
Page 11: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,
Page 12: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,

(in my definition)

Page 13: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,

1. Design the class responsibilities

2. Write a first unit test

3. Generate stubs using R#, Rider, etc

4. Ensure test fails for the right reason

5. Implement the real deal

6. Ensure test succeeds

7. Identify alternative scenarios

8. Repeat twice

9. Refactor.

Page 14: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,
Page 15: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,
Page 16: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,
Page 17: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,
Page 18: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,
Page 19: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,
Page 20: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,
Page 21: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,
Page 22: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,

Order Processing

IStoreOrders<T>+ CreateQuery<T>();+ Add<T>();+ Delete<T>();

NHibernateRepository

Order Processing

IStoreOrders+ GetIncompletedOrders(minValue);+ StoreOrder();+ CompleteOrder();

OrderRepository

VS

Page 23: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,
Page 24: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,

eventMonitor.OccurredEvents.Should().BeEquivalentTo(new[]{

new{

EventName = "PropertyChanged",TimestampUtc = utcNow - 1.Hours(),Parameters = new object[] { “third”, “first”, 123 }

},new{

EventName = "NonConventionalEvent",TimestampUtc = utcNow,Parameters = new object[] { "first", 123, "third" }

}}, o => o.WithStrictOrdering());

Page 25: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,
Page 26: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,

Command Handlers

Commands

Domain Model

Event Store

Events

App

Query Store

RavenDB

ProjectorsEvents

API Controller

Projections

Events

Page 27: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,
Page 28: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,

• Define the boundary carefully• Use BDD or AAA when applicable

• Don’t repeat the context in names• Don’t use technical names• Avoid constants• Use Test Data Builders for the irrelevant

parts• Show relevant dependencies• Only assert the relevant parts• Keep refactoring• Keep out of the debugger hell.

Page 30: Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous … · 2019-11-04 · 1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider,

• Example codehttps://github.com/dennisdoomen/EffectiveTddDemo

• Chillhttps://github.com/ChillBdd/Chill

• Fluent Assertionshttps://www.fluentassertions.com

• Laws of Jeremy D. Millerhttp://codebetter.com/jeremymiller/2005/10/21/haacked-on-tdd-and-jeremys-first-rule-of-tdd/

• Xunit Patternshttp://xunitpatterns.com/

• Test data buildershttp://www.natpryce.com/articles/000714.html