White-Box Testing Techniques II

Slides:



Advertisements
Similar presentations
DATAFLOW TESTING DONE BY A.PRIYA, 08CSEE17, II- M.s.c [C.S].
Advertisements

A Survey of Program Slicing Techniques A Survey of Program Slicing Techniques Sections 3.1,3.6 Swathy Shankar
Data Flow Coverage. Reading assignment L. A. Clarke, A. Podgurski, D. J. Richardson and Steven J. Zeil, "A Formal Evaluation of Data Flow Path Selection.
Systems V & V, Quality and Standards
Graph Coverage (2).
Tutorial 3, Q1 Answers Consider the following simple program (in no particular language) to find the smallest prime factor of a number: smallest(int p)
The Application of Graph Criteria: Source Code  It is usually defined with the control flow graph (CFG)  Node coverage is used to execute every statement.
Unit Testing CSSE 376, Software Quality Assurance Rose-Hulman Institute of Technology March 27, 2007.
Software Testing Sudipto Ghosh CS 406 Fall 99 November 16, 1999.
Chapter 8: Path Testing Csci 565.
Software Testing and Quality Assurance
SOFTWARE TESTING WHITE BOX TESTING 1. GLASS BOX/WHITE BOX TESTING 2.
Topics in Software Dynamic White-box Testing: Data-flow Testing
Topics in Software Dynamic White-box Testing Part 2: Data-flow Testing
Introduction to Software Testing Chapter 2.3 Graph Coverage for Source Code Paul Ammann & Jeff Offutt
Paul Ammann & Jeff Offutt
Software testing techniques Testing criteria based on data flow
Presented By Dr. Shazzad Hosain Asst. Prof., EECS, NSU
1 ECE 453 – CS 447 – SE 465 Software Testing & Quality Assurance Instructor Kostas Kontogiannis.
White-Box Testing Techniques II Originals prepared by Stephen M. Thebaut, Ph.D. University of Florida Dataflow Testing.
1 Software Testing. 2 Path Testing 3 Structural Testing Also known as glass box, structural, clear box and white box testing. A software testing technique.
Test Coverage CS-300 Fall 2005 Supreeth Venkataraman.
Introduction to Software Testing Chapter 2.3 Graph Coverage for Source Code Paul Ammann & Jeff Offutt
Paul Ammann & Jeff Offutt
1 Graph Coverage (3). Reading Assignment P. Ammann and J. Offutt “Introduction to Software Testing” ◦ Section 2.2 ◦ Section
Control Flow Graphs : The if Statement 1 if (x < y) { y = 0; x = x + 1; } else { x = y; } x >= yx < y x = y y = 0 x = x + 1 if (x < y) { y = 0;
1 Test Coverage Coverage can be based on: –source code –object code –model –control flow graph –(extended) finite state machines –data flow graph –requirements.
White-Box Testing Techniques I Prepared by Stephen M. Thebaut, Ph.D. University of Florida Software Testing and Verification Lecture 7.
Software Testing and Maintenance Lecture 3 Graph Coverage for Source Code Paul Ammann & Jeff Offutt Instructor: Hossein Momeni Mazandaran.
SOFTWARE TESTING LECTURE 9. OBSERVATIONS ABOUT TESTING “ Testing is the process of executing a program with the intention of finding errors. ” – Myers.
Paul Ammann & Jeff Offutt
Software TestIng White box testing.
CS223: Software Engineering
Paul Ammann & Jeff Offutt
White-Box Testing Pfleeger, S. Software Engineering Theory and Practice 2nd Edition. Prentice Hall, Ghezzi, C. et al., Fundamentals of Software Engineering.
Control Flow Testing Handouts
Handouts Software Testing and Quality Assurance Theory and Practice Chapter 4 Control Flow Testing
Software Testing and Maintenance 1
Paul Ammann & Jeff Offutt
Paul Ammann & Jeff Offutt
Outline of the Chapter Basic Idea Outline of Control Flow Testing
Paul Ammann & Jeff Offutt
Path testing Path testing is a “design structural testing” in that it is based on detailed design & the source code of the program to be tested. The.
Structural testing, Path Testing
White-Box Testing Techniques
White-Box Testing.
Graph Coverage for Design Elements CS 4501 / 6501 Software Testing
White-Box Testing.
White-Box Testing Techniques II
Paul Ammann & Jeff Offutt
Dataflow Testing G. Rothermel.
Paul Ammann & Jeff Offutt
White-Box Testing Techniques III
White-Box Testing Techniques II
White-Box Testing.
White-Box Testing Techniques III
Paul Ammann & Jeff Offutt
Graph Coverage for Design Elements CS 4501 / 6501 Software Testing
Sudipto Ghosh CS 406 Fall 99 November 16, 1999
Graph Coverage for Source Code
Paul Ammann & Jeff Offutt
White-Box Testing Techniques I
Graph Coverage Criteria
Graph Coverage Criteria
Paul Ammann & Jeff Offutt
George Mason University
Paul Ammann & Jeff Offutt
Paul Ammann & Jeff Offutt
Software Testing and QA Theory and Practice (Chapter 5: Data Flow Testing) © Naik & Tripathy 1 Software Testing and Quality Assurance Theory and Practice.
Unit III – Chapter 3 Path Testing.
Presentation transcript:

White-Box Testing Techniques II Dataflow Testing

White-Box Testing Topics Logic coverage Dataflow coverage Path conditions and symbolic execution (lecture III) Other white-box testing strategies e.g. fault-based testing

Dataflow Coverage Basic idea: Program paths along which variables are defined and then used should be covered A family of path selection criteria has been defined, each providing a different degree of coverage CASE tool support is very desirable

Variable Definition A program variable is DEFINED when it appears: on the left hand side of an assignment statement eg y = 17 in an input statement eg read(y) as an call-by-reference parameter in a subroutine call eg update(x, &y);

Variable Use A program variable is USED when it appears: on the right hand side of an assignment statement eg y = x+17 as an call-by-value parameter in a subroutine or function call eg y = sqrt(x) in the predicate of a branch statement eg if ( x > 0 ) { … }

Variable Use: p-use and c-use Use in the predicate of a branch statement is a predicate-use or “p-use” Any other use is a computation-use or “c-use” For example, in the program fragment: if ( x > 0 ) { print(y); } there is a p-use of x and a c-use of y

Variable Use A variable can also be used and then re-defined in a single statement when it appears: on both sides of an assignment statement eg y = y + x as an call-by-reference parameter in a subroutine call eg increment( &y )

More Dataflow Terms and Definitions A path is definition clear (“def-clear”) with respect to a variable v if it has no variable re-definition of v on the path A complete path is a path whose initial node is a start node and whose final node is an exit node

Dataflow Terms and Definitions A definition-use pair (“du-pair”) with respect to a variable v is a double (d,u) such that d is a node in the program’s flow graph at which v is defined, u is a node or edge at which v is used and there is a def-clear path with respect to v from d to u Note that the definition of a du-pair does not require the existence of a feasible def-clear path from d to u

Example 1 1 2 3 4 5 1. input(A,B) if (B>1) { 2. A = A+7 } 3. if (A>10) { 4. B = A+B 5. output(A,B) input(A,B) 1 B>1 B1 2 A = A+7 3 A>10 A10 4 B = A+B 5 output(A,B)

Identifying DU-Pairs – Variable A path(s) (1,2) <1,2> (1,4) <1,3,4> (1,5) <1,3,4,5> <1,3,5> (1,<3,4>) (1,<3,5>) (2,4) <2,3,4> (2,5) <2,3,4,5> <2,3,5> (2,<3,4>) (2,<3,5>) input(A,B) 1 B>1 B1 2 A := A+7 3 A>10 A10 4 B := A+B 5 output(A,B)

Identifying DU-Pairs – Variable A path(s) (1,2) <1,2> (1,4) <1,3,4> (1,5) <1,3,4,5> <1,3,5> (1,<3,4>) (1,<3,5>) (2,4) <2,3,4> (2,5) <2,3,4,5> <2,3,5> (2,<3,4>) (2,<3,5>) input(A,B) 1 B>1 B1 2 A := A+7 3 A>10 A10 4 B := A+B 5 output(A,B)

Identifying DU-Pairs – Variable A path(s) (1,2) <1,2> (1,4) <1,3,4> (1,5) <1,3,4,5> <1,3,5> (1,<3,4>) (1,<3,5>) (2,4) <2,3,4> (2,5) <2,3,4,5> <2,3,5> (2,<3,4>) (2,<3,5>) input(A,B) 1 B>1 B1 2 A := A+7 3 A>10 A10 4 B := A+B 5 output(A,B)

Identifying DU-Pairs – Variable A path(s) (1,2) <1,2> (1,4) <1,3,4> (1,5) <1,3,4,5> <1,3,5> (1,<3,4>) (1,<3,5>) (2,4) <2,3,4> (2,5) <2,3,4,5> <2,3,5> (2,<3,4>) (2,<3,5>) input(A,B) 1 B>1 B1 2 A := A+7 3 A>10 A10 4 B := A+B 5 output(A,B)

Identifying DU-Pairs – Variable A path(s) (1,2) <1,2> (1,4) <1,3,4> (1,5) <1,3,4,5> <1,3,5> (1,<3,4>) (1,<3,5>) (2,4) <2,3,4> (2,5) <2,3,4,5> <2,3,5> (2,<3,4>) (2,<3,5>) input(A,B) 1 B>1 B1 2 A := A+7 3 A>10 A10 4 B := A+B 5 output(A,B)

Identifying DU-Pairs – Variable A path(s) (1,2) <1,2> (1,4) <1,3,4> (1,5) <1,3,4,5> <1,3,5> (1,<3,4>) (1,<3,5>) (2,4) <2,3,4> (2,5) <2,3,4,5> <2,3,5> (2,<3,4>) (2,<3,5>) input(A,B) 1 B>1 B1 2 A := A+7 3 A>10 A10 4 B := A+B 5 output(A,B)

Identifying DU-Pairs – Variable A path(s) (1,2) <1,2> (1,4) <1,3,4> (1,5) <1,3,4,5> <1,3,5> (1,<3,4>) (1,<3,5>) (2,4) <2,3,4> (2,5) <2,3,4,5> <2,3,5> (2,<3,4>) (2,<3,5>) input(A,B) 1 B>1 B1 2 A := A+7 3 A>10 A10 4 B := A+B 5 output(A,B)

Identifying DU-Pairs – Variable A path(s) (1,2) <1,2> (1,4) <1,3,4> (1,5) <1,3,4,5> <1,3,5> (1,<3,4>) (1,<3,5>) (2,4) <2,3,4> (2,5) <2,3,4,5> <2,3,5> (2,<3,4>) (2,<3,5>) input(A,B) 1 B>1 B1 2 A := A+7 3 A>10 A10 4 B := A+B 5 output(A,B)

Identifying DU-Pairs – Variable A path(s) (1,2) <1,2> (1,4) <1,3,4> (1,5) <1,3,4,5> <1,3,5> (1,<3,4>) (1,<3,5>) (2,4) <2,3,4> (2,5) <2,3,4,5> <2,3,5> (2,<3,4>) (2,<3,5>) input(A,B) 1 B>1 B1 2 A := A+7 3 A>10 A10 4 B := A+B 5 output(A,B)

Identifying DU-Pairs – Variable A path(s) (1,2) <1,2> (1,4) <1,3,4> (1,5) <1,3,4,5> <1,3,5> (1,<3,4>) (1,<3,5>) (2,4) <2,3,4> (2,5) <2,3,4,5> <2,3,5> (2,<3,4>) (2,<3,5>) input(A,B) 1 B>1 B1 2 A := A+7 3 A>10 A10 4 B := A+B 5 output(A,B)

Identifying DU-Pairs – Variable A path(s) (1,2) <1,2> (1,4) <1,3,4> (1,5) <1,3,4,5> <1,3,5> (1,<3,4>) (1,<3,5>) (2,4) <2,3,4> (2,5) <2,3,4,5> <2,3,5> (2,<3,4>) (2,<3,5>) input(A,B) 1 B>1 B1 2 A := A+7 3 A>10 A10 4 B := A+B 5 output(A,B)

Identifying DU-Pairs – Variable A path(s) (1,2) <1,2> (1,4) <1,3,4> (1,5) <1,3,4,5> <1,3,5> (1,<3,4>) (1,<3,5>) (2,4) <2,3,4> (2,5) <2,3,4,5> <2,3,5> (2,<3,4>) (2,<3,5>) input(A,B) 1 B>1 B1 2 A := A+7 3 A>10 A10 4 B := A+B 5 output(A,B)

Identifying DU-Pairs – Variable B input(A,B) du-pair path(s) (1,4) <1,2,3,4> <1,3,4> (1,5) <1,2,3,5> <1,3,5> (1,<1,2>) <1,2> (1,<1,3>) <1,3> (4,5) <4,5> 1 B>1 B1 2 A := A+7 3 A>10 A10 4 B := A+B 5 output(A,B)

Dataflow Test Coverage Criteria All-Defs for every program variable v, at least one def-clear path from every definition of v to at least one c-use or one p-use of v must be covered

Dataflow Test Coverage Criteria Consider a test case executing path: 1. <1,2,3,4,5> Identify all def-clear paths covered (ie subsumed) by this path for each variable Are all definitions for each variable associated with at least one of the subsumed def-clear paths?

Def-Clear Paths subsumed by <1,2,3,4,5> for Variable A du-pair path(s) (1,2) <1,2>  (1,4) <1,3,4> (1,5) <1,3,4,5> <1,3,5> (1,<3,4>) (1,<3,5>) (2,4) <2,3,4>  (2,5) <2,3,4,5>  <2,3,5> (2,<3,4>) (2,<3,5>) input(A,B) 1 B>1 B1 2 A := A+7 3 A>10 A10 4 B := A+B 5 output(A,B)

Def-Clear Paths Subsumed by <1,2,3,4,5> for Variable B input(A,B) du-pair path(s) (1,4) <1,2,3,4>  <1,3,4> (1,5) <1,2,3,5> <1,3,5> (4,5) <4,5>  (1,<1,2>) <1,2>  (1,<1,3>) <1,3> 1 B>1 B1 2 A := A+7 3 A>10 A10 4 B := A+B 5 output(A,B)

Dataflow Test Coverage Criteria Since <1,2,3,4,5> covers at least one def-clear path from every definition of A or B to at least one c-use or p-use of A or B, All-Defs coverage is achieved

Dataflow Test Coverage Criteria All-Uses: for every program variable v, at least one def-clear path from every definition of v to every c-use and every p-use of v must be covered Consider additional test cases executing paths: 2. <1,3,4,5> 3. <1,2,3,5> Do all three test cases provide All-Uses coverage?

Def-Clear Paths Subsumed by <1,3,4,5> for Variable A du-pair path(s) (1,2) <1,2>  (1,4) <1,3,4>  (1,5) <1,3,4,5>  <1,3,5> (1,<3,4>) (1,<3,5>) (2,4) <2,3,4>  (2,5) <2,3,4,5>  <2,3,5> (2,<3,4>) (2,<3,5>) input(A,B) 1 B>1 B1 2 A := A+7 3 A>10 A10 4 B := A+B 5 output(A,B)

Def-Clear Paths Subsumed by <1,3,4,5> for Variable B input(A,B) du-pair path(s) (1,4) <1,2,3,4>  <1,3,4>  (1,5) <1,2,3,5> <1,3,5> (4,5) <4,5>  (1,<1,2>) <1,2>  (1,<1,3>) <1,3>  1 B>1 B1 2 A := A+7 3 A>10 A10 4 B := A+B 5 output(A,B)

Def-Clear Paths Subsumed by <1,2,3,5> for Variable A du-pair path(s) (1,2) <1,2>   (1,4) <1,3,4>  (1,5) <1,3,4,5>  <1,3,5> (1,<3,4>) (1,<3,5>) (2,4) <2,3,4>  (2,5) <2,3,4,5>  <2,3,5>  (2,<3,4>) (2,<3,5>) input(A,B) 1 B>1 B1 2 A := A+7 3 A>10 A10 4 B := A+B 5 output(A,B)

Def-Clear Paths Subsumed by <1,2,3,5> for Variable B input(A,B) du-pair path(s) (1,4) <1,2,3,4>  <1,3,4>  (1,5) <1,2,3,5>  <1,3,5> (4,5) <4,5>  (1,<1,2>) <1,2>   (1,<1,3>) <1,3>  1 B>1 B1 2 A := A+7 3 A>10 A10 4 B := A+B 5 output(A,B)

Dataflow Test Coverage Criteria None of the three test cases covers the du-pair (1,<3,5>) for variable A, All-Uses Coverage is not achieved

Example 2 1. input(X,Y) 2. while (Y>0) { 3. if (X>0) 4. Y := Y-X else 5. input(X) 6. } 7. output(X,Y) 1 input(X,Y)) 2 Y>0 Y0 3 X0 X>0 input(X) 5 4 Y := Y-X 6 Y0 Y>0 7 output(X,Y)

Identifying DU-Pairs – Variable X path(s) (1,4) <1,2,3,4> <1,2,3,4,(6,3,4)*> (1,7) <1,2,7> <1,2,3,4,6,7> <1,2,3,4,6,(3,4,6)*,7> (1,<3,4>) (1,<3,5>) <1,2,3,5> (5,4) <5,6,3,4> <5,6,3,4,(6,3,4)*> 1 input(X,Y)) 2 Y>0 Y0 3 X0 X>0 input(X) 5 4 Y := Y-X 6 Y0 Y>0 7 output(X,Y)

