I have been having some fun recently with TDD or Test Driven Development.
For those of you who who haven't experienced this development technique the concept is simple in theory, but is such a paradigm shift that it takes a bit of getting used to.
The idea is simple - the first thing you do is to write a test, and then develop the code until the test passes. The idea is that you only build what you need to get the test to pass. The results aof this process is that the code is "less bloated", and of course if done correctly every line of code can be tested independent of other components of the application.
There are a number of testing frameworks, NUnit, MBUnit and MSTest, and the Visual Studio testing tools, while they default to the built in Unit Testing framework can be configured to use the framework of your choice.
So how do you go about this in Visual Studio? The basic process is as follows, and assumes that we are starting from scratch. The details of the steps are left for the reader to research.
- Create a new Solution.
- Add a "Test" project - this is a special project template that automatically creates a "test" class wired up to use the Visual Studio Testing framework.
- The Class file will have a template class method with a "[TestMethod]" attribute. Add your test code to this method. For example - this is a test from an MVC project I am working on.
- Try and run the test. The test will not build as you haven't created the actual code yet, in this case the "IndividualsController" class and the List method.
- Addthe "real " project, add the class file and create the correct method signature - so the code builds.
- Try and run the test - this time the test should build - as long you created the method signature properly - but the test will fail as we haven't implemented the body of the method yet.
- Next implement the code body.
- Rerun the test - and if you implemented it correctly the test will pass.
Note that the code above is the current status of the method. In order to pass the test the only line neccessary is the first line and the last line. The if /else blocak was added to satisfy a second test.
While TDD purists would say you should do every step as outlined, most TDD developers in practice do not run the test at step (6) that they know will fail.
As you build up your tests, you will get a report like this
It really is cool to see all those "green" lights.
I have found that while it has taken me a little longer to build this project - as I learned to work with the new paradigm, I am now at the stage where adding a new feature is taking much less time as I do not find myself needing to browse to the test site to check the code is working. In fact, in this project I had something like 20 - 25 tests working before I even fired up the browser the first time, and as I had created tests that passed for all layers of the application, the browse test worked first time.
Phillip Beadle has been working on a module template to help guide module developers to create modules using this development paradigm - so if you are interested in this methodology keep checking back here for news.