Fortsätt till huvudinnehåll

Does TDD really improve software quality?

I have asked myself this question several times, and searched for answers, without coming up with any clear answer. Therefore I have decided to go hard core TDD for a longer period of time (at least 6 months) to really evaluate the effects.

There are several things that I find confusing when it comes to TDD. One example is what actually defines a unit test. What is a "unit" anyway? After reading a bit about it I found a text claiming that the "unit" is "a unit of work", i.e. something quite small. Like converting a string to UPPERCASE or splitting a string into an ['a','r', 'r', 'a', 'y'] of chars. This work is usually performed by a single call to a single method in a single, isolated, class.

So, what does it mean that a class is isolated? Does it mean that it doesn't have any dependencies to other classes? NO! In the context of TDD it means that any dependencies are supplied by the test environment, for example by using mock objects (fakes, stubs, etc). What you are after is the ability to be able to control how the dependencies behave when being called from the class that is under test.

But how do you do that? Well one common pattern is to use is Dependency Injection (DI) and design your classes to be dependent on "contracts" (i.e. abstractions such as Interfaces) rather than concrete implementations. By injecting, abstract, dependencies rather than having each class constructing the dependencies itself, you are able to create fake, mocked, dependencies that you have total control over.

The list of things to consider in order to make your code "testable" goes on and, as you might have understood by now, forces you to structure your code very differently from how you would have done it if not considering testibility.

So, is all this worth the effort? Many claims that it is. Some claims it is just rubbish. Guess there is only one way to find out!

Kommentarer

  1. I'm back!
    Intressant!
    Blir spännande att följa din TDD-resa. Kan du se till att ha månadsvis uppdatering om hur det går? :)

    SvaraRadera

Skicka en kommentar

Populära inlägg i den här bloggen

Codility tasks - Part I

I was recently faced with two codility tasks when applying for a job as an Embedded Software Engineer. For those of you who arn't familiar with Codility you can check out their website here:  www.codility.com Task one - Dominator The first task was called Dominator. The goal was to, given a std::vector of integers, find an integer that occurs in more than half of the positions in the vector. If no dominator was found -1 should be returned. My approach was to loop through the vector from the first to the last element, using a std::map to count the number of occurences of each integer. If the count ever reached above half the size of the vector I stopped and returned that integer and if I reached the end without finding a dominator I returned -1. So was that a good approach? Well, the reviewer at the company rated the solution as 'pretty ok'. His preferred solution was store the first integer in the array and set a counter to 1. Then loop through the remaining i

C# Enum as bit field

Bit field enum Whenever you wish to express combinations of properties of an object, bit fields are a good way to accomplish this. As a simple example, consider a file in the file system. It can be Readable , Writable , Hidden or a combination these. The different attributes can be defined as an enum : [Flags] public enum FileAttribute {   None      = 0b0000;   Readable  = 0b0001;   Writeable = 0b0010;   Hidden    = 0b0100; } To indicate that this enum is expected to be used as a bit field I have defined it with the FlagsAttribute . It is important to understand that the FlagsAttribute does nothing more than making some changes to how the ToString method of the enum works, making it possible to print out all flags. It does not introduce any validation or special treatment of the enum in any other way. I have defined the values of the different fields of the enum using binary representation, this should make it even more clear that this is a bit field and which bi