1.1.1 Testing Levels Based on Software Activity 51.1.2 Beizer’s Testing Levels Based on Test Process 1.2 Software Testing Limitations and Terminology 11 1.3.2 Characteristics of a Good C
Trang 2This page intentionally left blank
Trang 3Introduction to Software Testing
Extensively class tested, this text takes an innovative approach to ware testing: it defines testing as the process of applying a few well-defined, general-purpose test criteria to a structure or model of the soft-ware The structure of the text directly reflects the pedagogical approachand incorporates the latest innovations in testing, including modern types
soft-of ssoft-oftware such as OO, Web applications, and embedded ssoft-oftware Thebook contains numerous examples throughout An instructor’s solutionmanual, PowerPoint slides, sample syllabi, additional examples and up-dates, testing tools for students, and example software programs in Javaare available on an extensive Web site at www.introsoftwaretesting.com.Paul Ammann, PhD, is an Associate Professor of software engineer-ing at George Mason University He received an outstanding teachingaward in 2007 from the Volgenau School of Information Technology andEngineering Dr Ammann earned an AB degree in computer sciencefrom Dartmouth College and MS and PhD degrees in computer sciencefrom the University of Virginia
Jeff Offutt, PhD, is a Professor of software engineering at George
Mason University He is editor-in-chief of the Journal of Software Testing, Verification and Reliability; chair of the steering committee for the IEEE
International Conference on Software Testing, Verification, and tion; and on the editorial boards for several journals He recived theoutstanding teacher award from the Volgenau School of InformationTechnology and Engineering in 2003 Dr Offutt earned a BS degree inmathematics and data processing from Morehead State University and
Valida-MS and PhD degrees in computer science from the Georgia Institute ofTechnology
i
Trang 4ii
Trang 5INTRODUCTION TO
SOFTWARE TESTING
Paul AmmannGeorge Mason UniversityJeff Offutt
George Mason University
iii
Trang 6First published in print format
ISBN-13 978-0-521-88038-1
ISBN-13 978-0-511-39330-3
© Paul Ammann and Jeff Offutt 2008
2008
Information on this title: www.cambridge.org/9780521880381
This publication is in copyright Subject to statutory exception and to the provision of relevant collective licensing agreements, no reproduction of any part may take place without the written permission of Cambridge University Press.
Cambridge University Press has no responsibility for the persistence or accuracy of urls for external or third-party internet websites referred to in this publication, and does not guarantee that any content on such websites is, or will remain, accurate or appropriate.
Published in the United States of America by Cambridge University Press, New York www.cambridge.org
eBook (EBL)
hardback
Trang 71.1.1 Testing Levels Based on Software Activity 51.1.2 Beizer’s Testing Levels Based on Test Process
1.2 Software Testing Limitations and Terminology 11
1.3.2 Characteristics of a Good Coverage Criterion 20
2.2.3 Subsumption Relationships among Graph Coverage
v
Trang 82.3.1 Structural Graph Coverage for Source Code 522.3.2 Data Flow Graph Coverage for Source Code 54
2.4.1 Structural Graph Coverage for Design Elements 652.4.2 Data Flow Graph Coverage for Design Elements 67
2.5.2 Testing State Behavior of Software 77
2.7.1 Reducing Graphs to Path Expressions 94
2.7.4 Counting Paths in a Flow Graph and Determining
2.7.5 Minimum Number of Paths to Reach All Edges 98
3.2.4 Making a Clause Determine a Predicate 113
4.1.1 Interface-Based Input Domain Modeling 1534.1.2 Functionality-Based Input Domain Modeling 154
4.1.5 Using More than One Input Domain Model 158
Trang 96.3.1 Requirements Analysis and Specification 220
7.1.1 Unique Issues with Testing OO Software 237
Trang 107.1.2 Types of Object-Oriented Faults 2377.2 Testing Web Applications and Web Services 256
7.2.1 Testing Static Hyper Text Web Sites 257
8.1 Instrumentation for Graph and Logical
8.2.2 The Separate Compilation Approach 274
8.2.5 Implementing a Modern Mutation System 277
9.1 Testing for Emergent Properties: Safety and Security 280
9.1.1 Classes of Test Cases for Emergent Properties 283
Trang 11List of Figures
1.2 Software development activities and testing levels – the “V Model” 62.1 Graph (a) has a single initial node, graph (b) multiple initial nodes,
2.5 A set of test cases and corresponding test paths 322.6 A graph showing node coverage and edge coverage 34
2.9 Tours, sidetrips, and detours in graph coverage 38
2.11 A graph showing variables, def sets and use sets 44
2.14 Example of the differences among the three data flow coverage
2.15 Subsumption relations among graph coverage criteria 50
2.17 CFG fragment for the if structure without an else 53
2.24 An inheritance hierarchy with objects instantiated 67
ix
Trang 122.28 Quadratic root program 712.29 Def-use pairs under intra-procedural and inter-procedural data flow 72
2.31 Def-use pairs in web applications and other distributed software 73
2.46 Example graph to show reduction to path expressions 94
2.55 Graph example for computing maximum number of paths 97
3.1 Subsumption relations among logic coverage criteria 113
4.1 Partitioning of input domain D into three blocks 1514.2 Subsumption relations among input space partitioning criteria 163
5.5 Mutated finite state machine for SMV specification 200
5.7 Finite state machine for bank example grammar 202
Trang 137.1 Example class hierarchy in UML 238
7.3 Calls to d() when object has various actual types 239
7.6 IISD: Example of indirect inconsistent state definition 2447.7 ACB1: Example of anomalous construction behavior 245
7.9 Sample class hierarchy (a) and associated type families (b) 2487.10 Control flow graph fragment (a) and associated definitions and
7.12 Control flow schematic for prototypical coupling sequence 251
7.14 Coupling sequence: o of type A (a) bound to instance of A (b), B (c)
8.5 Correlated active clause coverage instrumentation 273
Trang 14xii
Trang 15List of Tables
2.1 Defs and uses at each node in the CFG for TestPat page 57
2.2 Defs and uses at each edge in the CFG for TestPat 57
2.4 Test paths to satisfy all du-paths coverage on TestPat 59
3.2 Reachability for Triang predicates – reduced by solving for triOut 124
3.6 Correlated active clause coverage for cal() preconditions 133
4.1 First partitioning of TriTyp’s inputs (interface-based) 1564.2 Second partitioning of TriTyp’s inputs (interface-based) 1574.3 Possible values for blocks in the second partitioning in Table 4.2 1574.4 Geometric partitioning of TriTyp’s inputs (functionality-based) 1584.5 Correct geometric partitioning of TriTyp’s inputs (functionality-based) 1584.6 Possible values for blocks in geometric partitioning in Table 4.5 159
6.1 Testing objectives and activities during requirements analysis and
6.2 Testing objectives and activities during system and software design 2226.3 Testing objectives and activities during intermediate design 2226.4 Testing objectives and activities during detailed design 2236.5 Testing objectives and activities during implementation 2236.6 Testing objectives and activities during integration 2246.7 Testing objectives and activities during system deployment 2246.8 Testing objectives and activities during operation and maintenance 2257.1 Faults and anomalies due to inheritance and polymorphism 240
xiii
Trang 167.2 ITU: Code example showing inconsistent type usage 242
7.3 IC: Incomplete construction of state variable fd 246
7.5 Binding triples for coupling sequence from class hierarchy in Figure
Trang 17This book presents software testing as a practical engineering activity, essential toproducing high-quality software It is designed to be used as the primary textbook
in either an undergraduate or graduate course on software testing, as a supplement
to a general course on software engineering or data structures, and as a resourcefor software test engineers and developers This book has a number of uniquefeatures:
It organizes the complex and confusing landscape of test coverage criteria with
a novel and extremely simple structure At a technical level, software testing isbased on satisfying coverage criteria The book’s central observation is that thereare few truly different coverage criteria, each of which fits easily into one of fourcategories: graphs, logical expressions, input space, and syntax structures Thisnot only simplifies testing, but it also allows a convenient and direct theoreticaltreatment of each category This approach contrasts strongly with the traditionalview of testing, which treats testing at each phase in the development processdifferently
It is designed and written to be a textbook The writing style is direct, it builds theconcepts from the ground up with a minimum of required background, and it in-cludes lots of examples, homework problems, and teaching materials It provides
a balance of theory and practical application, presenting testing as a collection
of objective, quantitative activities that can be measured and repeated The oretical concepts are presented when needed to support the practical activitiesthat test engineers follow
the- It assumes that testing is part of a mental discipline that helps all IT professionalsdevelop higher-quality software Testing is not an anti-engineering activity, and
it is not an inherently destructive process Neither is it only for testing specialists
or domain experts who know little about programming or math
It is designed with modular, interconnecting pieces; thus it can be used in ple courses Most of the book requires only basic discrete math and introductoryprogramming, and the parts that need more background are clearly marked By
multi-xv
Trang 18using the appropriate sections, this book can support several classes, as describedlater in the preface.
It assumes the reader is learning to be an engineer whose goal is to produce thebest possible software with the lowest possible cost The concepts in this bookare well grounded in theory, are practical, and most are currently in use.WHY SHOULD THIS BOOK BE USED?
Not very long ago, software development companies could afford to employ grammers who could not test and testers who could not program For most of theindustry, it was not necessary for either group to know the technical principles be-hind software testing or even software development Software testing in industryhistorically has been a nontechnical activity Industry viewed testing primarily fromthe managerial and process perspective and had limited expectations of practition-ers’ technical training
pro-As the software engineering profession matures, and as software becomes morepervasive in everyday life, there are increasingly stringent requirements for softwarereliability, maintainability, and security Industry must respond to these changes by,among other things, improving the way software is tested This requires increasedtechnical expertise on the part of test engineers, as well as increased emphasis ontesting by software developers The good news is that the knowledge and technol-ogy are available and based on over 30 years of research and practice This bookputs that knowledge into a form that students, test engineers, test managers, anddevelopers can access
At the same time, it is relatively rare to find courses that teach testing in sities Only a few undergraduate courses exist, almost no masters degree programs
univer-in computer science or software enguniver-ineeruniver-ing require a course univer-in software testuniver-ing,and only a few dozen have an elective course Not only is testing not covered as anessential part of undergraduate computer science education, most computer sciencestudents either never gain any knowledge about testing, or see only a few lectures
as part of a general course in software engineering
The authors of this book have been teaching software testing to software gineering and computer science students for more than 15 years Over that time
en-we somewhat reluctantly came to the conclusion that no one was going to writethe book we wanted to use Rather, to get the book we wanted, we would have towrite it
Previous testing books have presented software testing as a relatively simplesubject that relies more on process than technical understanding of how software
is constructed, as a complicated and fractured subject that requires detailed standing of numerous software development technologies, or as a completely the-oretical subject that can be mastered only by mathematicians and theoretical com-puter scientists Most books on software testing are organized around the phases in
under-a typicunder-al softwunder-are development lifecycle, under-an under-approunder-ach thunder-at hunder-as the unfortununder-ate sideeffect of obscuring common testing themes Finally, most testing books are written
as reference books, not textbooks As a result, only instructors with prior expertise
in software testing can easily teach the subject This book is accessible to instructors
who are not already testing experts.
Trang 19This book differs from other books on software testing in other important ways.Many books address managing the testing process While this is important, it isequally important to give testers specific techniques grounded in basic theory Thisbook provides a balance of theory and practical application This is important in-formation that software companies must have; however, this book focuses specif-ically on the technical nuts-and-bolts issues of designing and creating tests Othertesting books currently on the market focus on specific techniques or activities,such as system testing or unit testing This book is intended to be comprehensiveover the entire software development process and to cover as many techniques aspossible.
As stated previously, the motivation for this book is to support courses in ware testing Our first target was our own software testing course in our Soft-ware Engineering MS program at George Mason University This popular elective
soft-is taught to about 30 computer science and software engineering students everysemester We also teach PhD seminars in software testing, industry short courses
on specialized aspects, and lectures on software testing in various undergraduatecourses Although few undergraduate courses on software testing exist, we believethat they should exist, and we expect they will in the near future Most testing booksare not designed for classroom use We specifically wrote this book to support ourclassroom activities, and it is no accident that the syllabus for our testing course,available on the book’s Web site (www.introsoftwaretesting.com), closely followsthe table of contents for this book
This book includes numerous carefully worked examples to help students andteachers alike learn the sometimes complicated concepts The instructor’s resourcesinclude high-quality powerpoint slides, presentation hints, solutions to exercises,and working software Our philosophy is that we are doing more than writing abook; we are offering our course to the community One of our goals was to writematerial that is scholarly and true to the published research literature, but that isalso accessible to nonresearchers Although the presentation in the book is quite abit different from the research papers that the material is derived from, the essen-tial ideas are true to the literature To make the text flow more smoothly, we haveremoved the references from the presentation For those interested in the researchgenealogy, each chapter closes with a bibliographic notes section that summarizeswhere the concepts come from
WHO SHOULD READ THIS BOOK?
Students who read and use this book will learn the fundamental principles behind
software testing, and how to apply these principles to produce better software,faster They will not only become better programmers, they will also be prepared
to carry out high-quality testing activities for their future employers Instructors
will be able to use this book in the classroom, even without prior practical tise in software testing The numerous exercises and thought-provoking problems,classroom-ready and classroom-tested slides, and suggested outside activities makethis material teachable by instructors who are not already experts in software test-
exper-ing Research students such as beginning PhD students will find this book to be an
invaluable resource as a starting point to the field The theory is sound and clearly
Trang 20presented, the practical applications reveal what is useful and what is not, and theadvanced reading and bibliographic notes provide pointers into the literature Al-though the set of research students in software testing is a relatively small audi-ence, we believe it is a key audience, because a common, easily achievable baselinewould reduce the effort required for research students to join the community of
testing researchers Researchers who are already familiar with the field will find the
criteria-approach to be novel and interesting Some may disagree with the ical approach, but we have found that the view that testing is an application of only
pedagog-a few criteripedagog-a to pedagog-a very few softwpedagog-are structures to be very helpful to our resepedagog-arch
We hope that testing research in the future will draw away from searches for morecriteria to novel uses and evaluations of existing criteria
Testers in the industry will find this book to be an invaluable collection of
tech-niques that will help improve their testing, no matter what their current process is.The criteria presented here are intended to be used as a “toolbox” of tricks that
can be used to find faults Developers who read this book will find numerous ways
to improve their own software Their self-testing activities can become more cient and effective, and the discussions of software faults that test engineers searchfor will help developers avoid them To paraphrase a famous parable, if you want
effi-to teach a person effi-to be a better fisherman, explain how and where the fish swim
Finally, managers will find this book to be a useful explanation of how clever test
engineers do their job, and of how test tools work They will be able to make moreeffective decisions regarding hiring, promotions, and purchasing tools
HOW CAN THIS BOOK BE USED?
A major advantage of the structure of this book is that it can be easily used forseveral different courses Most of the book depends on material that is taught veryearly in college and some high schools: basic concepts from data structures and dis-crete math The sections are organized so that the early material in each chapter
is accessible to less advanced students, and material that requires more advancedknowledge is clearly marked
Specifically, the book defines six separate sets of chapter sections that form
streams through the book:
1 A module within a CS II course
2 A sophomore-level course on software testing
3 A module in a general software engineering course
4 A senior-level course on software testing
5 A first-year MS level course on software testing
6 An advanced graduate research-oriented course on software testing
7 Industry practioner relevant sectionsThe stream approach is illustrated in the abbreviated table of contents inthe figure shown on pp xix–xx Each chapter section is marked with which stream
it belongs too Of course, individual instructors, students, and readers may prefer
to adapt the stream to their own interests or purposes We suggest that the firsttwo sections of Chapter 1 and the first two sections of Chapter 6 are appropriatereading for a module in a data structures (CS II) class, to be followed by a simple
Trang 21Stream 1: Module in a CS II course.
Stream 2: Sophomore-level course on software testing.
Stream 3: Module in a general software engineering course.
Stream 4: Senior-level course on software testing.
Stream 5: First-year MS course on software testing.
Stream 6: Advanced graduate research-oriented course on software testing.
Stream 7: Industry practitioner relevant sections
1.4 Older Software Testing Terminology 1.5 Bibliographic Notes
Part II: Coverage Criteria
Chapter 2 Graph Coverage
2.1 Overview 2.2 Graph Coverage Criteria 2.3 Graph Coverage for Source Code 2.4 Graph Coverage for Design Elements 2.5 Graph Coverage for Specifications 2.6 Graph Coverage for Use Cases 2.7 Representing Graphs Algebraically 2.8 Bibliographic Notes
Chapter 3 Logic Coverage
3.1 Overview: Logic Predicates and Clauses 3.2 Logic Expression Coverage Criteria 3.3 Structural Logic Coverage of Programs 3.4 Specification-Based Logic Coverage 3.5 Logic Coverage of Finite State Machines 3.6 Disjunctive Normal Form Criteria 3.7 Bibliographic Notes
Chapter 4 Input Space Partitioning
4.1 Input Domain Modeling 4.2 Combination Strategies Criteria 4.3 Constraints among Partitions 4.4 Bibliographic Notes
Chapter 5 Syntax-Based Testing
5.1 Syntax-Based Coverage Criteria 5.2 Program-Based Grammars 5.3 Integration and Object-Oriented Testing 5.4 Specification-Based Grammars 5.5 Input Space Grammars 5.6 Bibliographic Notes
Trang 22Stream 1: Module in a CS II course.
Stream 2: Sophomore-level course on software testing.
Stream 3: Module in a general software engineering course.
Stream 4: Senior-level course on software testing.
Stream 5: First-year MS course on software testing.
Stream 6: Advanced graduate research-oriented course on software testing.
Stream 7: Industry practitioner relevant sections
STREAMS
Part III: Applying Criteria in Practice
Chapter 6 Practical Considerations
6.1 Regression Testing 6.2 Integration and Testing 6.3 Test Process
6.4 Test Plans 6.5 Identifying Correct Outputs 6.5 Bibliographic Notes
Chapter 7 Engineering Criteria for Technologies
7.1 Testing Object-Oriented Software 7.2 Testing Web Applications and Web Services 7.3 Testing Graphical User Interfaces 7.4 Real-Time Software and Embedded Software 7.5 Bibliographic Notes
Chapter 8 Building Testing Tools
8.1 Instrumentation for Graph and Logical Expression Criteria 8.2 Building Mutation Testing Tools
8.3 Bibliographic Notes
Chapter 9 Challenges in Testing Software
9.1 Testing for Emergent Properties: Safety and Security 9.2 Software Testability
9.3 Test Criteria and the Future of Software Testing 9.4 Bibliographic Notes
assignment Our favorite is to ask the students to retrieve one of their previouslygraded programs and satisfy some simple test criterion like branch coverage Weoffer points for every fault found, driving home two concepts: an “A” grade doesn’tmean the program always works, and finding faults is a good thing
The sophomore-level course on software testing (stream 2) is designed to diately follow a data structures course (CS II) The marked sections contain materialthat depends only on data structures and discrete math
imme-A module in a general software engineering course (stream 3) could augment thesurvey material typical in such courses The sections marked provide basic literacy
in software testing
The senior-level course on software testing (stream 4) is the primary targetfor this text It adds material that requires a little more sophistication in terms of
Trang 23software development than the sophomore stream This includes sections in ter 2 on data flow testing, sections that involve integration testing of multiple mod-ules, and sections that rely on grammars or finite state machines Most senior com-puter science students will have seen this material in their other courses Most of thesections that appear in stream 4 but not stream 2 could be added to stream 2 withappropriate short introductions It is important to note that a test engineer does notneed to know all the theory of parsing to use data flow testing or all the theory onfinite state machines to use statecharts for testing.
Chap-The graduate-level course on software testing (stream 5) adds some additionalsections that rely on a broader context and that require more theoretical maturity.For example, these sections use knowledge of elementary formal methods, polymor-phism, and some of the UML diagrams Some of the more advanced topics and theentire chapter on building testing tools are also intended for a graduate audience.This chapter could form the basis for a good project, for example, to implement asimple coverage analyzer
An advanced graduate course in software testing with a research emphasis such
as a PhD seminar (stream 6) includes issues that are still unproven and research innature The bibliographic notes are recommended only for these students as indica-tors for future in-depth reading
Finally, sections that are reasonably widely used in industry, especially thosethat have commercial tool support, are marked for stream 7 These sections have aminimum of theory and omit criteria that are still of questionable usefulness
Extensive supplementary materials, including sample syllabuses, PowerPointslides, presentation hints, solutions to exercises, working software, and errata areavailable on the book’s companion Web site
We gratefully acknowledge the feedback of early adopters at other educational stitutions: Roger Alexander, Jane Hayes, Ling Liu, Darko Marinov, Arthur Reyes,Michael Shin, and Tao Xie We also want to acknowledge several people who pro-vided material for the book: Roger Alexander, Mats Grindal, Hong Huang, GaryKaminski, Robert Nilsson, Greg Williams, Wuzhi Xu We were lucky to receive ex-cellent suggestion from Lionel Briand, Ren ´ee Bryce, Kim King, Sharon Ritchey,
in-Bo Sanden, and Steve Schach We are grateful to our editor, Heather Bergman,
Trang 24for providing unwavering support and enforcing the occasional deadline to movethe project along, as well as Kerry Cahill from Cambridge University Press for verystrong support on this project.
We also acknowledge George Mason University for supporting both of us onsabbaticals and for providing GTA support at crucial times Our department Chair,Hassan Gomaa, has enthusiastically supported this effort
Finally, of course none of this is possible without the support of our families.Thanks to Becky, Jian, Steffi, Matt, Joyce, and Andrew for keeping us grounded inreality and helping keep us happy for the past five years
Just as all programs contain faults, all texts contain errors Our text is no ent And, as responsibility for software faults rests with the developers, responsibil-ity for errors in this text rests with us, the authors In particular, the bibliographicnotes sections reflect our perspective of the testing field, a body of work we read-ily acknowledge as large and complex We apologize in advance for omissions, andinvite pointers to relevant citations
differ-Paul AmmannJeff Offutt
Trang 25PART 1
Overview
1
Trang 262
Trang 271 Introduction
The ideas and techniques of software testing have become essential knowledge forall software developers A software developer can expect to use the concepts pre-sented in this book many times during his or her career This chapter introduces thesubject of software testing by describing the activities of a test engineer, defining anumber of key terms, and then explaining the central notion of test coverage
Software is a key ingredient in many of the devices and systems that pervadeour society Software defines the behavior of network routers, financial networks,telephone switching networks, the Web, and other infrastructure of modern life.Software is an essential component of embedded applications that control exoticapplications such as airplanes, spaceships, and air traffic control systems, as well asmundane appliances such as watches, ovens, cars, DVD players, garage door open-ers, cell phones, and remote controllers Modern households have over 50 proces-sors, and some new cars have over 100; all of them running software that optimisticconsumers assume will never fail! Although many factors affect the engineering ofreliable software, including, of course, careful design and sound process manage-ment, testing is the primary method that the industry uses to evaluate software un-der development Fortunately, a few basic software testing concepts can be used
to design tests for a large variety of software applications A goal of this book is
to present these concepts in such a way that the student or practicing engineer caneasily apply them to any software testing situation
This textbook differs from other software testing books in several respects.The most important difference is in how it views testing techniques In his land-
mark book Software Testing Techniques, Beizer wrote that testing is simple – all
a tester needs to do is “find a graph and cover it.” Thanks to Beizer’s insight, itbecame evident to us that the myriad testing techniques present in the literaturehave much more in common than is obvious at first glance Testing techniques typ-ically are presented in the context of a particular software artifact (for example, arequirements document or code) or a particular phase of the lifecycle (for exam-ple, requirements analysis or implementation) Unfortunately, such a presentationobscures the underlying similarities between techniques This book clarifies thesesimilarities
3
Trang 28It turns out that graphs do not characterize all testing techniques well; otherabstract models are necessary Much to our surprise, we have found that a smallnumber of abstract models suffice: graphs, logical expressions, input domain char-acterizations, and syntactic descriptions The main contribution of this book is tosimplify testing by classifying coverage criteria into these four categories, and this iswhy Part II of this book has exactly four chapters.
This book provides a balance of theory and practical application, thereby senting testing as a collection of objective, quantitative activities that can be mea-sured and repeated The theory is based on the published literature, and presentedwithout excessive formalism Most importantly, the theoretical concepts are pre-sented when needed to support the practical activities that test engineers follow.That is, this book is intended for software developers
pre-1.1 ACTIVITIES OF A TEST ENGINEER
In this book, a test engineer is an information technology (IT) professional who is in
charge of one or more technical test activities, including designing test inputs, ducing test case values, running test scripts, analyzing results, and reporting results
pro-to developers and managers Although we cast the description in terms of test neers, every engineer involved in software development should realize that he or shesometimes wears the hat of a test engineer The reason is that each software artifactproduced over the course of a product’s development has, or should have, an asso-ciated set of test cases, and the person best positioned to define these test cases is
engi-often the designer of the artifact A test manager is in charge of one or more test
en-gineers Test managers set test policies and processes, interact with other managers
on the project, and otherwise help the engineers do their work
Figure 1.1 shows some of the major activities of test engineers A test neer must design tests by creating test requirements These requirements are then
engi-Test Engineer
Test Designs
Executable Tests
Figure 1.1 Activities of test engineers
Trang 29transformed into actual values and scripts that are ready for execution These ecutable tests are run against the software, denoted P in the figure, and the resultsare evaluated to determine if the tests reveal a fault in the software These activitiesmay be carried out by one person or by several, and the process is monitored by atest manager.
ex-One of a test engineer’s most powerful tools is a formal coverage criterion mal coverage criteria give test engineers ways to decide what test inputs to use dur-ing testing, making it more likely that the tester will find problems in the programand providing greater assurance that the software is of high quality and reliability.Coverage criteria also provide stopping rules for the test engineers The technicalcore of this book presents the coverage criteria that are available, describes howthey are supported by tools (commercial and otherwise), explains how they can best
For-be applied, and suggests how they can For-be integrated into the overall developmentprocess
Software testing activities have long been categorized into levels, and two kinds
of levels have traditionally been used The most often used level categorization isbased on traditional software process steps Although most types of tests can only
be run after some part of the software is implemented, tests can be designed andconstructed during all software development steps The most time-consuming parts
of testing are actually the test design and construction, so test activities can andshould be carried out throughout development The second-level categorization isbased on the attitude and thinking of the testers
1.1.1 Testing Levels Based on Software Activity
Tests can be derived from requirements and specifications, design artifacts, or thesource code A different level of testing accompanies each distinct software devel-opment activity:
Acceptance Testing – assess software with respect to requirements
System Testing – assess software with respect to architectural design
Integration Testing – assess software with respect to subsystem design
Module Testing – assess software with respect to detailed design
Unit Testing – assess software with respect to implementation
Figure 1.2 illustrates a typical scenario for testing levels and how they relate tosoftware development activities by isolating each step Information for each testlevel is typically derived from the associated development activity Indeed, stan-dard advice is to design the tests concurrently with each development activity, eventhough the software will not be in an executable form until the implementationphase The reason for this advice is that the mere process of explicitly articulat-ing tests can identify defects in design decisions that otherwise appear reasonable.Early identification of defects is by far the best means of reducing their ultimate
cost Note that this diagram is not intended to imply a waterfall process The
syn-thesis and analysis activities generically apply to any development process
The requirements analysis phase of software development captures the tomer’s needs Acceptance testing is designed to determine whether the completed
cus-software in fact meets these needs In other words, acceptance testing probes
Trang 30Requirements Analysis
Architectural Design
Subsystem Design
Detailed Design
Implementation TestUnit
Module Test
System Test
Integration Test
Acceptance Test Test
The architectural design phase of software development chooses components
and connectors that together realize a system whose specification is intended to
meet the previously identified requirements System testing is designed to determine
whether the assembled system meets its specifications It assumes that the pieceswork individually, and asks if the system works as a whole This level of testing usu-ally looks for design and specification problems It is a very expensive place to findlower-level faults and is usually not done by the programmers, but by a separatetesting team
The subsystem design phase of software development specifies the structure and
behavior of subsystems, each of which is intended to satisfy some function in theoverall architecture Often, the subsystems are adaptations of previously developed
software Integration testing is designed to assess whether the interfaces between
modules (defined below) in a given subsystem have consistent assumptions and municate correctly Integration testing must assume that modules work correctly.Some testing literature uses the terms integration testing and system testing inter-
com-changeably; in this book, integration testing does not refer to testing the integrated
system or subsystem Integration testing is usually the responsibility of members ofthe development team
The detailed design phase of software development determines the structure and behavior of individual modules A program unit, or procedure, is one or more con-
tiguous program statements, with a name that other parts of the software use tocall it Units are called functions in C and C++, procedures or functions in Ada,
methods in Java, and subroutines in Fortran A module is a collection of related
units that are assembled in a file, package, or class This corresponds to a file in
C, a package in Ada, and a class in C++ and Java Module testing is designed to
assess individual modules in isolation, including how the component units interactwith each other and their associated data structures Most software developmentorganizations make module testing the responsibility of the programmer
Trang 31Implementation is the phase of software development that actually produces
code Unit testing is designed to assess the units produced by the implementation
phase and is the “lowest” level of testing In some cases, such as when buildinggeneral-purpose library modules, unit testing is done without knowledge of the en-capsulating software application As with module testing, most software develop-ment organizations make unit testing the responsibility of the programmer It isstraightforward to package unit tests together with the corresponding code through
the use of tools such as JUnit for Java classes.
Not shown in Figure 1.2 is regression testing, a standard part of the
mainte-nance phase of software development Regression testing is testing that is done after
changes are made to the software, and its purpose is to help ensure that the updatedsoftware still possesses the functionality it had before the updates
Mistakes in requirements and high-level design wind up being implemented asfaults in the program; thus testing can reveal them Unfortunately, the softwarefaults that come from requirements and design mistakes are visible only throughtesting months or years after the original mistake The effects of the mistake tend
to be dispersed throughout multiple software components; hence such faults areusually difficult to pin down and expensive to correct On the positive side, even iftests cannot be executed, the very process of defining tests can identify a significantfraction of the mistakes in requirements and design Hence, it is important for testplanning to proceed concurrently with requirements analysis and design and not
be put off until late in a project Fortunately, through techniques such as use-caseanalysis, test planning is becoming better integrated with requirements analysis instandard software practice
Although most of the literature emphasizes these levels in terms of when they are applied, a more important distinction is on the types of faults that we are looking for The faults are based on the software artifact that we are testing, and the software
artifact that we derive the tests from For example, unit and module tests are derived
to test units and modules, and we usually try to find faults that can be found whenexecuting the units and modules individually
One of the best examples of the differences between unit testing and systemtesting can be illustrated in the context of the infamous Pentium bug In 1994, Intelintroduced its Pentium microprocessor, and a few months later, Thomas Nicely, amathematician at Lynchburg College in Virginia, found that the chip gave incorrectanswers to certain floating-point division calculations
The chip was slightly inaccurate for a few pairs of numbers; Intel claimed bly correctly) that only one in nine billion division operations would exhibit reducedprecision The fault was the omission of five entries in a table of 1,066 values (part
(proba-of the chip’s circuitry) used by a division algorithm The five entries should havecontained the constant+2, but the entries were not initialized and contained zeroinstead The MIT mathematician Edelman claimed that “the bug in the Pentium was
an easy mistake to make, and a difficult one to catch,” an analysis that misses one
of the essential points This was a very difficult mistake to find during system ing, and indeed, Intel claimed to have run millions of tests using this table But thetable entries were left empty because a loop termination condition was incorrect;that is, the loop stopped storing numbers before it was finished This turns out to be
test-a very simple ftest-ault to find during unit testing; indeed test-antest-alysis showed thtest-at test-almostany unit level coverage criterion would have found this multimillion dollar mistake
Trang 32The Pentium bug not only illustrates the difference in testing levels, but it is alsoone of the best arguments for paying more attention to unit testing There are noshortcuts – all aspects of software need to be tested.
On the other hand, some faults can only be found at the system level One matic example was the launch failure of the first Ariane 5 rocket, which exploded
dra-37 seconds after liftoff on June 4, 1996 The low-level cause was an unhandledfloating-point conversion exception in an internal guidance system function Itturned out that the guidance system could never encounter the unhandled exceptionwhen used on the Ariane 4 rocket In other words, the guidance system function iscorrect for Ariane 4 The developers of the Ariane 5 quite reasonably wanted toreuse the successful inertial guidance system from the Ariane 4, but no one reana-lyzed the software in light of the substantially different flight trajectory of Ariane 5.Furthermore, the system tests that would have found the problem were technicallydifficult to execute, and so were not performed The result was spectacular – andexpensive!
Another public failure was the Mars lander of September 1999, which crasheddue to a misunderstanding in the units of measure used by two modules created byseparate software groups One module computed thruster data in English units andforwarded the data to a module that expected data in metric units This is a verytypical integration fault (but in this case enormously expensive, both in terms ofmoney and prestige)
One final note is that object-oriented (OO) software changes the testing levels
OO software blurs the distinction between units and modules, so the OO software
testing literature has developed a slight variation of these levels Intramethod testing
is when tests are constructed for individual methods Intermethod testing is when pairs of methods within the same class are tested in concert Intraclass testing is
when tests are constructed for a single entire class, usually as sequences of calls to
methods within the class Finally, interclass testing is when more than one class is
tested at the same time The first three are variations of unit and module testing,whereas interclass testing is a type of integration testing
1.1.2 Beizer’s Testing Levels Based on Test Process MaturityAnother categorization of levels is based on the test process maturity level of anorganization Each level is characterized by the goal of the test engineers The fol-lowing material is adapted from Beizer [29]
Level 0 There’s no difference between testing and debugging.
Level 1 The purpose of testing is to show that the software works.
Level 2 The purpose of testing is to show that the software doesn’t work Level 3 The purpose of testing is not to prove anything specific, but to reduce
the risk of using the software
Level 4 Testing is a mental discipline that helps all IT professionals develop
higher quality software
Level 0 is the view that testing is the same as debugging This is the view that
is naturally adopted by many undergraduate computer science majors In most CSprogramming classes, the students get their programs to compile, then debug theprograms with a few inputs chosen either arbitrarily or provided by the professor
Trang 33This model does not distinguish between a program’s incorrect behavior and a take within the program, and does very little to help develop software that is reliable
mis-or safe
In Level 1 testing, the purpose is to show correctness While a significant step up
from the naive level 0, this has the unfortunate problem that in any but the most ial of programs, correctness is virtually impossible to either achieve or demonstrate.Suppose we run a collection of tests and find no failures What do we know? Should
triv-we assume that triv-we have good software or just bad tests? Since the goal of ness is impossible, test engineers usually have no strict goal, real stopping rule, orformal test technique If a development manager asks how much testing remains to
correct-be done, the test manager has no way to answer the question In fact, test managersare in a powerless position because they have no way to quantitatively express orevaluate their work
In Level 2 testing, the purpose is to show failures Although looking for failures
is certainly a valid goal, it is also a negative goal Testers may enjoy finding theproblem, but the developers never want to find problems – they want the software
to work (level 1 thinking is natural for the developers) Thus, level 2 testing putstesters and developers into an adversarial relationship, which can be bad for teammorale Beyond that, when our primary goal is to look for failures, we are still leftwondering what to do if no failures are found Is our work done? Is our softwarevery good, or is the testing weak? Having confidence in when testing is complete is
an important goal for all testers
The thinking that leads to Level 3 testing starts with the realization that testing
can show the presence, but not the absence, of failures This lets us accept the factthat whenever we use software, we incur some risk The risk may be small and theconsequences unimportant, or the risk may be great and the consequences catas-trophic, but risk is always there This allows us to realize that the entire develop-ment team wants the same thing – to reduce the risk of using the software In level 3testing, both testers and developers work together to reduce risk
Once the testers and developers are on the same “team,” an organization can
progress to real Level 4 testing Level 4 thinking defines testing as a mental
disci-pline that increases quality Various ways exist to increase quality, of which creating
tests that cause the software to fail is only one Adopting this mindset, test neers can become the technical leaders of the project (as is common in many otherengineering disciplines) They have the primary responsibility of measuring and im-proving software quality, and their expertise should help the developers An analogythat Beizer used is that of a spell checker We often think that the purpose of a spellchecker is to find misspelled words, but in fact, the best purpose of a spell checker
engi-is to improve our ability to spell Every time the spell checker finds an incorrectlyspelled word, we have the opportunity to learn how to spell the word correctly Thespell checker is the “expert” on spelling quality In the same way, level 4 testingmeans that the purpose of testing is to improve the ability of the developers to pro-duce high quality software The testers should train your developers
As a reader of this book, you probably start at level 0, 1, or 2 Most softwaredevelopers go through these levels at some stage in their careers If you work insoftware development, you might pause to reflect on which testing level describesyour company or team The rest of this chapter should help you move to level 2thinking, and to understand the importance of level 3 Subsequent chapters will give
Trang 34you the knowledge, skills, and tools to be able to work at level 3 The ultimate goal
of this book is to provide a philosophical basis that will allow readers to become
“change agents” in their organizations for level 4 thinking, and test engineers to
become software quality experts.
1.1.3 Automation of Test ActivitiesSoftware testing is expensive and labor intensive Software testing requires up to50% of software development costs, and even more for safety-critical applications.One of the goals of software testing is to automate as much as possible, thereby signi-ficantly reducing its cost, minimizing human error, and making regression testingeasier
Software engineers sometimes distinguish revenue tasks, which contribute rectly to the solution of a problem, from excise tasks, which do not For example,
di-compiling a Java class is a classic excise task because, although necessary for theclass to become executable, compilation contributes nothing to the particular behav-ior of that class In contrast, determining which methods are appropriate to define agiven data abstraction as a Java class is a revenue task Excise tasks are candidatesfor automation; revenue tasks are not Software testing probably has more excisetasks than any other aspect of software development Maintaining test scripts, re-running tests, and comparing expected results with actual results are all commonexcise tasks that routinely consume large chunks of test engineer’s time Automat-ing excise tasks serves the test engineer in many ways First, eliminating excise taskseliminates drudgery, thereby making the test engineers job more satisfying Second,automation frees up time to focus on the fun and challenging parts of testing, namelythe revenue tasks Third, automation can help eliminate errors of omission, such asfailing to update all the relevant files with the new set of expected results Fourth,automation eliminates some of the variance in test quality caused by differences inindividual’s abilities
Many testing tasks that defied automation in the past are now candidates for suchtreatment due to advances in technology For example, generating test cases thatsatisfy given test requirements is typically a hard problem that requires interventionfrom the test engineer However, there are tools, both research and commercial,that automate this task to varying degrees
EXERCISES
Section 1.1.
1 What are some of the factors that would help a development organization
move from Beizer’s testing level 2 (testing is to show errors) to testing level 4 (a mental discipline that increases quality)?
2 The following exercise is intended to encourage you to think of testing in amore rigorous way than you may be used to The exercise also hints at thestrong relationship between specification clarity, faults, and test cases.1
(a) Write a Java method with the signaturepublic static Vector union (Vector a, Vector b)The method should return a Vector of objects that are in either of thetwo argument Vectors
Trang 35(b) Upon reflection, you may discover a variety of defects and ambiguities
in the given assignment In other words, ample opportunities for faults
exist Identify as many possible faults as you can (Note: Vector is a Java Collection class If you are using another language, interpret Vector as a list.)
(c) Create a set of test cases that you think would have a reasonable chance
of revealing the faults you identified above Document a rationale foreach test in your test set If possible, characterize all of your rationales insome concise summary Run your tests against your implementation
(d) Rewrite the method signature to be precise enough to clarify the defectsand ambiguities identified earlier You might wish to illustrate your spec-ification with examples drawn from your test cases
1.2 SOFTWARE TESTING LIMITATIONS AND TERMINOLOGY
As said in the previous section, one of the most important limitations of softwaretesting is that testing can show only the presence of failures, not their absence This
is a fundamental, theoretical limitation; generally speaking, the problem of findingall failures in a program is undecidable Testers often call a successful (or effective)test one that finds an error While this is an example of level 2 thinking, it is also acharacterization that is often useful and that we will use later in this book
The rest of this section presents a number of terms that are important in softwaretesting and that will be used later in this book Most of these are taken from stan-dards documents, and although the phrasing is ours, we try to be consistent with thestandards Useful standards for reading in more detail are the IEEE Standard Glos-sary of Software Engineering Terminology, DOD-STD-2167A and MIL-STD-498from the US Department of Defense, and the British Computer Society’s Standardfor Software Component Testing
One of the most important distinctions to make is between validation and cation
verifi-Definition 1.1 Validation: The process of evaluating software at the end of
software development to ensure compliance with intended usage
Definition 1.2 Verification: The process of determining whether the products
of a given phase of the software development process fulfill the requirementsestablished during the previous phase
Verification is usually a more technical activity that uses knowledge about theindividual software artifacts, requirements, and specifications Validation usuallydepends on domain knowledge; that is, knowledge of the application for which thesoftware is written For example, validation of software for an airplane requiresknowledge from aerospace engineers and pilots
The acronym “IV&V” stands for “independent verification and validation,”where “independent” means that the evaluation is done by nondevelopers Some-times the IV&V team is within the same project, sometimes the same company, andsometimes it is entirely an external entity In part because of the independent nature
of IV&V, the process often is not started until the software is complete and is oftendone by people whose expertise is in the application domain rather than software
Trang 36development This can sometimes mean that validation is given more weight thanverification.
Two terms that we have already used are fault and failure Understanding this tinction is the first step in moving from level 0 thinking to level 1 thinking We adoptthe definition of software fault, error, and failure from the dependability community
dis-Definition 1.3 Software Fault: A static defect in the software.
Definition 1.4 Software Error: An incorrect internal state that is the
manifes-tation of some fault
Definition 1.5 Software Failure: External, incorrect behavior with respect to
the requirements or other description of the expected behavior
Consider a medical doctor making a diagnosis for a patient The patient enters
the doctor’s office with a list of failures (that is, symptoms) The doctor then must discover the fault, or root cause of the symptom To aid in the diagnosis, a doctor
may order tests that look for anomalous internal conditions, such as high bloodpressure, an irregular heartbeat, high levels of blood glucose, or high cholesterol In
our terminology, these anomalous internal conditions correspond to errors.
While this analogy may help the student clarify his or her thinking about faults,errors, and failures, software testing and a doctor’s diagnosis differ in one crucial
way Specifically, faults in software are design mistakes They do not appear
spon-taneously, but rather exist as a result of some (unfortunate) decision by a human.Medical problems (as well as faults in computer system hardware), on the otherhand, are often a result of physical degradation This distinction is important be-cause it explains the limits on the extent to which any process can hope to controlsoftware faults Specifically, since no foolproof way exists to catch arbitrary mis-takes made by humans, we cannot eliminate all faults from software In colloquialterms, we can make software development foolproof, but we cannot, and should notattempt to, make it damn-foolproof
For a more technical example of the definitions of fault, error, and failure, sider the following Java method:
con-public static int numZero (int[] x) {// Effects: if x == null throw NullPointerException// else return the number of occurrences of 0 in xint count = 0;
for (int i = 1; i < x.length; i++){
if (x[i] == 0){
count++;
}}return count;
}
Trang 37The fault in this program is that it starts looking for zeroes at index 1 instead
of index 0, as is necessary for arrays in Java For example, numZero ([2, 7, 0]) rectly evaluates to 1, while numZero ([0, 7, 2]) incorrectly evaluates to 0 In both
cor-of these cases the fault is executed Although both cor-of these cases result in an error,only the second case results in failure To understand the error states, we need toidentify the state for the program The state for numZero consists of values for thevariables x, count, i, and the program counter (denoted PC) For the first examplegiven above, the state at the if statement on the very first iteration of the loop is( x= [2, 7, 0], count = 0, i = 1, PC = if) Notice that this state is in error precisely be-cause the value of i should be zero on the first iteration However, since the value ofcount is coincidentally correct, the error state does not propagate to the output, andhence the software does not fail In other words, a state is in error simply if it is notthe expected state, even if all of the values in the state, considered in isolation, are
acceptable More generally, if the required sequence of states is s0, s1, s2, , and the actual sequence of states is s0, s2, s3, , then state s2 is in error in the secondsequence
In the second case the corresponding (error) state is (x= [0, 7, 2], count = 0, i =
1, PC= if) In this case, the error propagates to the variable count and is present inthe return value of the method Hence a failure results
The definitions of fault and failure allow us to distinguish testing from ing
debugg-Definition 1.6 Testing: Evaluating software by observing its execution.
Definition 1.7 Test Failure: Execution that results in a failure.
Definition 1.8 Debugging: The process of finding a fault given a failure.
Of course the central issue is that for a given fault, not all inputs will “trigger”the fault into creating incorrect output (a failure) Also, it is often very difficult to re-late a failure to the associated fault Analyzing these ideas leads to the fault/failuremodel, which states that three conditions must be present for a failure to be ob-served
1 The location or locations in the program that contain the fault must be
(Chap-The next definitions are less standardized and the literature varies widely (Chap-Thedefinitions are our own but are consistent with common usage A test engineer mustrecognize that tests include more than just input values, but are actually multipart
Trang 38software artifacts The piece of a test case that is referred to the most often is what
we call the test case value
Definition 1.9 Test Case Values: The input values necessary to complete
some execution of the software under test
Note that the definition of test case values is quite broad In a traditional batchenvironment, the definition is extremely clear In a Web application, a completeexecution might be as small as the generation of part of a simple Web page, or itmight be as complex as the completion of a set of commercial transactions In areal-time system such as an avionics application, a complete execution might be asingle frame, or it might be an entire flight
Test case values are the inputs to the program that test engineers typically focus
on during testing They really define what sort of testing we will achieve However,test case values are not enough In addition to test case values, other inputs are oftenneeded to run a test These inputs may depend on the source of the tests, and may becommands, user inputs, or a software method to call with values for its parameters
In order to evaluate the results of a test, we must know what output a correct version
of the program would produce for that test
Definition 1.10 Expected Results: The result that will be produced when
exe-cuting the test if and only if the program satisfies its intended behavior
Two common practical problems associated with software testing are how toprovide the right values to the software and observing details of the software’s be-havior These two ideas are used to refine the definition of a test case
Definition 1.11 Software Observability: How easy it is to observe the
behav-ior of a program in terms of its outputs, effects on the environment, and otherhardware and software components
Definition 1.12 Software Controllability: How easy it is to provide a program
with the needed inputs, in terms of values, operations, and behaviors
These ideas are easily illustrated in the context of embedded software ded software often does not produce output for human consumption, but affects thebehavior of some piece of hardware Thus, observability will be quite low Likewise,software for which all inputs are values entered from a keyboard is easy to control.But an embedded program that gets its inputs from hardware sensors is more diffi-cult to control and some inputs may be difficult, dangerous or impossible to supply(for example, how does the automatic pilot behave when a train jumps off-track).Many observability and controllability problems can be addressed with simulation,
Embed-by extra software built to “Embed-bypass” the hardware or software components that terfere with testing Other applications that sometimes have low observability andcontrollability include component-based software, distributed software and Webapplications
in-Depending on the software, the level of testing, and the source of the tests, thetester may need to supply other inputs to the software to affect controllability orobservability For example, if we are testing software for a mobile telephone, thetest case values may be long distance phone numbers We may also need to turn the
Trang 39phone on to put it in the appropriate state and then we may need to press “talk”and “end” buttons to view the results of the test case values and terminate the test.These ideas are formalized as follows.
Definition 1.13 Prefix Values: Any inputs necessary to put the software into
the appropriate state to receive the test case values
Definition 1.14 Postfix Values: Any inputs that need to be sent to the
soft-ware after the test case values are sent
Postfix values can be subdivided into two types
Definition 1.15 Verification Values: Values necessary to see the results of the
test case values
Definition 1.16 Exit Commands: Values needed to terminate the program or
otherwise return it to a stable state
A test case is the combination of all these components (test case values, expectedresults, prefix values, and postfix values) When it is clear from context, however, wewill follow tradition and use the term “test case” in place of “test case values.”
Definition 1.17 Test Case: A test case is composed of the test case values,
expected results, prefix values, and postfix values necessary for a completeexecution and evaluation of the software under test
We provide an explicit definition for a test set to emphasize that coverage is aproperty of a set of test cases, rather than a property of a single test case
Definition 1.18 Test Set: A test set is simply a set of test cases.
Finally, wise test engineers automate as many test activities as possible A cial way to automate testing is to prepare the test inputs as executable tests for thesoftware This may be done as Unix shell scripts, input files, or through the use of
cru-a tool thcru-at ccru-an control the softwcru-are or softwcru-are component being tested Idecru-ally,the execution should be complete in the sense of running the software with the testcase values, getting the results, comparing the results with the expected results, andpreparing a clear report for the test engineer
Definition 1.19 Executable Test Script: A test case that is prepared in a form
to be executed automatically on the test software and produce a report
The only time a test engineer would not want to automate is if the cost of tomation outweighs the benefits For example, this may happen if we are sure thetest will only be used once or if the automation requires knowledge or skills that thetest engineer does not have
au-EXERCISES
Section 1.2.
1 For what do testers use automation? What are the limitations of automation?
2 How are faults and failures related to testing and debugging?
Trang 403 Below are four faulty programs Each includes a test case that results in ure Answer the following questions about each program.
fail-public int findLast (int[] x, int y) { public static int lastZero (int[] x) { //Effects: If x==null throw NullPointerException //Effects: if x==null throw NullPointerException // else return the index of the last element // else return the index of the LAST 0 in x // in x that equals y // Return -1 if 0 does not occur in x // If no such element exists, return -1
for (int i=x.length-1; i > 0; i ) for (int i = 0; i < x.length; i++)
for (int i=0; i < x.length; i++) for (int i = 0; i < x.length; i++)
(a) Identify the fault
(b) If possible, identify a test case that does not execute the fault.
(c) If possible, identify a test case that executes the fault, but does not result
in an error state
(d) If possible identify a test case that results in an error, but not a failure.
Hint: Don’t forget about the program counter
(e) For the given test case, identify the first error state Be sure to describethe complete state
(f) Fix the fault and verify that the given test now produces the expectedoutput
1.3 COVERAGE CRITERIA FOR TESTINGSome ill-defined terms occasionally used in testing are “complete testing,” “exhaus-tive testing,” and “full coverage.” These terms are poorly defined because of afundamental theoretical limitation of software Specifically, the number of poten-tial inputs for most programs is so large as to be effectively infinite Consider aJava compiler – the number of potential inputs to the compiler is not just all Javaprograms, or even all almost correct Java programs, but all strings The only limita-tion is the size of the file that can be read by the parser Therefore, the number ofinputs is effectively infinite and cannot be explicitly enumerated