As a project grows in size , organizing the files containing production and test code becomes an issue. Although keeping the test and production code in the same directory is the simplest solution, it is better to have a clean separation between the two categories of code. This strategy helps avoid build complications that occur when a directory contains some code that should be linked into the production application, and some that should not. Including the test code in the delivered application is undesirable because it unnecessarily increases the size of the delivery, and also because the tests may expose behavior or design details that the developer meant to keep "under the hood."
Organizing the code is a language-specific concern. In Java, the directory path to a source file parallels its package membership. The need to test protected interfaces means that unit tests should belong to the same package as the production classes they test, so they must have the same directory path . This can be done by creating separate but parallel hierarchies for the production and test code.
Figure 4-1 shows how the source code for the final version of the virtual library application is organized. There are three Java packages, com.utf.library , com.utf.library.gui , and com.utf.library.xml .
Figure 4-1. Organization of production and test code
The production and test code are located in separate directories, src and test , which are located under the project's top level DEVROOT directory. For example, the production class Library resides in the directory src/com/utf/library , and the test class LibraryTest is in test/com/utf/library . The test classes' package names parallel the production classes' package names , so the test classes can access and test protected behavior of the production code. Since the code is in separate directory trees, it is simple to build and run only the production or test code as desired.
For many other languages, an effective way to organize the code is to place all test code in a subdirectory named test within each production code directory. This arrangement keeps the test code separate, but makes linking it to the production code simple.