Follow @RoyOsherove on Twitter

Test Coverage and testing angles

How do you know if you have good coverage on your new code?

Try and remove a line or a constraint check. If all tests still pass – you don't have enough code coverage and you probably need to add another unit test.

The best way to make sure you are adding the correct test is to not let yourself uncomment that line or check until you can produce a test that will fail until you uncomment it. It may be hard but if you can’t think of a way this would fail, you probably don’t have a good excuse for writing that line of code, do you?

 

Why is this a problem? Because you never know when the next developer will show up and try to play with your code, maybe try to optimize it, or wrongly delete some precious line of your code.  If you don’t have a test that will fail, they will never know they made a mistake.

 

You might also want to try and replace various usage of parameters that are passed in to your method with consts. For example given this method,

 

Public int Sum(int x, int y, bool allowNegatives)
{
   If(!allowNegatives)
{
        If(x<0||y<0)
        Throw new Exception();
}
   Return x+y;
}

 

here are some variations of testing for test coverage:

   

If(!true)
{
        If(x<0||y<0)
        Throw new Exception();
}
 
Or
 
   If(!allowNegatives)
{
        If(false||y<0)
        Throw new Exception();
}
 
Or
 
If(!allowNegatives)
{
        If(x<0||false)
        Throw new Exception();
}

If all the tests still pass, you’re missing a test.

 

Another red flag: If you have only one test that checks for various equality to values.

Seeing this:

Assert.AreEqual(3,retval);

Happen only once in relation to some method usually means you can safely return 3 as a value and all the tests for this method will still pass.

 

When should you remove or change a unit test?

A Unit test should test only one thing