Since the last publication of this international bestseller, software testing has seen a renaissance of renewed interest and technology. The biggest change comes in the growing prominence and acceptance of Agile Programming. Software Testing: A Craftsman's Approach, Third Edition extends the combination of theory and practicality of the first two editions to include agile programming development and discusses the serious effect this emerging area is having on software testing. The third edition of the widely adopted text and reference book is comprised of six parts. It begins by providing the mathematical background in discrete mathematics and linear graph theory that is used in subsequent sections. The book continues to describe specification-based (functional) and code-based (structural) test development techniques, while extending this theoretical approach to less understood levels of integration and system testing. The author further develops this discussion to include object-oriented software.
A completely new section relates all of the previously discussed concepts to the agile software development movement and highlights issues such as how agile and XP development environments are radically changing the role of software testers by making testing integral at every phase of the development process. Thoroughly revised and updated, Software Testing: A Craftsman's Approach, Third Edition is sure to become a standard reference for those who need to stay up-to-date with evolving technologies in software testing. Carrying on the tradition of previous editions, it will continue to serve as a valuable reference for software testers, developers, and engineers.
Table of Contents
PART I: A MATHEMATICAL CONTEXT A Perspective on Testing Basic Definitions Test Cases Insights from a Venn Diagram Identifying Test Cases Error and Fault Taxonomies Levels of Testing Examples Generalized Pseudocode The Triangle Problem The NextDate Function The Commission Problem The SATM System The Currency Converter Saturn Windshield Wiper Controller Discrete Math for Testers Set Theory Functions Relations Propositional Logic Probability Theory Graph Theory for Testers Graphs Directed Graphs Graphs for Testing PART II: FUNCTIONAL TESTING Boundary Value Testing Boundary Value Analysis Robustness Testing Worst-Case Testing Special Value Testing Examples Random Testing Guidelines for Boundary Value Testing Equivalence Class Testing Equivalence Classes Equivalence Class Test Cases for the Triangle Problem Equivalence Class Test Cases for the NextDate Function Equivalence Class Test Cases for the Commission Problem Guidelines and Observations Decision Table-Based Testing Decision Tables Test Cases for the Triangle Problem Test Cases for the NextDate Function Test Cases for the Commission Problem Guidelines and Observations Retrospective on Functional Testing Testing Effort Testing Efficiency Testing Effectiveness Guidelines Case Study PART III: STRUCTURAL TESTING Path Testing DD-Paths Test Coverage Metrics Basis Path Testing Guidelines and Observations Dataflow Testing Define/Use Testing Slice-Based Testing Guidelines and Observations Retrospective on Structural Testing Gaps and Redundancies Metrics for Method Evaluation Case Study Revisited PART IV: INTEGRATION AND SYSTEM TESTING Levels of Testing Traditional View of Testing Levels Alternative Life Cycle Models The SATM System Separating Integration and System Testing Integration Testing A Closer Look at the SATM System Decomposition-Based Integration Call Graph-Based Integration Path-Based Integration Case Study System Testing Threads Basis Concepts for Requirements Specification Finding Threads Structural Strategies for Thread Testing Functional Strategies for Thread Testing SATM Test Threads System Testing Guidelines ASF Testing Example Interaction Testing Context of Interaction A Taxonomy of Interactions Interaction, Composition, and Determinism Client/Server Testing PART V: OBJECT-ORIENTED TESTING Issues in Object-Oriented Testing Units for Object-Oriented Testing Implications of Composition and Encapsulation Implications of Inheritance Implications of Polymorphism Levels of Object-Oriented Testing GUI Testing Dataflow Testing for Object-Oriented Software Examples for Part V Class Testing Methods as Units Classes as Units Object-Oriented Integration Testing UML Support for Integration Testing MM-Paths for Object-Oriented Software A Framework for Object-Oriented Dataflow Integration Testing GUI Testing The Currency Conversion Program Unit Testing for the Currency Conversion Program Integration Testing for the Currency Conversion Program System Testing for the Currency Conversion Program Object-Oriented System Testing Currency Converter UML Description UML-Based System Testing StateChart-Based System Testing PART VI: MILLENNIUM TESTING Exploratory Testing The Context-Driven School Exploring Exploratory Testing Exploring a Familiar Example Exploratory and Context-Driven Testing Observations Model-Based Testing Testing Based on Models Appropriate Models Use Case-Based Testing Commercial Tool Support for Model-Based Testing Test-Driven Development Test-Then-Code Cycles Automated Test Execution (Testing Frameworks) Java and JUnit Example Remaining Questions Pros, Cons, and Open Questions of TDD Retrospective on MDD versus TDD A Closer Look at All Pairs Testing The All Pairs Technique A Closer Look at the NIST Study Appropriate Applications for All Pairs Testing Recommendations for All Pairs Testing Epilogue: Software Testing Excellence Craftsmanship Best Practices of Software Testing Top Best Practices for Software Testing Excellence Mapping Best Practices to Diverse Projects