Quality Code. Software Testing Principles, Practices, and Patterns. Stephen Vance. AAddison-Wesley

Similar documents
Digital System Design with SystemVerilog

PYTHON. p ykos vtawynivis. Second eciitiovl. CO Ve, WESLEY J. CHUN

The Unified Modeling Language User Guide

Rails AntiPatterns. Chad Pytel. Best Practice Ruby on Rails Refactoring. Tammer Saleh. AAddison-Wesley

Programming in Python 3

Application Programming

Framework Design Guidelines

The Power of Events. An Introduction to Complex Event Processing in Distributed Enterprise Systems. David Luckham

Cloud Computing and SOA Convergence in Your Enterprise

MariaDB Crash Course. A Addison-Wesley. Ben Forta. Upper Saddle River, NJ Boston. Indianapolis. Singapore Mexico City. Cape Town Sydney.

Fit for Developing Software

Secure Coding in C and C++

ECLIPSE RICH CLIENT PLATFORM

Programming with POSIX Threads

SQL Queries. for. Mere Mortals. Third Edition. A Hands-On Guide to Data Manipulation in SQL. John L. Viescas Michael J. Hernandez

CLASSIC DATA STRUCTURES IN JAVA

Objects First with Java

Developer's HTML5. Cookbook. AAddison-Wesley. Chuck Hudson. Tom Leadbetter. Upper Saddle River, NJ Boston Indianapolis San Francisco

Modern C++ Design. Generic Programming and Design Patterns Applied. Andrei Alexandrescu. AAddison-Wesley

Essentials. Oracle Solaris Cluster. Tim Read. Upper Saddle River, NJ Boston Indianapolis San Francisco. Capetown Sydney Tokyo Singapore Mexico City

Programming Guide. Aaftab Munshi Dan Ginsburg Dave Shreiner. TT r^addison-wesley

\ Smart Client 0" Deploymentwith v^ ClickOnce

The Java Tutorial. A Short Course on the Basics. Raymond Gallardo. Sowmya Kannan. AAddison-Wesley. Sharon Biocca Zakhour.

Modern C++ Design. Generic Programming and Design Patterns Applied. Andrei Alexandrescu. .~Addison-Wesley

Modern C++ Design. Generic Programming and Design Patterns Applied. Andrei Alexandrescu

Domain-Specific. Languages. Martin Fowler. AAddison-Wesley. Sydney Tokyo. With Rebecca Parsons

JAVASCRIPT FOR PROGRAMMERS

World Wide Web PROGRAMMING THE PEARSON EIGHTH EDITION. University of Colorado at Colorado Springs

Core Java Volume Ii Advanced Features 10th Edition

Real-Time Systems and Programming Languages

Refactoring HTML. Improving the Design of Existing Web Applications. Elliotte Rusty Harold. TT rvaddison-wesley

Programming Wireless Devices with the Java 2 Platform, Micro Edition

Programming. In Ada JOHN BARNES TT ADDISON-WESLEY

Agile Principles, Patterns, and Practices in C#

OpenGL SUPERBIBLE. Fifth Edition. Comprehensive Tutorial and Reference. Richard S. Wright, Jr. Nicholas Haemel Graham Sellers Benjamin Lipchak

Elements Of Programming Interviews In Python The Insiders Guide

Opengl Programming On Mac Os X Architecture Performance

Database Concepts. David M. Kroenke UNIVERSITATSBIBLIOTHEK HANNOVER

ECLIPSE MODELING PROJECT

Clean Code. A Handbook of Agile Software Craftsmanship. The Object Mentors: Robert С Martin

IPHONE FOR PROGRAMMERS: AN APP-DRIVEN APPROACH

LATEX. Leslie Lamport. Digital Equipment Corporation. Illustrations by Duane Bibby. v ADDISON-WESLEY

Essentials of Database Management

Prelude to Programming

Programming. Principles and Practice Using C++ Bjarne Stroustrup. / Addison-Wesley. Second Edition

Effective Stl 50 Specific Ways To Improve Your Use Of The... Effective Stl: 50 Specific Ways To Improve The Use Of The...

Systems:;-'./'--'.; r. Ramez Elmasri Department of Computer Science and Engineering The University of Texas at Arlington

