prdc10-tdd-patterns

18

Transcript of prdc10-tdd-patterns

Page 1: prdc10-tdd-patterns
Page 2: prdc10-tdd-patterns

Amir Barylko - TDD Patterns MavenThought Inc.

AMIR BARYLKOTDD PATTERNS

FOR .NET DEVELOPERSPRAIRIE DEV CON

REGINA 2010

Page 3: prdc10-tdd-patterns

Amir Barylko - TDD Patterns MavenThought Inc.

WHO AM I?

• Architect

•Developer

•Mentor

• Great cook

• The one who’s entertaining you for the next hour!

Page 4: prdc10-tdd-patterns

Amir Barylko - TDD Patterns MavenThought Inc.

WHY TDD?

• Test first approach

•Quality driven

• Easy to refactor

• Regression tests as byproduct

• Increase developer’s confidence

Page 5: prdc10-tdd-patterns

Amir Barylko - TDD Patterns MavenThought Inc.

SETUP

Page 6: prdc10-tdd-patterns

Amir Barylko - TDD Patterns MavenThought Inc.

TOOLS

• Testing framework: NUnit, MbUnit, MSpec, MavenThought Testing

• Mocking framework: Rhino Mocks, Moq, TypeMock

• Test Automation: Scripts that can run the test from the developer computer.

• CI server : Unit test should be run after each commit.

• Reports and Notifications: The team should realize right away that the tests are broken.

Page 7: prdc10-tdd-patterns

Amir Barylko - TDD Patterns MavenThought Inc.

AUTO MOCKING

• Automatic dependency creation for SUT

•Dictionary of dependencies

• Faster setup of tests

• Build your own: StructureMap

•Or use MavenThought Testing

Page 8: prdc10-tdd-patterns

Amir Barylko - TDD Patterns MavenThought Inc.

PATTERNS

Page 9: prdc10-tdd-patterns

Amir Barylko - TDD Patterns MavenThought Inc.

ONE FEATURE PER TEST

• Easy to approach

• Easy to understand

• Easy to maintain

• Enforce Given, When, Then

Given That(arrange)

When I Run(act)

Then it should ...(assert)

Page 10: prdc10-tdd-patterns

Amir Barylko - TDD Patterns MavenThought Inc.

STATE VERIFICATION

• Care about the end state

•Does not validate SUT transitions

• Verify the state agains the expected value

var m = new Library...

Run Test

m.Count.Should(...)

Page 11: prdc10-tdd-patterns

Amir Barylko - TDD Patterns MavenThought Inc.

BEHAVIOUR VERIFICATION

• Checking the expected behaviour happened

• Uses mock objects

• The behaviour is specified for each mock object

• The expected methods should be called

var m = Mock<...>

m.Stub(...)

m.AssertWasCalled(...)

Run Test

Page 12: prdc10-tdd-patterns

Amir Barylko - TDD Patterns MavenThought Inc.

TEST WITH PARAMETERS

• Avoid duplication and repetition

• Generic Parameters

• Parameters Factories

• Random strings

• Random numbers

[Row(1)][Row(2)]void Method(int arg)

[Factory(...)]void Method(string arg)

void Method([Random]...)

void Method([Random]..., [Factory]...)

[Row(typeof(...))]void Method<T>(...)

Page 13: prdc10-tdd-patterns

Amir Barylko - TDD Patterns MavenThought Inc.

DEPENDENCY INJECTION

• Remove hardcoded dependencies

• Introduces dependency in the constructor / setter

• Easy to test and maintain

• S O L I D

Initialize dependency

Stub dependency with mock

Assert the mock is returned

Page 14: prdc10-tdd-patterns

Amir Barylko - TDD Patterns MavenThought Inc.

DEPENDENCY LOOKUP

• Remove hardcoded dependencies

• Introduces a factory or service locator

• Easy to test and maintain

• S O L I D

Initialize service locator

Stub to return a mock

Assert the mock is returned

Page 15: prdc10-tdd-patterns

Amir Barylko - TDD Patterns MavenThought Inc.

DATABASE SETUP

• Base class to setup the database

• The test always works with a clean database

• Can be configured to populate data if needed

Create Database

Populate

Retrieve and Assert

Store

Page 16: prdc10-tdd-patterns

Amir Barylko - TDD Patterns MavenThought Inc.

QUESTIONS?

Page 17: prdc10-tdd-patterns

Amir Barylko - TDD Patterns MavenThought Inc.

RESOURCES

• Contact me: [email protected], @abarylko

•Download: http://www.orhtocoders.com/prairiedevcon

• Books: The rSpec book, xUnit Patterns.

Page 18: prdc10-tdd-patterns

Amir Barylko - TDD Patterns MavenThought Inc.

RESOURCES II

•NUnit: http://www.nunit.org

• Gallio & MbUnit: http://www.gallio.org

•MavenThought Testing: http://maventcommons.codeplex.com

• Rhino Mocks: http://www.ayende.com

• StructureMap: http://structuremap.sourcefore.com

• TeamCity: http://www.jetbrains.com