Unit Test Granularity
Problem
You want to know how fine-grained your unit tests should be.
Solution
Each unit test should check one specific piece of functionality. Do
not combine multiple, unrelated tests into a single testXXX( ) method.
Discussion
Each test method can have as many assertXXX( )
calls as you like, but they can lead to problems:
public void testGame( ) throws BadGameException {
Game game = new Game( );
Ship fighter = game.createFighter("001");
assertEquals("Fighter did not have the correct identifier",
"001", fighter.getId( ));
Ship fighter2 = game.createFighter("001");
assertSame("createFighter with same id should return same object",
fighter, fighter2);
assertFalse("A new game should not be started yet", game.isPlaying( ));
}This is a bad design because each assertXXX( )
method is testing an unrelated piece of functionality. If the first
assertEquals( ) fails, the remainder of the test
is not executed. When this happens, you won’t know
if the other tests are functional.
Example 4-2 shows a refactored test case that tests
various aspects of our game independently. We will see how to remove
the duplicated code in Recipe 4.6 when we talk
about setUp( ) and
tearDown( ).
Example 4-2. Refactored tests
public void testCreateFighter( ) throws BadGameException { Game game = new Game( ); Ship fighter = game.createFighter("001"); assertEquals("Fighter did not have the correct identifier", "001", fighter.getId( )); game.shutdown( ); } public void testSameFighters( ) throws BadGameException ...Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access