SlideShare a Scribd company logo
Test-Driven Database Development with DataDudeCory Foyhttp://coryfoy.com | @cory_foy
AgendaOverviewFeaturesDemosAvailabilityOther Tools
AgendaOverviewFeaturesDemosAvailabilityOther Tools
Overview – TDDTDD == Test-Driven DevelopmentDeveloper Design TechniqueRed-Green-RefactorWrite a failing testWrite just enough code to make it passRefactor any duplication
Overview – TDD in DBsWhy is agility at the database so hard?Control / Permission issuesTightly coupled applicationsNo good testing toolsData Migration issuesIf it hurts, do it more
Overview – Agile DefinedAgile ManifestoIndividuals and Interactions over Processes and ToolsWorking Software over Comprehensive DocumentationResponding to Change over Following a PlanCustomer Collaboration over Contract Negotiation
Overview – Agile DefinedAgile ManifestoDon’t rely on tools and processes to save youTalk to your data experts, your developersFind common groundMake incremental improvementsBuild a safety net
Overview – Goals of DataDudeIntegrated Change Management for DB AppsProvide Tools toManage DB ProjectsAssess effects of changes to the DBHelp work in an isolated environmentHelp test Updated SolutionsSimplify the deployment of changesFacilitate Collaborative Development
Overview - EditionsDataDude (2005) (Add on to VSTS)Team Edition for Database Professionals (2008) Visual Studio Team System Database Edition (2010)Comes for free with VSTS Developer Edition
Overview - TasksCreate and Deploy DBs under version controlPut existing DBs under version controlModify Offline Representations and deployCompare Schemas and Data between DBsDevelop and run unit tests against DB ObjectsGenerate repeatable test dataRefactor database changes across the DB
AgendaOverviewFeaturesDemosAvailabilityOther Tools
FeaturesVersion Control DatabaseVC a new or existing databaseRefactorCompare DBsGenerate Deployment ScriptUnit Test DatabaseTDD Schema ChangesTDD Business Logic ChangeGenerate Test Data
AgendaOverviewFeaturesDemosAvailabilityOther Tools
Demo – Version Control DatabaseCory Foyhttp://coryfoy.com | @cory_foy
Version Control DatabaseExisting SchemaTwo Tables  - Msgs, UsersTwo Stored Procs - PostMsg: Posts a message for a specific user to the database. Take a UserID and varchar message as a parameter - UserInfo: Takes a UserID and returns back all of the user information, including how many posts they’ve made
Version Control DatabaseGet Database Under Version Control
Version Control DatabaseYou now have an isolated copy you can work with that doesn’t change the source database
Version Control DatabaseWe want to change “Msg” to “Neet” everywhere it exists in the database.This will require a change to the Msg column in the Msgs table, renaming the Msgs table itself, and updating the Stored Procs.We could do it by hand, or we could use the refactoring tools built in.
Version Control DatabaseWe use the Refactoring Option to rename the column, and by selecting “Preview Changes” it shows us what it is going to do
Version Control DatabaseWe can even see the change in the context of the DDL by clicking on the change in the preview window.When we click on Apply, the change is made to the version controlled local copy.
Version Control DatabaseWe also need to change the table name, so we can use refactor for that as well.It detects the need to update the constraints as well
Version Control DatabaseChanging the Stored Proc name can also be done through RefactoringBut changes to the values returned from the UserInfo stored proc would have to be done by hand. Also note that the refactorings only look at the database – not your code which accesses or uses the database
Version Control DatabaseWe can now compare the schema changes to see how this would deploy it to the database
Version Control DatabaseBy Default, choosing to deploy creates a script which can be run to do the actual deploy
Version Control DatabaseWe can also choose to have it automatically deploy to a database. For example, here we have it deploying to a local SQLEXPRESS DatabaseAnd everything should still work (meaning no data loss)
Demo – Unit Test DatabaseCory Foyhttp://coryfoy.com | @cory_foy
Unit Test DatabaseWe have a new requirement for scalability. Instead of doing a count for user_info, we want a new table which just has a user_id and count. This field should be updated on every Neet by the user, and should be the one queried to get the current Neet count.But, we want to make sure that all of our existing scripts work. Unit Testing to the rescue!Add a new Test Project to our Solution, then delete the UnitTest1.cs file. Then right-click on the Test Project, do a New->Add Item, and select Data -> Database Unit Test. Name it NewNeetUpdatesNeetCount
Unit Test DatabaseDatabase Unit Tests execute against a real database connection. So we’ll need to tell it which database to execute against.Note that in this screen we can Execute the tests using one connection, and validate using a different one. This is important when you have your production code which uses a limited access user.We’ll also have it automatically deploy the project to the database before the tests are run
Unit Test DatabaseWe now see the DB Test screen. Note that we can have Pre-test, Test and Post-test scripts. These can be used for setting the database into specific states. All tests are written in SQL, and then validated by the Test Conditions at the bottom of the screen.
Unit Test DatabaseWhat we’re wanting to test is that, with an existing user who as Neet’d before, when we call the PostNeet stored procedure, that the NeetCount table is updated. So our test will look something like this (Arrange, Act, Assert)We’ll then need to remove the default test condition (by clicking the Red x)Then we’ll choose “Scalar Value” from the drop down and hit the plus sign, configuring it to expect that the last query our test runs will return the value “1” in Row 1, Column 1
Unit Test DatabaseNext, we’ll run the test using the built-in runner. Note that the first time you run the tests, it will be slow because it has to synchronize some information.You’ll see the test failed, and if you right-click on the test and say “View Test Result Details” you can see the exact error messageThe error is that we don’t actually have a table called NeetCount. Well, this will never do, let’s add it.
Unit Test DatabaseSo, do we go to the database? Nope – we make the change right from our project. In our schema view, we click on the Tables node, then choose Add->Table. We’ll name it NeetCount so we stand a chance of having our unit tests pass.We’ll also fill out the DDL to have the columns we are looking for and save it.
Unit Test DatabaseNow we’ll rerun our tests. And they fail again. But for a different reason this timeYep. Our table is there, but nothing is being inserted. How did our table get there? Remember that when we setup the test we told it to deploy the DB project before running tests. So it added the table to the database before running the tests – just by us clicking Run.
Unit Test DatabaseNow that our unit test is failing for logic reasons, we can make the change to the stored procedure. Again, we change it by opening it from the Schema view rather than changing the database directly. But look at the proc. We’ve found our first business decision – at what point should UserID records get inserted into NeetCount?It’s decided that upon user creation a record will get inserted in, and that we’ll need a migration effort to move existing records. With those taken care of, we can focus back on modifying this Proc.(Yes, we’re ignoring transactions, etc for now)
Unit Test DatabaseAfter updating our test database with the migration of data, we can rerun our testsAnd everything runs succesfully! Now we know that post a Neet updates the correct count. It’s now time to make sure that UserInfo is pulling the information from the right table
Unit Test DatabaseWe create another Database Unit Test called UserInfoGetsCountFromNeetCount. We’ll update the NeetCount for our test user, then execute the UserInfo and we should see the updated count. We’ll start with choosing the Pre-test option and filling it in, then setting the actual test upAnd running our tests shows it fails for the “right” reason
Unit Test DatabaseSo now we’ll modify our UserInfo stored proc to make the test pass.And it does!
Unit Test DatabaseWhile what we’ve done works, it is better to capture the logic of a change like this in a way that shows the business value and the coupling. Let’s create a new Database Unit Test and call it EnhanceUserInformationPerformance. We’ll add two tests in this for the two conditions we covered previously. Use the Rename button to rename the first test, then click the plus sign to add the second test. Copy over the logic for each from the previous tests, making sure to include the Test Conditions and PreTests
Unit Test DatabaseNow let’s make sure they run. Go to Test->Run All Tests in Solution and they should all pass. Now, let’s delete the first two tests we created in favor of this new combined test, and rerun all of our tests to make sure.All well and good so far. But we should write one more test which does everything end-to-end
Unit Test DatabaseAdd a new Database Unit Test and call it NewNeetUpdatesUserInfo. We’ll use a temp table to capture the results of the UserInfo to compare against our expected values. Note that you *can’t* do this in pre/post test since those run in different connections, therefore the variables can’t be shared. So run the tests and see it green.Right?Or not. So what happened? Remember our Unit Test which updated the NeetTable directly? It’s polluted our DB, which invalidates our results.
Unit Test DatabaseTo get around that, we need to either run things in transactions (which we have to do all in the Test Script) or back our changes out. In this case, we’ll just revert the changes at the end of the script in Post Test. So modify the UserInfoGetsCountFromNeetCount test and add the following to Post-testNow go to Test->Run-> All Tests in Solution and what do we see?That’s much better
Unit Test DatabaseOne thing to note about the Database tests – they are all just code and xml underneath. For example, right-clicking on one of our tests and saying “View Code” shows the “magic” happening underneathThese are just MSTest unit tests, so you can drop to the code level if there are special things you need to do with the tests.
Demo – Generating DataCory Foyhttp://coryfoy.com | @cory_foy
Generating DataIn our last demo, we saw the challenges data can cause us. We can use the data generation tool to help us populate the information in our database. Right-Click on the Knitter project in Solution Explorer and choose Add-> Data Generation Plan, then name it TestData. If you click on dbo.Neets, you’ll see that UserID shows as a Foreign Key, but it doesn’t in dbo.NeetCount (because we didn’t add it). Fix that by Right-Clicking on the NeetCount table in Schema View and choosing Add->Foreign Key. Once you’ve filled it in, deploy it, then refresh the data plan
Generating DataNeetCount.totalNeets is effectively a computed field, but it’s not. So make sure the generator is Integer, and change the properties to be Max and Min of 1We also only want our usernames (UserID in the Users table) to only be AlphaNumeric. So change the generator for that column to be Regular Expression, and in the Properties window, enter [a-zA-Z0-9]*_[a-zA-Z0-9]* then right-click on the UserID row and choose “Preview Data Generation”. As you can see, the characters run the gamut.
Generating DataWith our test plan in place, we can have our unit tests use it automatically. Go to Test->Database Test Configuration and check the “Generate Test Data” box.Now whenever the tests are run, the data is generated automatically.Let’s rerun our tests to show the difference.What a difference! They all fail because there is no UserID “1” in the database.
Generating DataTo fix that, we’ll update the tests to select the top user from the users table, making sure we update all 3 tests, and the pre and post tests where necessary.And that looks much better
Generating DataIf we do an actual query in our test database, we’ll see that indeed the values get inserted thereThe Database Edition comes with several generators – for each type, the Regular Expression generator, and Databound generators which can pull data from any connection – other databases, Excel files, CSV files, etc.
AgendaOverviewFeaturesDemosAvailabilityOther Tools
AvailabilityAvailable in VS2005, VS2008 and VS2010Requires a Team Edition of Visual StudioComes with the Team Edition for Software Developers
AvailabilitySupports SQL 2000, 2005 and 2008Plans are in place to provide data bindings for other platforms but no timeline
AgendaOverviewFeaturesDemosAvailabilityOther Tools
Other ToolsDBFitSupports Oracle, DB2, SQL Server and MySQLFree of chargeAdd on to the FitNesse testing frameworkhttp://www.fitnesse.info/dbfit:referencehttp://gojko.net/fitnesse/dbfit/
Other ToolsAnyDbTestSupports Oracle, SQL Server and MySQLUses XML as the backinghttp://www.anydbtest.com/
Other ToolsAgile Data – Scott AmblerAgile Database TechniquesRefactoring Databaseshttp://www.agiledata.org
More Informationhttp://msdn.microsoft.com/teamsystemhttp://www.infoq.com/articles/tdd-dbpro-Foyhttp://blog.coryfoy.com/2007/07/test-driving-stored-procedures-in-sql-server-in-vs2008/http://www.coryfoy.comfoyc at coryfoy dot com@cory_foy on TwitterSlides will be posted on CoryFoy.com

