Building a Testable Data Access Layer
In this informative session, Todd Anglin, Chief Evangelist at Telerik, explores the design and construction of a Testable Data Access Layer (DAL). Discover the essential concepts behind a data layer, learn the benefits of decoupling your application from the persistence layer for better maintenance and testability, and examine popular patterns like Repositories and ActiveRecord. Gain insights into testing strategies, including unit tests, integration tests, and the use of mocking tools. Equip yourself with the knowledge to create a robust and flexible data access layer that enhances application performance.
Building a Testable Data Access Layer
E N D
Presentation Transcript
Building a Testable Data Access Layer Todd Anglin Chief Evangelist, Telerik Level: Intermediate
Introductions Todd Anglin Chief Evangelist, Telerik Microsoft MVP ASP Insider President NHDNUG & O’Reilly Author TelerikWatch.com @toddanglin
Data Layer Responsible for talking to “persistence layer” Presentation Web Desktop Service Domain Logic(“the code that makes you money”) Data / Model Persistence Database Cloud XML Etc.
why build a data layer? what’s the benefit?
importance of data layer • Decouple application from persistence = easier maintenance = improved testability = greater reusability
Presentation Web Desktop Service Domain Logic(“the code that makes you money”) Data Persistence Database Cloud XML Etc.
Handles all data access • Hides implementation • Flexible • Easy to refactor
Does not centralize data access • Makes application very dependent on persistent store • Easy*
By Hand • Pros • POCO • YAGNI • No-RTFM • Cons • Time • No FM • ORM • Pros • Time • Flexible • Cons • Learning • Limits • Trust*
data 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
two testing camps A B Test Database 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
“Test” Database • Pros • Catches more issues • Familiar • Cons • Slow • Not a “unit” test • Mocking • Pros • Unit test • Isolate concerns • Fast • Cons • “Hides” issues • Does not test database logic picking a camp
UNIT TEST “Isolated. Repeatable. Fast.” INTEGRATION TEST “Test interaction between units.” FUNCTIONAL TEST “Test behavior from user perspective.”
B mock testing Goal: Test your business logic UI Behaviors Services Business Code Repository Database Communication(ORM, ADO.NET, etc.) Database
mocking • Stunt doubles for real objects • Look the same on the outside Mocking Tools: JustMock (by Telerik) Isolator (by TypeMock) MOQ (OSS) RhinoMocks (OSS)
AAA mocking pattern //Arrange Set-up your test variables and mocks //Act Execute your code like normal //Assert Verify what happened
Testing L2S with Mock Objects DEMO: MOCKING DATABASE
A test database Goal: Test your business logic + database behavior • Steps for every test: • Create database schema + test data • (Optional) Test database setup correctly • Execute unit test code • Verify database behaved correctly
hard parts • Creating test schema/data • DbUnit • Speed • In memory database • SQL Lite, SQL CE, etc.
rules for test database tests • Prior to running tests, schema should be redeployed to test DB (+ test data) • Tests should not change existing data • Edits, Deletes should be on records created by test • Original data should be read-only • Tests should not depend on changes from previous tests
Creating integration tests to talk to real database DEMO: TESTinG with real DB
Q&A anglin@telerik.com @toddanglin telerikwatch.com
Links • 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/