Building a Testable Data Access Layer Todd Anglin Chief Evangelist, Telerik Level: Intermediate.

33
Building a Testable Building a Testable Data Access Layer Data Access Layer Todd Anglin Todd Anglin Chief Evangelist, Telerik Level: Intermediate

Transcript of Building a Testable Data Access Layer Todd Anglin Chief Evangelist, Telerik Level: Intermediate.

Page 1: Building a Testable Data Access Layer Todd Anglin Chief Evangelist, Telerik Level: Intermediate.

Building a Testable Data Building a Testable Data Access LayerAccess LayerTodd AnglinTodd AnglinChief Evangelist, Telerik

Level: Intermediate

Page 2: Building a Testable Data Access Layer Todd Anglin Chief Evangelist, Telerik Level: Intermediate.

IntroductionsIntroductions

Todd Anglin

Chief Evangelist, TelerikMicrosoft MVP

ASP InsiderPresident NHDNUG & O’Reilly Author

@toddanglin

TelerikWatch.com

Page 3: Building a Testable Data Access Layer Todd Anglin Chief Evangelist, Telerik Level: Intermediate.

today’s plantoday’s plan

Page 4: Building a Testable Data Access Layer Todd Anglin Chief Evangelist, Telerik Level: Intermediate.

what is a “data layer”?what is a “data layer”?

Page 5: Building a Testable Data Access Layer Todd Anglin Chief Evangelist, Telerik Level: Intermediate.

PresentationPresentation

Data LayerData Layer

Responsible for talking to “persistence layer”

Web Desktop

Domain Logic(“the code that makes you money”)

Domain Logic(“the code that makes you money”)

Data / ModelData / Model

PersistencePersistence

Database Cloud XML Etc.

ServiceService

Page 6: Building a Testable Data Access Layer Todd Anglin Chief Evangelist, Telerik Level: Intermediate.

why build a data layer?why build a data layer?what’s the benefit?

Page 7: Building a Testable Data Access Layer Todd Anglin Chief Evangelist, Telerik Level: Intermediate.

importance of data layerimportance of data layer

• Decouple application from persistence= easier maintenance

= improved testability

= greater reusability

Page 8: Building a Testable Data Access Layer Todd Anglin Chief Evangelist, Telerik Level: Intermediate.

PresentationPresentation

Web Desktop

Domain Logic(“the code that makes you money”)

Domain Logic(“the code that makes you money”)

DataData

PersistencePersistence

Database Cloud XML Etc.

ServiceService

Page 9: Building a Testable Data Access Layer Todd Anglin Chief Evangelist, Telerik Level: Intermediate.

a a goodgood data layer… data layer…

Page 10: Building a Testable Data Access Layer Todd Anglin Chief Evangelist, Telerik Level: Intermediate.

1. Handles all data access

2. Hides implementation

3. Flexible– Easy to refactor

Page 11: Building a Testable Data Access Layer Todd Anglin Chief Evangelist, Telerik Level: Intermediate.

a a badbad data layer is… data layer is…

Page 12: Building a Testable Data Access Layer Todd Anglin Chief Evangelist, Telerik Level: Intermediate.

1. Does not centralize data access

2. Makes application very dependent on persistent store

3. Easy*

Page 13: Building a Testable Data Access Layer Todd Anglin Chief Evangelist, Telerik Level: Intermediate.

how do we build “data layers”?how do we build “data layers”?

Page 14: Building a Testable Data Access Layer Todd Anglin Chief Evangelist, Telerik Level: Intermediate.

By Hand

Pros-POCO-YAGNI-No-RTFMCons-Time-No FM

By Hand

Pros-POCO-YAGNI-No-RTFMCons-Time-No FM

ORM

Pros-Time-FlexibleCons-Learning-Limits-Trust*

ORM

Pros-Time-FlexibleCons-Learning-Limits-Trust*

Page 15: Building a Testable Data Access Layer Todd Anglin Chief Evangelist, Telerik Level: Intermediate.

popular .NET ORMspopular .NET ORMs

Page 16: Building a Testable Data Access Layer Todd Anglin Chief Evangelist, Telerik Level: Intermediate.

DEMODEMOBuild data layer with LinqToSql & EF & OpenAccess

Page 17: Building a Testable Data Access Layer Todd Anglin Chief Evangelist, Telerik Level: Intermediate.

data layer patternsdata layer patterns

• Domain Driven Design (DDD)– Key concepts: Repositories act on model

• ActiveRecord– Key concepts: Model objects act on themselves

• Data Mapper– Key concepts: Objects mapped to tables

Page 18: Building a Testable Data Access Layer Todd Anglin Chief Evangelist, Telerik Level: Intermediate.

DEMODEMOAdd data access pattern to project

Page 19: Building a Testable Data Access Layer Todd Anglin Chief Evangelist, Telerik Level: Intermediate.

testing the data layer

Page 20: Building a Testable Data Access Layer Todd Anglin Chief Evangelist, Telerik Level: Intermediate.

two testing campstwo testing camps

A Test Database B Mock

Database

Concepts:•Test against “real” database•Use set-up/tear-down code to create test data

Good When…You put lots of logic in your database

Concepts:•Test against “fake” database•Isolates your code from database behavior

Good When…You want fast unit tests and you put most logic in code

Page 21: Building a Testable Data Access Layer Todd Anglin Chief Evangelist, Telerik Level: Intermediate.