More Related Content

DOCX
A Complex SSIS Package
PDF
A-Project Report- SSIS
DOCX
MS BI SSIS Project Portfolio
PPT
Intro to tsql
PPTX
Change tracking
PDF
Database Connection Pane
PPTX
Sql server etl framework
PPTX
Hands on training on DbFit Part-II
A Complex SSIS Package
A-Project Report- SSIS
MS BI SSIS Project Portfolio
Intro to tsql
Change tracking
Database Connection Pane
Sql server etl framework
Hands on training on DbFit Part-II

Similar to Test Driven Database Development With Data Dude (20)

PPT
Automated Testing with Databases
PPTX
[TestWarez 2017] Behavior Driven Development in a complex environment - Consu...
PPTX
performancetestingjmeter-121109061704-phpapp02
PPTX
performancetestingjmeter-121109061704-phpapp02 (1)
PPT
Testing Software Solutions
PPTX
Introduction to testing.
PPT
Qtp 92 Tutorial769
PPT
qtp 9.2 features
PPT
Qtp 92 Tutorial
PPT
Ppt Qtp
PPT
Qtp 92 Tutorial769
PPT
Qtp 92 Tutorial Anil
PPT
Qtp 92 Tutorial769
PPT
Qtp 9.2 Tutorial
PPTX
QTP_PRESENTATION_Andy
PDF
Test automation
PPT
Performance testing and j meter
PPS
Database Testing
PDF
Performancetestingjmeter 121109061704-phpapp02
PDF
MSSQL Queries.pdf
Automated Testing with Databases
[TestWarez 2017] Behavior Driven Development in a complex environment - Consu...
performancetestingjmeter-121109061704-phpapp02
performancetestingjmeter-121109061704-phpapp02 (1)
Testing Software Solutions
Introduction to testing.
Qtp 92 Tutorial769
qtp 9.2 features
Qtp 92 Tutorial
Ppt Qtp
Qtp 92 Tutorial769
Qtp 92 Tutorial Anil
Qtp 92 Tutorial769
Qtp 9.2 Tutorial
QTP_PRESENTATION_Andy
Test automation
Performance testing and j meter
Database Testing
Performancetestingjmeter 121109061704-phpapp02
MSSQL Queries.pdf
Ad

