My review of this book is based on my having recently read several others about software testing. In particular, "Test-Driven Development: By Example" by Kent Beck, where the basic premise is that the tests are written either before or simultaneously with the code. I have long believed that this approach is the best way to create quality code and I am skeptical about any other testing approach. The plans in this book can be considered as a broad overview of the testing strategy rather than down into the specifics of how to write tests for specific blocks of code.
Many of the examples are in the realm of the obvious, but not always clearly implemented. For example, number 17 is "Verify that the system supports testability" and number 31is "Know the different types of testing-support tools." In the case of 17, the word system is being used to describe large projects and the topic deals with verifying that it is possible to test the integrated system by tracking the source of errors and how the components interact with each other. Tracking down errors that arise when systems are integrated is very hard, and in general it is necessary to make the plans on how to track down such errors when the architecture for the system is being designed. Therefore, the point, which seems obvious, is in fact a very critical one.
Determining what software testing tools are available is another very critical step in the effective, efficient testing of software. The enormous number of different pathways through modern software makes it impossible to use even the largest army of testers to check them all. Therefore, the only way to provide reasonable coverage of the options is to let other software examine it. Tools such as memory and other system resource checkers, source code scanners that look for "obvious" bugs, programs that generate test data sets either randomly or clustered about most likely values, and test generators can sometimes provide valuable assistance in cleaning code. When working in C/C++, I found a code scanner to be extremely helpful, and wrote a simple one some time ago. It searched for instances of a single "=" in Boolean expressions, semicolons immediately after if, while and for loops, and places where the delete command was used on pointers that might point to an array. It was simple, but it did find some bugs that quite likely would have taken me hours to find.
The testing principles are organized into ten categories:
* Requirements phase.
* Test planning.
* The testing team.
* The system architecture.
* Test design and documentation.
* Unit testing.
* Automated testing tools.
* Automated testing: Selected best practices.
* Nonfunctional testing.
* Managing test execution.
As you can see, the concept of testing is included from the very first stages of the project. This is essential, as it is very possible to incorporate something into the design that will make effective testing difficult or even impossible. Experienced software testers should be included in the planning from the first day of construction.
I consider this book to be a companion volume to those that emphasis testing as part of coding. With this book and one of the others, you can raise the level of your software quality quotient, which makes the life of everyone much easier.