Identifying DU-Pairs – Variable X path(s) (1,4) <1,2,3,4> <1,2,3,4,(6,3,4)*> (1,7) <1,2,7> <1,2,3,4,6,7> <1,2,3,4,6,(3,4,6)*,7> (1,<3,4>) (1,<3,5>) <1,2,3,5> (5,4) <5,6,3,4> <5,6,3,4,(6,3,4)*> 1 input(X,Y)) 2 Y>0 Y0 3 X0 X>0 input(X) 5 4 Y := Y-X 6 Y0 Y>0 7 output(X,Y)

Identifying DU-Pairs – Variable X path(s) (1,4) <1,2,3,4> <1,2,3,4,(6,3,4)*> (1,7) <1,2,7> <1,2,3,4,6,7> <1,2,3,4,6,(3,4,6)*,7> (1,<3,4>) (1,<3,5>) <1,2,3,5> (5,4) <5,6,3,4> <5,6,3,4,(6,3,4)*> 1 input(X,Y)) 2 Y>0 Y0 3 X0 X>0 input(X) 5 4 Y = Y-X 6 Y0 Y>0 7 output(X,Y)

Identifying DU-Pairs – Variable X path(s) (1,4) <1,2,3,4> <1,2,3,4,(6,3,4)*> (1,7) <1,2,7> <1,2,3,4,6,7> <1,2,3,4,6,(3,4,6)*,7> (1,<3,4>) (1,<3,5>) <1,2,3,5> (5,4) <5,6,3,4> <5,6,3,4,(6,3,4)*> 1 input(X,Y)) 2 Y>0 Y0 3 X0 X>0 input(X) 5 4 Y = Y-X 6 Y0 Y>0 7 output(X,Y)