More from Cory Foy (20)

PDF
Defending Commoditization: Mapping Gameplays and Strategies to Stay Ahead in ...
PDF
Stratgic Play - Doing the Right Thing at the Right Time
PDF
Continuous Deployment and Testing Workshop from Better Software West
PDF
Choosing Between Scrum and Kanban - TriAgile 2015
PDF
Code Katas
PDF
Distributed Agility
PDF
Scaling Agility
PDF
Kanban for DevOps
PDF
Ruby and OO for Beginners
PDF
Agile Roots: The Agile Mindset - Agility Across the Organization
PDF
Triangle.rb - How Secure is Your Rails Site, Anyway?
PDF
Scrum vs Kanban - Implementing Agility at Scale
PDF
SQE Boston - When Code Cries
PDF
GOTO Berlin - When Code Cries
PDF
Rails as a Pattern Language
PDF
Patterns in Rails
PDF
Agile Demystified
KEY
When Code Cries
PPT
Ruby for C# Developers
PPT
Getting Unstuck: Working with Legacy Code and Data
Defending Commoditization: Mapping Gameplays and Strategies to Stay Ahead in ...
Stratgic Play - Doing the Right Thing at the Right Time
Continuous Deployment and Testing Workshop from Better Software West
Choosing Between Scrum and Kanban - TriAgile 2015
Code Katas
Distributed Agility
Scaling Agility
Kanban for DevOps
Ruby and OO for Beginners
Agile Roots: The Agile Mindset - Agility Across the Organization
Triangle.rb - How Secure is Your Rails Site, Anyway?
Scrum vs Kanban - Implementing Agility at Scale
SQE Boston - When Code Cries
GOTO Berlin - When Code Cries
Rails as a Pattern Language
Patterns in Rails
Agile Demystified
When Code Cries
Ruby for C# Developers
Getting Unstuck: Working with Legacy Code and Data
Ad