DATABASE SYSTEM CONCEPTS

Eclipse Building Commercial-Quality Plug-ins Second Edition

Business Driven Data Communications

Eclipse Plug-ins. Third Edition

CJT^jL rafting Cm ompiler

PROBLEM SOLVING USING JAVA WITH DATA STRUCTURES. A Multimedia Approach. Mark Guzdial and Barbara Ericson PEARSON. College of Computing

ony Gaddis Haywood Community College STARTING OUT WITH PEARSON Amsterdam Cape Town Dubai London Madrid Milan Munich Paris Montreal Toronto

Virtualization from the Trenches

FUNDAMENTALS OF. Database S wctpmc. Shamkant B. Navathe College of Computing Georgia Institute of Technology. Addison-Wesley

Xcode 6 Start to Finish

A Document Preparation System. User's Guide and Reference Manual. Leslie Lamport

DB2 SQL Tuning Tips for z/os Developers

Fundamentals of. Database Systems. Shamkant B. Navathe. College of Computing Georgia Institute of Technology PEARSON.

Elements Of Programming Interviews In Java The Insiders Guide

The Java EE 6 Tutorial

DATA ABSTRACTION AND PROBLEM SOLVING WITH JAVA

Access ComprehGnsiwG. Shelley Gaskin, Carolyn McLellan, and. Nancy Graviett. with Microsoft

Integrated Approach. Operating Systems COMPUTER SYSTEMS. LEAHY, Jr. Georgia Institute of Technology. Umakishore RAMACHANDRAN. William D.

Search Engines Information Retrieval in Practice

Design patterns using Spring and Guice

Python The Definitive Guide To Learning Python Programming

Visual C# Tony Gaddis. Haywood Community College STARTING OUT WITH. Piyali Sengupta. Third Edition. Global Edition contributions by.

Anany Levitin 3RD EDITION. Arup Kumar Bhattacharjee. mmmmm Analysis of Algorithms. Soumen Mukherjee. Introduction to TllG DCSISFI &

The Art of Unit Testing

THE AVR MICROCONTROLLER AND EMBEDDED SYSTEMS. Using Assembly and С

An Introduction to Parallel Programming

Network Programming With Go Essential Skills For Using And Securing Networks

OpenGL. Shading Language. Third Edition

Win32 Network Programming

An Introduction to Object-Oriented Programming

Algorithmic Graph Theory and Perfect Graphs

Managed. Code Rootkits. Hooking. into Runtime. Environments. Erez Metula ELSEVIER. Syngress is an imprint of Elsevier SYNGRESS

An Introduction to Search Engines and Web Navigation

Introduction to Computer Graphics

CRYPTOGRAPHY AND NETWORK SECURITY

Computers as Components Principles of Embedded Computing System Design

PeopleSoft PeopleTools Tips & Techniques

UNIX Network Programming

"Charting the Course... Java Programming Language. Course Summary

C++ Primer, Fifth Edition

FUNDAMENTALS OF SEVENTH EDITION

Oracle Real Application Clusters Handbook

Coding for Penetration

Embrace Factories Factories. By Rob Gonda

FrontPage 98: The Complete Reference

MACHINES AND MECHANISMS

List of Examples List of Figures List of Tables. Acknowledgments 1. VERIFICATION GUIDELINES 1

Essential Check Point FireWall-1

Introduction. Assessment Test. Part I The Programmer s Exam 1

Framework Design Guidelines Conventions Idioms And Patterns For Reusable Net Libraries

Usability Testing Essentials

Complete. The. Reference. Christopher Adamson. Mc Grauu. LlLIJBB. New York Chicago. San Francisco Lisbon London Madrid Mexico City

Embedded Systems Architecture

Transcription:

Quality Code Software Testing Principles, Practices, and Patterns Stephen Vance AAddison-Wesley Upper Saddle River, NJ Boston Indianapolis San Francisco New York Toronto Montreal London Munich Paris Madrid Capetown Sydney Tokyo Singapore Mexico City