Identifying DU-Pairs – Variable X path(s) (1,4) <1,2,3,4> <1,2,3,4,(6,3,4)*> (1,7) <1,2,7> <1,2,3,4,6,7> <1,2,3,4,6,(3,4,6)*,7> (1,<3,4>) (1,<3,5>) <1,2,3,5> (5,4) <5,6,3,4> <5,6,3,4,(6,3,4)*> 1 input(X,Y)) 2 Y>0 Y0 3 X0 X>0 input(X) 5 4 Y = Y-X 6 Y0 Y>0 7 output(X,Y)

Identifying DU-Pairs – Variable X path(s) (1,4) <1,2,3,4> <1,2,3,4,(6,3,4)*> (1,7) <1,2,7> <1,2,3,4,6,7> <1,2,3,4,6,(3,4,6)*,7> (1,<3,4>) (1,<3,5>) <1,2,3,5> (5,4) <5,6,3,4> <5,6,3,4,(6,3,4)*> 1 input(X,Y)) 2 Y>0 Y0 3 X0 X>0 input(X) 5 4 Y = Y-X 6 Y0 Y>0 7 output(X,Y)

Identifying DU-Pairs – Variable X path(s) (1,4) <1,2,3,4> <1,2,3,4,(6,3,4)*> (1,7) <1,2,7> <1,2,3,4,6,7> <1,2,3,4,6,(3,4,6)*,7> (1,<3,4>) (1,<3,5>) <1,2,3,5> (5,4) <5,6,3,4> <5,6,3,4,(6,3,4)*> 1 input(X,Y)) 2 Y>0 Y0 3 X0 X>0 input(X) 5 4 Y = Y-X 6 Y0 Y>0 7 output(X,Y)