Recently uploaded (20)

DOCX
The AUB Centre for AI in Media Proposal.docx
PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PDF
Machine learning based COVID-19 study performance prediction
PPTX
ACSFv1EN-58255 AWS Academy Cloud Security Foundations.pptx
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PDF
NewMind AI Weekly Chronicles - August'25-Week II
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
Assigned Numbers - 2025 - Bluetooth® Document
PPTX
A Presentation on Artificial Intelligence
PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
PPTX
Machine Learning_overview_presentation.pptx
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PDF
Approach and Philosophy of On baking technology
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PDF
Review of recent advances in non-invasive hemoglobin estimation
PDF
Unlocking AI with Model Context Protocol (MCP)
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
The AUB Centre for AI in Media Proposal.docx
Agricultural_Statistics_at_a_Glance_2022_0.pdf
20250228 LYD VKU AI Blended-Learning.pptx
Machine learning based COVID-19 study performance prediction
ACSFv1EN-58255 AWS Academy Cloud Security Foundations.pptx
Advanced methodologies resolving dimensionality complications for autism neur...
NewMind AI Weekly Chronicles - August'25-Week II
Dropbox Q2 2025 Financial Results & Investor Presentation
Diabetes mellitus diagnosis method based random forest with bat algorithm
Assigned Numbers - 2025 - Bluetooth® Document
A Presentation on Artificial Intelligence
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
Machine Learning_overview_presentation.pptx
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
Approach and Philosophy of On baking technology
Chapter 3 Spatial Domain Image Processing.pdf
Mobile App Security Testing_ A Comprehensive Guide.pdf
Review of recent advances in non-invasive hemoglobin estimation
Unlocking AI with Model Context Protocol (MCP)
Building Integrated photovoltaic BIPV_UPV.pdf

