Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unit tests separation

This question is related to PHPUnit, although it should be a global xUnit design question.

I'm writing a Unit test case for a class Image.

One of the methods of this class is setBackgroundColor().

There are 4 different behaviors I need to test for this method,

  1. Trying to set an invalid background color. Multiple invalid parameters will be tested.
  2. Trying to set a valid background color using a short hand RGB array, e.g. array(255,255,255)
  3. Trying to set a valid background color using a standard RGB array, e.g. array('red' => 255, 'green' => 255, 'blue' => 255) (this is the output format of the GD function imagecolorsforindex())
  4. Trying to set a valid background color using the transparent constant IMG_COLOR_TRANSPARENT

At the moment, I have all this contained within 1 test in my test case called testSetBackgroundColor(), however I'm getting the feeling these should be 4 separate tests as the test is getting quite long and doing a lot.

My question is, what should I do here? Do I encapsulate all this into 1 test of the Image test case, or do I split the above into separate tests like,

  • testSetBackgroundColorErrors
  • testSetBackgroundColorShorthandRGB
  • testSetBackgroundColorRGB
  • testSetBackgroundColorTransparent

I've put the test in question here http://pastebin.com/f561fc1ab.

Thank

like image 935
Stephen Melrose Avatar asked Jan 21 '10 10:01

Stephen Melrose


2 Answers

Split it. Absolutely.

When a unit test fails it must be immediately clear what exactly is broken. If you combine the tests, you'll be debugging a unit test failure.

By the way, are you writing tests first? With TDD it's unlikely to end up with bloated tests.

like image 100
Ivan Krechetov Avatar answered Nov 18 '22 23:11

Ivan Krechetov


My preference is to split the tests as you describe.

  • It makes it more obvious what's gone wrong when a test fails and therefore quicker to debug
  • You get the benefit of a reset of the objects to a clean starting state between test conditions
  • It makes it easier to see which tests you've included/omitted just by looking at the method names
like image 23
Paolo Avatar answered Nov 19 '22 01:11

Paolo