dennis doomen | @ddoomen | aviva solutions | the ......1. design the class responsibilities 2. write...

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

Upload: others

Post on 09-Jun-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for

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

Page 2: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for
Page 3: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for
Page 4: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for

An opinionated definition

Page 5: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for
Page 6: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for
Page 7: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for
Page 8: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for
Page 9: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for
Page 10: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for
Page 11: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for
Page 12: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for

(in my definition)

Page 13: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for

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 ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for
Page 15: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for
Page 16: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for
Page 17: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for
Page 18: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for
Page 19: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for
Page 20: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for
Page 21: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for
Page 22: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for

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 ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for
Page 24: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for

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 ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for
Page 26: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for

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 ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for
Page 28: Dennis Doomen | @ddoomen | Aviva Solutions | The ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for

• 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 ......1. Design the class responsibilities 2. Write a first unit test 3. Generate stubs using R#, Rider, etc 4. Ensure test fails for

• 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