Test Driven Database Development With Data Dude

  • 1. Test-Driven Database Development with DataDudeCory Foyhttp://coryfoy.com | @cory_foy
  • 4. Overview – TDDTDD == Test-Driven DevelopmentDeveloper Design TechniqueRed-Green-RefactorWrite a failing testWrite just enough code to make it passRefactor any duplication
  • 5. Overview – TDD in DBsWhy is agility at the database so hard?Control / Permission issuesTightly coupled applicationsNo good testing toolsData Migration issuesIf it hurts, do it more
  • 6. Overview – Agile DefinedAgile ManifestoIndividuals and Interactions over Processes and ToolsWorking Software over Comprehensive DocumentationResponding to Change over Following a PlanCustomer Collaboration over Contract Negotiation
  • 7. Overview – Agile DefinedAgile ManifestoDon’t rely on tools and processes to save youTalk to your data experts, your developersFind common groundMake incremental improvementsBuild a safety net
  • 8. Overview – Goals of DataDudeIntegrated Change Management for DB AppsProvide Tools toManage DB ProjectsAssess effects of changes to the DBHelp work in an isolated environmentHelp test Updated SolutionsSimplify the deployment of changesFacilitate Collaborative Development
  • 9. Overview - EditionsDataDude (2005) (Add on to VSTS)Team Edition for Database Professionals (2008) Visual Studio Team System Database Edition (2010)Comes for free with VSTS Developer Edition
  • 10. Overview - TasksCreate and Deploy DBs under version controlPut existing DBs under version controlModify Offline Representations and deployCompare Schemas and Data between DBsDevelop and run unit tests against DB ObjectsGenerate repeatable test dataRefactor database changes across the DB
  • 12. FeaturesVersion Control DatabaseVC a new or existing databaseRefactorCompare DBsGenerate Deployment ScriptUnit Test DatabaseTDD Schema ChangesTDD Business Logic ChangeGenerate Test Data
  • 14. Demo – Version Control DatabaseCory Foyhttp://coryfoy.com | @cory_foy
  • 15. Version Control DatabaseExisting SchemaTwo Tables - Msgs, UsersTwo Stored Procs - PostMsg: Posts a message for a specific user to the database. Take a UserID and varchar message as a parameter - UserInfo: Takes a UserID and returns back all of the user information, including how many posts they’ve made
  • 16. Version Control DatabaseGet Database Under Version Control
  • 17. Version Control DatabaseYou now have an isolated copy you can work with that doesn’t change the source database
  • 18. Version Control DatabaseWe want to change “Msg” to “Neet” everywhere it exists in the database.This will require a change to the Msg column in the Msgs table, renaming the Msgs table itself, and updating the Stored Procs.We could do it by hand, or we could use the refactoring tools built in.
  • 19. Version Control DatabaseWe use the Refactoring Option to rename the column, and by selecting “Preview Changes” it shows us what it is going to do
  • 20. Version Control DatabaseWe can even see the change in the context of the DDL by clicking on the change in the preview window.When we click on Apply, the change is made to the version controlled local copy.
  • 21. Version Control DatabaseWe also need to change the table name, so we can use refactor for that as well.It detects the need to update the constraints as well
  • 22. Version Control DatabaseChanging the Stored Proc name can also be done through RefactoringBut changes to the values returned from the UserInfo stored proc would have to be done by hand. Also note that the refactorings only look at the database – not your code which accesses or uses the database
  • 23. Version Control DatabaseWe can now compare the schema changes to see how this would deploy it to the database
  • 24. Version Control DatabaseBy Default, choosing to deploy creates a script which can be run to do the actual deploy
  • 25. Version Control DatabaseWe can also choose to have it automatically deploy to a database. For example, here we have it deploying to a local SQLEXPRESS DatabaseAnd everything should still work (meaning no data loss)
  • 26. Demo – Unit Test DatabaseCory Foyhttp://coryfoy.com | @cory_foy
  • 27. Unit Test DatabaseWe have a new requirement for scalability. Instead of doing a count for user_info, we want a new table which just has a user_id and count. This field should be updated on every Neet by the user, and should be the one queried to get the current Neet count.But, we want to make sure that all of our existing scripts work. Unit Testing to the rescue!Add a new Test Project to our Solution, then delete the UnitTest1.cs file. Then right-click on the Test Project, do a New->Add Item, and select Data -> Database Unit Test. Name it NewNeetUpdatesNeetCount
  • 28. Unit Test DatabaseDatabase Unit Tests execute against a real database connection. So we’ll need to tell it which database to execute against.Note that in this screen we can Execute the tests using one connection, and validate using a different one. This is important when you have your production code which uses a limited access user.We’ll also have it automatically deploy the project to the database before the tests are run
  • 29. Unit Test DatabaseWe now see the DB Test screen. Note that we can have Pre-test, Test and Post-test scripts. These can be used for setting the database into specific states. All tests are written in SQL, and then validated by the Test Conditions at the bottom of the screen.
  • 30. Unit Test DatabaseWhat we’re wanting to test is that, with an existing user who as Neet’d before, when we call the PostNeet stored procedure, that the NeetCount table is updated. So our test will look something like this (Arrange, Act, Assert)We’ll then need to remove the default test condition (by clicking the Red x)Then we’ll choose “Scalar Value” from the drop down and hit the plus sign, configuring it to expect that the last query our test runs will return the value “1” in Row 1, Column 1
  • 31. Unit Test DatabaseNext, we’ll run the test using the built-in runner. Note that the first time you run the tests, it will be slow because it has to synchronize some information.You’ll see the test failed, and if you right-click on the test and say “View Test Result Details” you can see the exact error messageThe error is that we don’t actually have a table called NeetCount. Well, this will never do, let’s add it.
  • 32. Unit Test DatabaseSo, do we go to the database? Nope – we make the change right from our project. In our schema view, we click on the Tables node, then choose Add->Table. We’ll name it NeetCount so we stand a chance of having our unit tests pass.We’ll also fill out the DDL to have the columns we are looking for and save it.
  • 33. Unit Test DatabaseNow we’ll rerun our tests. And they fail again. But for a different reason this timeYep. Our table is there, but nothing is being inserted. How did our table get there? Remember that when we setup the test we told it to deploy the DB project before running tests. So it added the table to the database before running the tests – just by us clicking Run.
  • 34. Unit Test DatabaseNow that our unit test is failing for logic reasons, we can make the change to the stored procedure. Again, we change it by opening it from the Schema view rather than changing the database directly. But look at the proc. We’ve found our first business decision – at what point should UserID records get inserted into NeetCount?It’s decided that upon user creation a record will get inserted in, and that we’ll need a migration effort to move existing records. With those taken care of, we can focus back on modifying this Proc.(Yes, we’re ignoring transactions, etc for now)
  • 35. Unit Test DatabaseAfter updating our test database with the migration of data, we can rerun our testsAnd everything runs succesfully! Now we know that post a Neet updates the correct count. It’s now time to make sure that UserInfo is pulling the information from the right table
  • 36. Unit Test DatabaseWe create another Database Unit Test called UserInfoGetsCountFromNeetCount. We’ll update the NeetCount for our test user, then execute the UserInfo and we should see the updated count. We’ll start with choosing the Pre-test option and filling it in, then setting the actual test upAnd running our tests shows it fails for the “right” reason
  • 37. Unit Test DatabaseSo now we’ll modify our UserInfo stored proc to make the test pass.And it does!
  • 38. Unit Test DatabaseWhile what we’ve done works, it is better to capture the logic of a change like this in a way that shows the business value and the coupling. Let’s create a new Database Unit Test and call it EnhanceUserInformationPerformance. We’ll add two tests in this for the two conditions we covered previously. Use the Rename button to rename the first test, then click the plus sign to add the second test. Copy over the logic for each from the previous tests, making sure to include the Test Conditions and PreTests
  • 39. Unit Test DatabaseNow let’s make sure they run. Go to Test->Run All Tests in Solution and they should all pass. Now, let’s delete the first two tests we created in favor of this new combined test, and rerun all of our tests to make sure.All well and good so far. But we should write one more test which does everything end-to-end
  • 40. Unit Test DatabaseAdd a new Database Unit Test and call it NewNeetUpdatesUserInfo. We’ll use a temp table to capture the results of the UserInfo to compare against our expected values. Note that you *can’t* do this in pre/post test since those run in different connections, therefore the variables can’t be shared. So run the tests and see it green.Right?Or not. So what happened? Remember our Unit Test which updated the NeetTable directly? It’s polluted our DB, which invalidates our results.
  • 41. Unit Test DatabaseTo get around that, we need to either run things in transactions (which we have to do all in the Test Script) or back our changes out. In this case, we’ll just revert the changes at the end of the script in Post Test. So modify the UserInfoGetsCountFromNeetCount test and add the following to Post-testNow go to Test->Run-> All Tests in Solution and what do we see?That’s much better
  • 42. Unit Test DatabaseOne thing to note about the Database tests – they are all just code and xml underneath. For example, right-clicking on one of our tests and saying “View Code” shows the “magic” happening underneathThese are just MSTest unit tests, so you can drop to the code level if there are special things you need to do with the tests.
  • 43. Demo – Generating DataCory Foyhttp://coryfoy.com | @cory_foy
  • 44. Generating DataIn our last demo, we saw the challenges data can cause us. We can use the data generation tool to help us populate the information in our database. Right-Click on the Knitter project in Solution Explorer and choose Add-> Data Generation Plan, then name it TestData. If you click on dbo.Neets, you’ll see that UserID shows as a Foreign Key, but it doesn’t in dbo.NeetCount (because we didn’t add it). Fix that by Right-Clicking on the NeetCount table in Schema View and choosing Add->Foreign Key. Once you’ve filled it in, deploy it, then refresh the data plan
  • 45. Generating DataNeetCount.totalNeets is effectively a computed field, but it’s not. So make sure the generator is Integer, and change the properties to be Max and Min of 1We also only want our usernames (UserID in the Users table) to only be AlphaNumeric. So change the generator for that column to be Regular Expression, and in the Properties window, enter [a-zA-Z0-9]*_[a-zA-Z0-9]* then right-click on the UserID row and choose “Preview Data Generation”. As you can see, the characters run the gamut.
  • 46. Generating DataWith our test plan in place, we can have our unit tests use it automatically. Go to Test->Database Test Configuration and check the “Generate Test Data” box.Now whenever the tests are run, the data is generated automatically.Let’s rerun our tests to show the difference.What a difference! They all fail because there is no UserID “1” in the database.
  • 47. Generating DataTo fix that, we’ll update the tests to select the top user from the users table, making sure we update all 3 tests, and the pre and post tests where necessary.And that looks much better
  • 48. Generating DataIf we do an actual query in our test database, we’ll see that indeed the values get inserted thereThe Database Edition comes with several generators – for each type, the Regular Expression generator, and Databound generators which can pull data from any connection – other databases, Excel files, CSV files, etc.
  • 50. AvailabilityAvailable in VS2005, VS2008 and VS2010Requires a Team Edition of Visual StudioComes with the Team Edition for Software Developers
  • 51. AvailabilitySupports SQL 2000, 2005 and 2008Plans are in place to provide data bindings for other platforms but no timeline
  • 53. Other ToolsDBFitSupports Oracle, DB2, SQL Server and MySQLFree of chargeAdd on to the FitNesse testing frameworkhttp://www.fitnesse.info/dbfit:referencehttp://gojko.net/fitnesse/dbfit/
  • 54. Other ToolsAnyDbTestSupports Oracle, SQL Server and MySQLUses XML as the backinghttp://www.anydbtest.com/
  • 55. Other ToolsAgile Data – Scott AmblerAgile Database TechniquesRefactoring Databaseshttp://www.agiledata.org