It’s the start of a new week, so I thought I’d update my progress with the TDD Kata I mentioned last week.
By way of a quick recap the TDD Kata is a series of small programming tasks designed to help practice and develop skills in TDD, the full details can be found on the original post TDD-Kata-1 but I’m presenting the summary here:
- Create a simple String calculator with a method int Add(string numbers)
- The method can take 0, 1 or 2 numbers, and will return their sum (for an empty string it will return 0) for example “” or “1” or “1,2”
- Start with the simplest test case of an empty string and move to 1 and two numbers
- Remember to solve things as simply as possible so that you force yourself to write tests you did not think about
- Remember to refactor after each passing test
- Allow the Add method to handle an unknown amount of numbers
- Allow the Add method to handle new lines between numbers (instead of commas).
- the following input is ok: “1\n2,3” (will equal 6)
- the following input is NOT ok: “1,\n”
- Make sure you only test for correct inputs. there is no need to test for invalid inputs for these katas
- Allow the Add method to handle a different delimiter:
- to change a delimiter, the beginning of the string will contain a separate line that looks like this: “//[delimiter]\n[numbers…]” for example “//;\n1;2” should return three where the default delimiter is ‘;’ .
- the first line is optional. all existing scenarios should still be supported
- Calling Add with a negative number will throw an exception “negatives not allowed” - and the negative that was passed. If there are multiple negatives, show all of them in the exception message
Stop here if you are a beginner. Continue if you can finish the steps so far in less than 30 minutes.
- Numbers bigger than 1000 should be ignored, so adding 2 + 1001 = 2
- Delimiters can be of any length with the following format: “//[delimiter]\n” for example: “//***\n1***2***3” should return 6
- Allow multiple delimiters like this: “//[delim1][delim2]\n” for example “//[*][%]\n1*2%3” should return 6.
- make sure you can also handle multiple delimiters with length longer than one char
The idea is that by practicing the same techniques over and over that you’ll ingrain them and they soon feel like second nature to you.
So how am I doing?
Well, without wanting to make too many excuses about Visual Studio taking forever to load up the Add Reference dialogue or struggling with adding projects (I have asked for a more powerful machine at work, but so far no joy), I always complete step 2 and with good refactoring – and getting this far seems to take me about 15-20 minutes. Step 3 however seems to be my nemesis. I haven’t, yet, found a way I’m happy with to allow a newline delimiter as well as a comma, it really is like trying to run in treacle – all progress stops. That said I am doing everything without using my mouse – I’m quite pleased with that; also as I said, I’m refactoring well, so nice, small, well named methods and I am doing TDD and it is starting to feel quite normal to write a test then follow the Red, Green, Refactor path.
What am I going to do about getting past my road block?
There are a number of video run throughs of the kata that I can learn from, going back to the martial arts metaphor this is like watching the senior students practicing – I can try to imitate their techniques and learn from their approaches. The two that appeal to me are Andrew Woodward doing the kata mouseless in .NET with NUnit and The kata in .NET with XUnit because they’re both done mouselessly and in .Net. I like Andrew’s approach because he is practicing Uncle Bob’s ‘refactor till you drop’ and I’ve just watched a good presentation by Uncle Bob on Bad Code, Craftsmanship, Engineering and Certification which mentioned it and it struck a chord with me.
Bobby Johnson’s demonstration (the kata in .NET with XUnit) is nice because he is using some nice new language features like LINQ that make his code nice and terse. Also he’s using XUnit and I’d like to give that a try soon.
| Categories: Development | UnitTesting