Identifying DU-Pairs – Variable X path(s) (1,4) <1,2,3,4> <1,2,3,4,(6,3,4)*> (1,7) <1,2,7> <1,2,3,4,6,7> <1,2,3,4,6,(3,4,6)*,7> (1,<3,4>) (1,<3,5>) <1,2,3,5> (5,4) <5,6,3,4> <5,6,3,4,(6,3,4)*> 1 input(X,Y)) 2 Y>0 Y0 3 X0 X>0 input(X) 5 4 Y = Y-X 6 Y0 Y>0 7 output(X,Y)

Identifying DU-Pairs – Variable X path(s) (1,4) <1,2,3,4> <1,2,3,4,(6,3,4)*> (1,7) <1,2,7> <1,2,3,4,6,7> <1,2,3,4,6,(3,4,6)*,7> (1,<3,4>) (1,<3,5>) <1,2,3,5> (5,4) <5,6,3,4> <5,6,3,4,(6,3,4)*> 1 input(X,Y)) 2 Y>0 Y0 3 X0 X>0 input(X) 5 4 Y := Y-X 6 Y0 Y>0 7 output(X,Y)

Identifying DU-Pairs – Variable X path(s) (1,4) <1,2,3,4> <1,2,3,4,(6,3,4)*> (1,7) <1,2,7> <1,2,3,4,6,7> <1,2,3,4,6,(3,4,6)*,7> (1,<3,4>) (1,<3,5>) <1,2,3,5> (5,4) <5,6,3,4> <5,6,3,4,(6,3,4)*> 1 input(X,Y)) 2 Y>0 Y0 3 X0 X>0 input(X) 5 4 Y := Y-X 6 Y0 Y>0 7 output(X,Y)