Contents Preface Acknowledgments About the Author xiii xvii xix Part I: Principles and Practices of Testing 1 Chapter 1: Engineering, Craftsmanship, and First-Time Quality 3 Engineering and Craftsmanship 4 The Role of Craftsmanship in First-Time Quality 4 Practices Supporting Software Craftsmanship 6 Testing 8 Unit Testing under Code Checker Constraints 10 Unit Testing for Coverage 10 Chapter 2: Intent of Code 17 Where Did I Put That Intent? 18 Separating Intent from Implementation 18 A Simple Example That Makes You Think 19 Chapter 3: Where Do I Start? 23 An Approach to Testing 23 Understand Your Scope 24 A Conceptual Framework for Testing 25 State and Behavioral Testing 26 To Test or Not to Test 27 vii

The Recipe Test the "Happy Path" Test the Alternate Paths Test the Error Paths Test the Data Permutations Test the Defects Chapter 4: Design and Testability A Word on Design Paradigms Encapsulation and Observability Representational Encapsulation Behavioral Encapsulation Shades of Testing Encapsulation, Observability and Testability Coupling and Testability Chapter 5: Testing Principles Craft Your Tests Well Couple Inputs to Outputs Use a Naming Convention Avoid Test Code in Production Verify Intent over Implementation Minimize Coupling Prefer Minimal, Fresh, Transient Fixtures Use Available Facilities Prefer Complete over Partial Verification Write Small Tests Separate Your Concerns Use Unique Values Keep It Simple: Remove Code Don't Test the Framework Don't Test Generated Code Sometimes Test the Framework

Contents ix Part II: Testing and Testability Patterns 61 Chapter 6: The Basics 63 Bootstrapping Constructors 63 Testing Simple Getters and Setters 66 Share Constants 67 Locally Redefine 70 Temporarily Replace 71 Encapsulate and Override 72 Adjust Visibility 75 Verification by Injection 77 Chapter 7: String Handling 81 Verification by Containment 81 Verification by Pattern 83 Exact Verification by Value 85 Exact Verification with Formatted Results 88 Chapter 8: Encapsulation and Override Variations 91 Data Injection 91 Encapsulate Loop Conditions 94 Error Injection 96 Replace Collaborators 98 Use Existing No-Op Classes 101 Chapter 9: Adjusting Visibility 105 Packaging Tests with Code 105 Break TtDown 108 Changing Test-Only Access Levels 109 Interfaces 111 Naming the Unnamed 112 Becoming f riend-ly 113 Coerced Access via Reflection 114 Declarative Scope Changing 116

X Contents Chapter 10: Interlude: Revisiting Intent 119 Testing the Singleton Pattern 120 Singleton Intent 121 The Testing Strategy 121 Testing the Singleton Nature 122 Testing the Class Purpose 123 Discerning Intent 127 Chapter 11: Error Condition Verification 129 Check the Return Value 129 Verify the Exception Type 130 Verify the Exception Message 132 Verify the Exception Payload 134 Verify the Exception Instance 137 Thoughts on Exception Design 140 Chapter 12: Use Existing Seams 145 Direct Calls 146 Interfaces 146 Implementations 146 Dependency Injection 147 Callbacks, Observers, Listeners, and Notifiers 150 Registries 154 Factories 156 Logging and Other Facilities of Last Resort 159 Chapter 13: Parallelism 165 A Brief Introduction to Threads and Race Conditions 166 Some History 166 Race Conditions 167 Deadlocks 169 A Strategy for Race Condition Reproduction 170 Test the Thread Task Directly 173 Synchronize through Common Lock 176

Contents xi Synchronize through Injection 181 Example: Injecting Synchronization through Logging 181 Use Supervisory Control 184 Statistical Verification 187 Debugger APIs 189 Part III: Worked Examples 193 Chapter 14: Test-Driven Java 195 Bootstrapping 196 First Functionality 197 Cutting the Cord 198 Moving to Multiples 199 Ghost Protocol 200 Dead End 200 Spy Craft 201 Exercising Options 203 Moving Downstream 204 Retrospective 207 Chapter 15: Legacy JavaScript 209 Getting Started 210 DOMination 211 On Toothpaste and Testing 213 Scaling Up 215 Software Archeology 217 Retrospective 218 Bibliography 219 Index 221