| List of Figures | p. ix |
| List of Tables | p. xiii |
| Preface | p. xv |
| Overview | p. 1 |
| Introduction | p. 3 |
| Activities of a Test Engineer | p. 4 |
| Testing Levels Based on Software Activity | p. 5 |
| Beizer's Testing Levels Based on Test Process Maturity | p. 8 |
| Automation of Test Activities | p. 10 |
| Software Testing Limitations and Terminology | p. 11 |
| Coverage Criteria for Testing | p. 16 |
| Infeasibility and Subsumption | p. 20 |
| Characteristics of a Good Coverage Criterion | p. 20 |
| Older Software Testing Terminology | p. 21 |
| Bibliographic Notes | p. 22 |
| Coverage Criteria | p. 25 |
| Graph Coverage | p. 27 |
| Overview | p. 27 |
| Graph Coverage Criteria | p. 32 |
| Structural Coverage Criteria | p. 33 |
| Data Flow Criteria | p. 44 |
| Subsumption Relationships among Graph Coverage Criteria | p. 50 |
| Graph Coverage for Source Code | p. 52 |
| Structural Graph Coverage for Source Code | p. 52 |
| Data Flow Graph Coverage for Source Code | p. 54 |
| Graph Coverage for Design Elements | p. 65 |
| Structural Graph Coverage for Design Elements | p. 65 |
| Data Flow Graph Coverage for Design Elements | p. 67 |
| Graph Coverage for Specifications | p. 75 |
| Testing Sequencing Constraints | p. 75 |
| Testing State Behavior of Software | p. 77 |
| Graph Coverage for Use Cases | p. 87 |
| Use Case Scenarios | p. 90 |
| Representing Graphs Algebraically | p. 91 |
| Reducing Graphs to Path Expressions | p. 94 |
| Applications of Path Expressions | p. 96 |
| Deriving Test Inputs | p. 96 |
| Counting Paths in a Flow Graph and Determining Max Path Length | p. 97 |
| Minimum Number of Paths to Reach All Edges | p. 98 |
| Complementary Operations Analysis | p. 98 |
| Bibliographic Notes | p. 100 |
| Logic Coverage | p. 104 |
| Overview: Logic Predicates and Clauses | p. 104 |
| Logic Expression Coverage Criteria | p. 106 |
| Active Clause Coverage | p. 107 |
| Inactive Clause Coverage | p. 111 |
| Infeasibility and Subsumption | p. 112 |
| Making a Clause Determine a Predicate | p. 113 |
| Finding Satisfying Values | p. 115 |
| Structural Logic Coverage of Programs | p. 120 |
| Predicate Transformation Issues | p. 127 |
| Specification-Based Logic Coverage | p. 131 |
| Logic Coverage of Finite State Machines | p. 134 |
| Disjunctive Normal Form Criteria | p. 138 |
| Bibliographic Notes | p. 147 |
| Input Space Partitioning | p. 150 |
| Input Domain Modeling | p. 152 |
| Interface-Based Input domain Modeling | p. 153 |
| Functionality-Based Input Domain Modeling | p. 154 |
| Identifying Characteristics | p. 154 |
| Choosing Blocks and Values | p. 156 |
| Using More than One Input Domain Model | p. 158 |
| Checking the Input Domain Model | p. 158 |
| Combination Strategies Criteria | p. 160 |
| Constraints among Partitions | p. 165 |
| Bibliographic Notes | p. 166 |
| Syntax-Based Testing | p. 170 |
| Syntax-Based Coverage Criteria | p. 170 |
| BNF Coverage Criteria | p. 170 |
| Mutation Testing | p. 173 |
| Program-Based Grammars | p. 176 |
| BNF Grammars for Languages | p. 176 |
| Program-Based Mutation | p. 176 |
| Integration and Object-Oriented Testing | p. 191 |
| BNF Integration Testing | p. 192 |
| Integration Mutation | p. 192 |
| Specification-Based Grammars | p. 197 |
| BNF Grammars | p. 198 |
| Specification-Based Mutation | p. 198 |
| Input Space Grammars | p. 201 |
| BNF Grammars | p. 201 |
| Mutation for Input Grammars | p. 204 |
| Bibliographic Notes | p. 210 |
| Applying Criteria in Practice | p. 213 |
| Practical Considerations | p. 215 |
| Regression Testing | p. 215 |
| Integration and Testing | p. 217 |
| Stubs and Drivers | p. 218 |
| Class Integration Test Order | p. 218 |
| Test Process | p. 219 |
| Requirements Analysis and Specification | p. 220 |
| System and Software Design | p. 221 |
| Intermediate Design | p. 222 |
| Detailed Design | p. 223 |
| Implementation | p. 223 |
| Integration | p. 224 |
| System Deployment | p. 224 |
| Operation and Maintenance | p. 224 |
| Summary | p. 225 |
| Test Plans | p. 225 |
| Identifying Correct Outputs | p. 230 |
| Direct Verification of Outputs | p. 230 |
| Redundant Computations | p. 231 |
| Consistency Checks | p. 231 |
| Data Redundancy | p. 232 |
| Bibliographic Notes | p. 233 |
| Engineering Criteria for Technologies | p. 235 |
| Testing Object-Oriented Software | p. 236 |
| Unique Issues with Testing OO Software | p. 237 |
| Types of Object-Oriented Faults | p. 237 |
| Testing Web Applications and Web Services | p. 256 |
| Testing Static Hyper Text Web Sites | p. 257 |
| Testing Dynamic Web Applications | p. 257 |
| Testing Web Services | p. 260 |
| Testing Graphical User Interfaces | p. 260 |
| Testing GUIs | p. 261 |
| Real-Time Software and Embedded Software | p. 262 |
| Bibliographic Notes | p. 265 |
| Building Testing Tools | p. 268 |
| Instrumentation for Graph and Logical Expression Criteria | p. 268 |
| Node and Edge Coverage | p. 268 |
| Data Flow Coverage | p. 271 |
| Logic Coverage | p. 272 |
| Building Mutation Testing Tools | p. 272 |
| The Interpretation Approach | p. 274 |
| The Separate Compilation Approach | p. 274 |
| The Schema-Based Approach | p. 275 |
| Using Java Reflection | p. 276 |
| Implementing a Modern Mutation System | p. 277 |
| Bibliographic Notes | p. 277 |
| Challenges in Testing Software | p. 280 |
| Testing for Emergent Properties: Safety and Security | p. 280 |
| Classes of Test Cases for Emergent Properties | p. 283 |
| Software Testability | p. 284 |
| Testability for Common Technologies | p. 285 |
| Test Criteria and the Future of Software Testing | p. 286 |
| Going Forward with Testing Research | p. 288 |
| Bibliographic Notes | p. 290 |
| List of Criteria | p. 293 |
| Bibliography | p. 295 |
| Index | p. 319 |
| Table of Contents provided by Ingram. All Rights Reserved. |