Identifying DU-Pairs – Variable X path(s) (1,4) <1,2,3,4> <1,2,3,4,(6,3,4)*> (1,7) <1,2,7> <1,2,3,4,6,7> <1,2,3,4,6,(3,4,6)*,7> (1,<3,4>) (1,<3,5>) <1,2,3,5> (5,4) <5,6,3,4> <5,6,3,4,(6,3,4)*> 1 input(X,Y)) 2 Y>0 Y0 3 X0 X>0 input(X) 5 4 Y := Y-X 6 Y0 Y>0 7 output(X,Y)

Identifying DU-Pairs – Variable X path(s) (1,4) <1,2,3,4> <1,2,3,4,(6,3,4)*> (1,7) <1,2,7> <1,2,3,4,6,7> <1,2,3,4,6,(3,4,6)*,7> (1,<3,4>) (1,<3,5>) <1,2,3,5> (5,4) <5,6,3,4> <5,6,3,4,(6,3,4)*> 1 input(X,Y)) 2 Y>0 Y0 3 X0 X>0 input(X) 5 4 Y := Y-X 6 Y0 Y>0 7 output(X,Y)

Identifying DU-Pairs – Variable X path(s) (1,4) <1,2,3,4> <1,2,3,4,(6,3,4)*> (1,7) <1,2,7> <1,2,3,4,6,7> <1,2,3,4,6,(3,4,6)*,7> (1,<3,4>) (1,<3,5>) <1,2,3,5> (5,4) <5,6,3,4> <5,6,3,4,(6,3,4)*> 1 input(X,Y)) 2 Y>0 Y0 3 X0 X>0 input(X) 5 4 Y = Y-X 6 Y0 Y>0 7 output(X,Y)

