Software Testing:

A Craftsman's Approach,

5th Edition

The following is an outline including parts, chapters, sections, and major sub-sections:

PART I A Mathematical Context

1 A Perspective on Testing

1.1 Basic Definitions

1.2 Test Cases

1.3 Insights from a Venn Diagram

1.4 Identifying Test Cases

1.5 Fault Taxonomies

1.6 Levels of Testing



2 Examples

2.1 Structural Elements of Pseudo-code and Java

2.2 The Triangle Problem

2.3 The NextDate Function

2.4 The Foodies-Wish-List Online Shopping Application

2.5 The Garage Door Controller

2.6 Examples in Exercises

2.6.1 The Quadrilateral Program

2.6.2 The NextWeek Function

2.6.3 The Windshield Wiper Controller



3 Discrete Math for Testers

3.1 Set Theory

3.2 Functions

3.3 Relations

3.4 Propositional Logic



4 Graph Theory for Testers

4.1 Graphs

4.2 Directed Graphs

4.3 Graphs for Testing

4.3.1 Program Graphs

4.3.2 Finite State Machines

4.3.3 Petri Nets

4.3.4 Event-Driven Petri Nets

4.3.5 Statecharts



PART II Unit Testing

5 Boundary Value Testing

5.1 Normal Boundary Value Testing

5.2 Robust Boundary Value Testing

5.3 Worst Case Boundary Value Testing

5.4 Special Value Testing

5.5 Examples

5.6 Random Testing

5.7 Guidelines for Boundary Value Testing



6 Equivalence Class Testing

6.1 Equivalence Classes

6.2 Traditional Equivalence Class Testing

6.3 Improved Equivalence Class Testing

6.4 Equivalence Class Test Cases for the Triangle Problem

6.5 Equivalence Class Test Cases for the NextDate Function

6.6 Equivalence Class Test Cases for the completeOrder Method

6.7 “Edge Testing”

6.8 Reflections on Invalid Classes

6.9 Guidelines and Observations



7 Decision Table-Based Testing

7.1 Decision Tables

7.2 Decision Table Techniques

7.3 Test Cases for the Triangle Problem

7.4 Test Cases for the NextDate Function

7.5 Cause and Effect Graphing

7.6 Guidelines and Observations



8 Code-Based Testing

8.1 Program Graphs

8.2 DD-Paths

8.3 Code Coverage Metrics

8.4 Basis Path Testing

8.4.1 McCabe’s Basis Path Method

8.4.2 Observations on McCabe’s Basis Path Method

8.4.3 Essential Complexity

8.5 Guidelines and Observations



9 Testing Object-Oriented Software

9.1 Unit Testing Frameworks

9.1.1 Common Unit Testing Frameworks

9.1.2 JUnit Examples

9.2 Mock Objects and Automated Object Mocking

9.3 Dataflow Testing

9.4 Object-Oriented Complexity Metrics

9.5 Issues in Testing Object-Oriented Software

9.6 Slice-Based Testing

9.6.1 Example

9.6.2 Style and Technique

9.6.3 Slice Splicing

9.6.4 Program Slicing Tools



10 Retrospective on Unit Testing

10.1 The Test Method Pendulum

10.2 Traversing the Pendulum

10.3 Insurance Premium Case Study

10.4 Specification-Based Testing

10.5 Guidelines



PART III Beyond Unit Testing

11 Life Cycle-Based Testing

11.1 Traditional Waterfall Testing

11.2 Testing in Iterative Lifecycles

11.3 Agile Testing

11.4 Remaining Questions

11.5 Pros, cons, and Open Questions of TDD

11.6 Retrospective on MDD vs TDD


12 Integration Testing

12.1 Decomposition-Based Integration

12.2 Call Graph-Based Integration

12.3 Path-Based Integration

12.4 Example: Procedural integrationNextDate

12.5 Example: O-O integrationNextDate

12.6 Model-Based Integration Testing



13 System Testing

13.1 Threads

13.2 Identifying Threads in Single-Processor Applications

13.3 Identifying Threads in Systems of Systems

13.4 System Level Test Cases

13.5 Coverage Metrics for System Testing

13.6 Long Versus Short Test Cases

13.6.1 Supplemental Approaches to System Testing

13.6.2 Operational Profiles Risk-Based Testing

13.7 Non-functional System Testing



14 Model-Based Testing

14.1 Testing Based on Models

14.2 Appropriate Models

14.3 Commercial Tool Support for Model-Based Testing



15 Software Complexity

15.1 Unit Level Complexity

15.1.1 Cyclomatic Complexity “Cattle Pens” and Cyclomatic Complexity Node Outdegrees and Cyclomatic Complexity Decisional Complexity

15.1.2 Computational Complexity Halstead’s Metrics Example: Day of Week with Zeller’s Congruence

15.2 Integration Level Complexity

15.3 Software Complexity Example

15.4 Object-Oriented Complexity

15.5 System Level Complexity



16 Testing Systems of Systems

16.1 Characteristics of Systems of Systems

16.2 Sample Systems of Systems

16.3 Software Engineering for Systems of Systems

16.4 Communication Primitives for Systems of Systems

16.5 Effect of Systems of Systems Levels on Prompts



17 Feature Interaction Testing

17.1 Feature Interaction Problem Defined

17.2 Types of Feature Interactions

17.2.1 Input Conflict

17.2.2 Output Conflict

17.2.3 Resource Conflict

17.3 A Taxonomy of Interactions

17.3.1 Static Interactions in a Single Processor

17.3.2 Static Interactions in Multiple Processors

17.3.3 Dynamic Interactions in a Single Processor

17.3.4 Dynamic Interactions in Multiple Processors

17.4 Interaction, Composition, and Determinism



18 Case Study: Testing Event-Driven Systems

18.1 The Garage Door Controller Problem Statement

18.2 Modeling with Behavior Driven Development (BDD)

18.3 Modeling with Extended Finite State Machines

18.4 Modeling with Swim Lane Event-Driven Petri Nets

18.5 Deriving Test Cases from Swim Lane Event-Driven Petri Nets

18.6 Failure Mode Event Analysis (FMEA)



19 A Closer Look at All Pairs Testing

19.1 The All Pairs Technique

19.2 A Closer Look at the NIST Study

19.3 Appropriate Applications for All-Pairs Testing

19.4 Recommendations for All Pairs Testing



20 Software Technical Reviews

20.1 Economics of Software Reviews

20.2 Types of Reviews

20.3 Roles in a Review

20.4 Contents of an Inspection Packet

20.5 An Industrial-Strength Inspection Process

20.6 Effective Review Culture

20.7 Inspection Case Study


21 Epilogue: Software Testing Excellence

21.1 Craftsmanship

21.2 Best Practices of Software Testing

21.3 Our Top 10 Best Practices for Software Testing Excellence

21.4 Mapping Best Practices to Diverse Projects

21.5 An Extreme Example


Appendix A: Complete Technical Inspection Packet

Appendix B: Foodies Wish List Example