Mocking

Pros-Unit test-Isolate concerns-FastCons-“Hides” issues-Does not test database logic

Mocking

Pros-Unit test-Isolate concerns-FastCons-“Hides” issues-Does not test database logic

“Test” Database

Pros-Catches more issues-FamiliarCons-Slow-Not a “unit” test

“Test” Database

Pros-Catches more issues-FamiliarCons-Slow-Not a “unit” test

picking a camppicking a camp

Page 22: Building a Testable Data Access Layer Todd Anglin Chief Evangelist, Telerik Level: Intermediate.

UNIT TEST“Isolated. Repeatable. Fast.”

INTEGRATION TEST“Test interaction between units.”

FUNCTIONAL TEST“Test behavior from user perspective.”

Page 23: Building a Testable Data Access Layer Todd Anglin Chief Evangelist, Telerik Level: Intermediate.

mock testingmock testing

Goal: Test your business logic

B

Database Communication(ORM, ADO.NET, etc.)

Database Communication(ORM, ADO.NET, etc.)

RepositoryRepository

Business CodeBusiness Code

UI BehaviorsUI Behaviors ServicesServices

DatabaseDatabase

Page 24: Building a Testable Data Access Layer Todd Anglin Chief Evangelist, Telerik Level: Intermediate.

mockingmocking

• Stunt doubles for real objects– Look the same on the outside

Mocking Tools:JustMock (by Telerik)Isolator (by TypeMock)

MOQ (OSS)RhinoMocks (OSS)

Page 25: Building a Testable Data Access Layer Todd Anglin Chief Evangelist, Telerik Level: Intermediate.

AAA mocking patternAAA mocking pattern

//Arrange

Set-up your test variables and mocks

//Act

Execute your code like normal

//Assert

Verify what happened

Page 26: Building a Testable Data Access Layer Todd Anglin Chief Evangelist, Telerik Level: Intermediate.

DEMO: MOCKING DEMO: MOCKING DATABASEDATABASE

Testing L2S with Mock Objects

Page 27: Building a Testable Data Access Layer Todd Anglin Chief Evangelist, Telerik Level: Intermediate.

test databasetest database

Goal: Test your business logic + database behavior

A

Steps for every test:1.Create database schema + test data2. (Optional) Test database setup

correctly3.Execute unit test code4.Verify database behaved correctly

Page 28: Building a Testable Data Access Layer Todd Anglin Chief Evangelist, Telerik Level: Intermediate.

hard partshard parts

1. Creating test schema/data– DbUnit

2. Speed– In memory database

– SQL Lite, SQL CE, etc.

Page 29: Building a Testable Data Access Layer Todd Anglin Chief Evangelist, Telerik Level: Intermediate.

rules for test database testsrules for test database tests

1. Prior to running tests, schema should be redeployed to test DB (+ test data)

2. Tests should not change existing data– Edits, Deletes should be on records created by test

– Original data should be read-only

3. Tests should not depend on changes from previous tests

Page 30: Building a Testable Data Access Layer Todd Anglin Chief Evangelist, Telerik Level: Intermediate.

DEMO: TESTING WITH DEMO: TESTING WITH REAL DBREAL DB

Creating integration tests to talk to real database

Page 31: Building a Testable Data Access Layer Todd Anglin Chief Evangelist, Telerik Level: Intermediate.

should you test your DAL?should you test your DAL?

Page 32: Building a Testable Data Access Layer Todd Anglin Chief Evangelist, Telerik Level: Intermediate.

[email protected]@toddanglin

telerikwatch.com

Q&A

Page 33: Building a Testable Data Access Layer Todd Anglin Chief Evangelist, Telerik Level: Intermediate.

LinksLinks• 4GuysFromRolla on Testing DAL (2005)

– http://aspnet.4guysfromrolla.com/articles/040605-1.2.aspx

• Unit Testing the DAL (Java, but great discussion of DAL data testing)– http://www.buunguyen.net/blog/unit-testing-the-data-access-layer.html

• Roy Osherove on using Mocks for DAL testing– http://weblogs.asp.net/rosherove/archive/2003/09/30/29734.aspx

• SQL Lite project page– http://www.sqlite.org/docs.html– System.Data.SQLite: http://sqlite.phxsoftware.com/– http://www.mikeduncan.com/sqlite-on-dotnet-in-3-mins/– http://hendryluk.wordpress.com/2008/10/07/data-access-test-with-sqlite/

• DbUnit.NET (last updated 2006 – still alpha)– http://dbunit-net.sourceforge.net/GettingStarted.html

• SQL Server Compact 4 CTP1 (2010)– http://www.microsoft.com/downloads/details.aspx?FamilyID=0d2357ea-324f-46fd-88fc-7364c80e4fdb&displaylang=en– http://robtiffany.com/sql-server-compact/here-comes-sql-server-compact-4-0

• SQL Script to clear all tables in database– http://www.smallworkarounds.net/2009/02/script-to-delete-all-data-from-sql.html

• Microsoft.SqlServer.Management.Smo primer– http://davidhayden.com/blog/dave/archive/2006/01/27/2774.aspx– http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataproviders/thread/43e8bc3a-1132-453b-b950-09427e970f31

• Multi-tier L2S architecture ideas– http://blog.stevensanderson.com/2007/11/29/linq-to-sql-the-multi-tier-story/