Identifying DU-Pairs – Variable X path(s) (1,4) <1,2,3,4> <1,2,3,4,(6,3,4)*> (1,7) <1,2,7> <1,2,3,4,6,7> <1,2,3,4,6,(3,4,6)*,7> (1,<3,4>) (1,<3,5>) <1,2,3,5> (5,4) <5,6,3,4> <5,6,3,4,(6,3,4)*> 1 input(X,Y)) 2 Y>0 Y0 3 X0 X>0 input(X) 5 4 Y := Y-X 6 Y0 Y>0 7 output(X,Y)

Identifying DU-Pairs – Variable X path(s) (1,4) <1,2,3,4> <1,2,3,4,(6,3,4)*> (1,7) <1,2,7> <1,2,3,4,6,7> <1,2,3,4,6,(3,4,6)*,7> (1,<3,4>) (1,<3,5>) <1,2,3,5> (5,4) <5,6,3,4> <5,6,3,4,(6,3,4)*> 1 input(X,Y)) 2 Y>0 Y0 3 X0 X>0 input(X) 5 4 Y := Y-X 6 Y0 Y>0 7 output(X,Y)

Identifying DU-Pairs – Variable X path(s) (1,4) <1,2,3,4> <1,2,3,4,(6,3,4)*> (1,7) <1,2,7> <1,2,3,4,6,7> <1,2,3,4,6,(3,4,6)*,7> (1,<3,4>) (1,<3,5>) <1,2,3,5> (5,4) <5,6,3,4> <5,6,3,4,(6,3,4)*> 1 input(X,Y)) 2 Y>0 Y0 3 X0 X>0 input(X) 5 4 Y := Y-X 6 Y0 Y>0 7 output(X,Y)

