The software development world has changed significantly in the past five years. Noteworthy among its many changes is the emergence of the "Unified Modeling Language" (UML) as an industry standard. While thousands of software computer professionals and students continue to rely upon the bestselling first edition of Software Testing, the time has come to bring it up to date. Thoroughly revised, the second edition of Software Testing: A Craftsman's Approach reflects the recent growth and changes in software standards and development. Outdated material has been deleted and new topics, figures, and case studies now complement its solid, accessible treatment of the mathematics and techniques of software testing. Foremost among this edition's refinements is the definition of a generalized pseudocode that replaces the outdated Pascal code used in the examples. The text is now independent of any particular programming language. The author has also added five chapters on object-oriented testing, incorporated object-oriented versions of two earlier examples, and used them in the chapter on object-oriented testing, which he completely revised with regard to UML. In addition, GUI testing receives full treatment.The new edition of Software Testing provides a comprehensive synthesis of the fundamentals, approaches, and methods that form the basis of the craft. Mastering its contents will allow practitioners to make well-informed choices, develop creative solutions, and ultimately derive the sense of pride and pleasure that a true craftsperson realizes from a job well done.
Review By: J.D. Kennedy 12/31/2003Software Testing: A Craftsman’s Approach is an excellent introduction to software testing as a craft. As the author describes it, software testing is evolving from the art originally described in Glenford Myers “The Art of Software Testing” but is still not quite a science.
The author’s writing style is conversational and easy to follow. The terminology used throughout the book is taken from the standards developed by the Institute of Electronics and Electrical Engineers (IEEE) computer society, which gives the reader a common language with other testers. There are many pictures and diagrams that illustrate the concepts succinctly.
The book is divided into five sections: Mathematical Context, Functional Testing, Structural Testing, Integration and System Testing, and Object-Oriented Testing. The basics, including mathematical principles and specific examples are covered for each of these areas.
The first section, Mathematical Context, introduces terms and concepts that are built on through the rest of the book as well as the sample problems: the Triangle, the NextDate function, Commission, the Simple Automated Teller Machine, the Currency Converter, and, for a touch of reality, the Saturn Windshield Wiper Controller. These examples are used to illustrate how one method may produce a better set of test cases than another or may be more applicable to one type of problem than another.
Each of the main sections after Mathematical Context describe basic concepts and compares common methods such Boundary Value versus Equivalence Class testing and Path versus Data Flow testing. Concepts are described accurately but in simple enough terms to be easy to describe in the classic “2 minute Elevator Speech.” For example, a comparison of Functional versus Structural testing describes Functional testing as establishing confidence while Structural testing seeks faults. While the book is written so that the material builds sequentially, it can also be opened to any topic and readily understood. The breadth of topics covered makes this book very useful as an introduction to the topic as well as a useful reference book.
Software Testing: A Craftsman’s Approach is well organized and easy to read. I enjoyed reading it and recommend it to others. It is particularly suitable for novices who want to learn more about basic techniques or more experienced testers who want to understand the mathematical concepts behind the methods. It is suitable for developers as well as testers and covers traditional development as well as object-oriented development.
Many large financial institutions have a large investment in legacy systems that use hierarchical methods and that must still be maintained and enhanced. The NextDate function, while simple, is particularly relevant to calculations in financial institutions and understanding methods for testing this function can be extrapolated to other functions (e.g. a NextWorkDay function). The graphs in Chapter 8 illustrate clearly the effort required for testing when test cases are developed using different methods.
While providing good basic test case development information, it is the logical progression to a conclusion that provides real value. In testing, the answer to “How much should I test?” is most often “it depends.” This book provides a basis for deciding what is important in a given situation and understanding the trade-offs inherent in different methods.