Identifying DU-Pairs – Variable X path(s) (5,7) <5,6,7> <5,6,3,4,6,7> <5,6,3,4,6,(3,4,6)*,7> (5,<3,4>) <5,6,3,4> <5,6,3,4,(6,3,4)*> (5,<3,5>) <5,6,3,5> <5,6,3,4,6,3,5> <5,6,3,4,6,(3,4,6)*,3,5> 1 input(X,Y)) 2 Y>0 Y0 3 X0 X>0 input(X) 5 4 Y := Y-X 6 Y0 Y>0 7 output(X,Y)

Identifying DU-Pairs – Variable X path(s) (5,7) <5,6,7> † <5,6,3,4,6,7> <5,6,3,4,6,(3,4,6)*,7> (5,<3,4>) <5,6,3,4> <5,6,3,4,(6,3,4)*> (5,<3,5>) <5,6,3,5> <5,6,3,4,6,3,5> <5,6,3,4,6,(3,4,6)*,3,5> † infeasible 1 input(X,Y)) 2 Y>0 Y0 3 X0 X>0 input(X) 5 4 Y := Y-X 6 Y0 Y>0 7 output(X,Y)

Identifying DU-Pairs – Variable X path(s) (5,7) <5,6,7> † <5,6,3,4,6,7> <5,6,3,4,6,(3,4,6)*,7> (5,<3,4>) <5,6,3,4> <5,6,3,4,(6,3,4)*> (5,<3,5>) <5,6,3,5> <5,6,3,4,6,3,5> <5,6,3,4,6,(3,4,6)*,3,5> † infeasible 1 input(X,Y)) 2 Y>0 Y0 3 X0 X>0 input(X) 5 4 Y := Y-X 6 Y0 Y>0 7 output(X,Y)

Identifying DU-Pairs – Variable X path(s) (5,7) <5,6,7> † <5,6,3,4,6,7> <5,6,3,4,6,(3,4,6)*,7> (5,<3,4>) <5,6,3,4> <5,6,3,4,(6,3,4)*> (5,<3,5>) <5,6,3,5> <5,6,3,4,6,3,5> <5,6,3,4,6,(3,4,6)*,3,5> † infeasible 1 input(X,Y)) 2 Y>0 Y0 3 X0 X>0 input(X) 5 4 Y := Y-X 6 Y0 Y>0 7 output(X,Y)

Identifying DU-Pairs – Variable X path(s) (5,7) <5,6,7> † <5,6,3,4,6,7> <5,6,3,4,6,(3,4,6)*,7> (5,<3,4>) <5,6,3,4> <5,6,3,4,(6,3,4)*> (5,<3,5>) <5,6,3,5> <5,6,3,4,6,3,5> <5,6,3,4,6,(3,4,6)*,3,5> † infeasible 1 input(X,Y)) 2 Y>0 Y0 3 X0 X>0 input(X) 5 4 Y := Y-X 6 Y0 Y>0 7 output(X,Y)

Identifying DU-Pairs – Variable X path(s) (5,7) <5,6,7> † <5,6,3,4,6,7> <5,6,3,4,6,(3,4,6)*,7> (5,<3,4>) <5,6,3,4> <5,6,3,4,(6,3,4)*> (5,<3,5>) <5,6,3,5> <5,6,3,4,6,3,5> <5,6,3,4,6,(3,4,6)*,3,5> † infeasible 1 input(X,Y)) 2 Y>0 Y0 3 X0 X>0 input(X) 5 4 Y := Y-X 6 Y0 Y>0 7 output(X,Y)

Identifying DU-Pairs – Variable X path(s) (5,7) <5,6,7> † <5,6,3,4,6,7> <5,6,3,4,6,(3,4,6)*,7> (5,<3,4>) <5,6,3,4> <5,6,3,4,(6,3,4)*> (5,<3,5>) <5,6,3,5> <5,6,3,4,6,3,5> <5,6,3,4,6,(3,4,6)*,3,5> † infeasible 1 input(X,Y)) 2 Y>0 Y0 3 X0 X>0 input(X) 5 4 Y := Y-X 6 Y0 Y>0 7 output(X,Y)

Identifying DU-Pairs – Variable X path(s) (5,7) <5,6,7> † <5,6,3,4,6,7> <5,6,3,4,6,(3,4,6)*7> (5,<3,4>) <5,6,3,4> <5,6,3,4,(6,3,4)*> (5,<3,5>) <5,6,3,5> <5,6,3,4,6,3,5> <5,6,3,4,6,(3,4,6)*,3,5> † infeasible 1 input(X,Y)) 2 Y>0 Y0 3 X0 X>0 input(X) 5 4 Y := Y-X 6 Y0 Y>0 7 output(X,Y)

Identifying DU-Pairs – Variable X path(s) (5,7) <5,6,7> † <5,6,3,4,6,7> <5,6,3,4,6,(3,4,6)*7> (5,<3,4>) <5,6,3,4> <5,6,3,4,(6,3,4)*> (5,<3,5>) <5,6,3,5> <5,6,3,4,6,3,5> <5,6,3,4,6,(3,4,6)*,3,5> † infeasible 1 input(X,Y)) 2 Y>0 Y0 3 X0 X>0 input(X) 5 4 Y := Y-X 6 Y0 Y>0 7 output(X,Y)

Identifying DU-Pairs – Variable X path(s) (5,7) <5,6,7> † <5,6,3,4,6,7> <5,6,3,4,6,(3,4,6)*7> (5,<3,4>) <5,6,3,4> <5,6,3,4,(6,3,4)*> (5,<3,5>) <5,6,3,5> <5,6,3,4,6,3,5> † <5,6,3,4,6,(3,4,6)*,3,5> † infeasible 1 input(X,Y)) 2 Y>0 Y0 3 X0 X>0 input(X) 5 4 Y := Y-X 6 Y0 Y>0 7 output(X,Y)

Identifying DU-Pairs – Variable X path(s) (5,7) <5,6,7> † <5,6,3,4,6,7> <5,6,3,4,6,(3,4,6)*7> (5,<3,4>) <5,6,3,4> <5,6,3,4,(6,3,4)*> (5,<3,5>) <5,6,3,5> <5,6,3,4,6,3,5> † <5,6,3,4,6,(3,4,6)*,3,5> † † infeasible 1 input(X,Y)) 2 Y>0 Y0 3 X0 X>0 input(X) 5 4 Y := Y-X 6 Y0 Y>0 7 output(X,Y)

More Dataflow Terms and Definitions A path (either partial or complete) is simple if all edges within the path are distinct ie different A path is loop-free if all nodes within the path are distinct ie different

Simple and Loop-Free Paths <1,3,4,2> <1,2,3,2> <1,2,3,1,2> <1,2,3,2,4>

More Dataflow Terms and Definitions A path <n1,n2,...,nj,nk> is a du-path with respect to a variable v if v is defined at node n1 and either: there is a c-use of v at node nk and <n1,n2,...,nj,nk> is a def-clear simple path, or there is a p-use of v at edge <nj,nk> and <n1,n2,...nj> is a def-clear loop-free path.

More Dataflow Terms and Definitions A path <n1,n2,...,nj,nk> is a du-path with respect to a variable v if v is defined at node n1 and either: there is a c-use of v at node nk and <n1,n2,...,nj,nk> is a def-clear simple path, or there is a p-use of v at edge <nj,nk> and <n1,n2,...nj> is a def-clear loop-free path. NOTE!

Identifying du-paths X: (5,7) <5,6,7> † <5,6,3,4,6,7> du-pair path(s) du-path? X: (5,7) <5,6,7> † <5,6,3,4,6,7> <5,6,3,4,6,(3,4,6)*,7> X: (5,<3,4>) <5,6,3,4> <5,6,3,4,(6,3,4)*> X: (5,<3,5>) <5,6,3,5> <5,6,3,4,6,3,5> † <5,6,3,4,6,(3,4,6)*,3,5> † † infeasible

Another Dataflow Test Coverage Criterion All-DU-Paths: for every program variable v, every du-path from every definition of v to every c-use and every p-use of v must be covered

Exercise Identify all c-uses and p-uses for variable Y in Example 2 For each c-use or p-use, identify (using the “ * ” notation) all def-clear paths Identify whether or not each def-clear path is feasible, and whether or not it is a du-path

White-Box Coverage Subsumption Relationships Path Compound Condition All du-paths Branch / Condition Basis Paths All-Uses Loop Condition Branch All-Defs Statement