34
1 4004 L8 - © D. Deugo, 2003 – 2008 Testing Procedures (You MUST bring Binder chapter 10)

Testing Procedures (You MUST bring Binder chapter 10)

Embed Size (px)

DESCRIPTION

Testing Procedures (You MUST bring Binder chapter 10). We don’t really test a class do we? We can test each method of a class: method scope reuses experience in procedural testing And we can test sequences of methods of that class we will be using control flow graphs - PowerPoint PPT Presentation

Citation preview

Page 1: Testing Procedures (You MUST bring Binder chapter 10)

14004 L8 - © D. Deugo, 2003 – 2008

Testing Procedures

(You MUST bring Binder chapter 10)

Page 2: Testing Procedures (You MUST bring Binder chapter 10)

24004 L8 - © D. Deugo, 2003 – 2008

Class Testing?

• We don’t really test a class do we?– We can test each method of a class:

» method scope reuses experience in procedural testing– And we can test sequences of methods of that class

» we will be using control flow graphs– And we can consider inheritance by testing the flattened

statechart of a class

• Why not just test instances in context?– In other words, why not just scenario-based testing?

» See 5 reasons p.350, esp. 2nd one– Bottom line: a contextual testing must precede contextual

testing, but the question remains as to how much is worth investing in a contextual testing.

• There are different ways of performing class testing:

– 4 bullets p.353

Page 3: Testing Procedures (You MUST bring Binder chapter 10)

34004 L8 - © D. Deugo, 2003 – 2008

Control (or code)

Coverage

Page 4: Testing Procedures (You MUST bring Binder chapter 10)

44004 L8 - © D. Deugo, 2003 – 2008

A First Look at Code Coverage

• Definition: (p.357)– A code coverage model calls out the parts of an implementation that

must be exercised to satisfy an implementation-based test model. Coverage, as a metric, is the percentage of these parts exercised by a test suite.

• Branch coverage is said to subsume state coverage:– Exercising all branches necessarily exercises all statements

– A subsumption hierarchy is an analytical ranking of coverage strategies.

– No generalizable results about relative bug-finding effectiveness has been established…

• For Binder, a code coverage model is NOT a test model:– Test from responsibility-based models and then use coverage reports

to analyze the adequacy of a test suite.

• Coverage models typically ignore deferred methods, class scope (focusing on method scope instead) and inheritance.

Page 5: Testing Procedures (You MUST bring Binder chapter 10)

54004 L8 - © D. Deugo, 2003 – 2008

Introducing CFGs

• Code in fig 10.2 p.363

• Corresponding Control Flow Graph (CFG) in fig 10.3 p.364– A segment is 1 or more lexically contiguous statements with no

conditionally executed statements. That is, once a segment is entered, all statements in the segment will execute.

– The last statement in a segment must be a predicate, or a loop control, a break, a goto, a method exit.

• Corresponding paths in 10.4

• Dealing with If statements: fig 10.5

• Dealing with switch statements: fig 10.6– Watch out for fall-through behavior…

• In fig. 10.7, thinking in terms of Boolean expressions rather than individual predicates ignores lazy evaluation and does not considerably simplify the CFG.

Page 6: Testing Procedures (You MUST bring Binder chapter 10)

64004 L8 - © D. Deugo, 2003 – 2008

Another Example

read(x);read(y)

while x y loopif x>y then

x += x – y;

else

y += y – x;

end if;

end loop;

gcd := x;

y = 0;Do this CFG correspond to the code?

Page 7: Testing Procedures (You MUST bring Binder chapter 10)

74004 L8 - © D. Deugo, 2003 – 2008

Incompleteness

• Statement coverage typically leads to incompleteness

if x < 0 then

x := -x;

else

null;

end if

z := x;

A negative x would result in the coverage of all statements. But not exercising x >= 0 would not cover all cases (implicit code in green italic). And, doing nothing for the case x >= may turn out to be wrong and needto be tested.

Page 8: Testing Procedures (You MUST bring Binder chapter 10)

84004 L8 - © D. Deugo, 2003 – 2008

Uncovering Hidden Edges

if c1 and c2 then

st;

else

sf;

end if;

if c1 then

if c2 then

st;

else

sf;

end if;

else

sf;

end if;

Page 9: Testing Procedures (You MUST bring Binder chapter 10)

94004 L8 - © D. Deugo, 2003 – 2008

Path Coverage

• Path Coverage Criterion: Select a test suite T such that, by executing P for each test in T, all paths leading from the initial to the final node of P’s control flow graph are traversed

• In practice, however, the number of path is too large, if not infinite

• It is key to determine “critical paths”

Page 10: Testing Procedures (You MUST bring Binder chapter 10)

104004 L8 - © D. Deugo, 2003 – 2008

Example

if x 0 theny := 5;

else

z := z – x;

end if;

if z > 1 then

z := z / x;

else

z := 0;

end if;

T1 = {<x=0, z =1>, <x =1, z=3>}

Executes all edges but does not show risk of division by 0

T2 = {<x=0, z =3>, <x =1, z=1>}

Would find the problem by exercising the remaining possible flows of control through the program fragment

T1 T2 -> all paths covered

Page 11: Testing Procedures (You MUST bring Binder chapter 10)

114004 L8 - © D. Deugo, 2003 – 2008

FAQ about Coverage

• Is 100% coverage the same as exhaustive testing?

• Are branch and path coverage the same?

• Can path coverage be achieved?

• Is every path in a flow graph testable?

• Is less than 100% coverage acceptable?

• Can a trust a test suite without measuring coverage?

• When can I stop testing?

Page 12: Testing Procedures (You MUST bring Binder chapter 10)

124004 L8 - © D. Deugo, 2003 – 2008

Coverage Strategies (1)

• C1 coverage (i.e. line coverage) is not enough:– Typically does not exercise all true/false combinations for the predicates:

» entails may miss errors in predicate– Common loop bugs are missed if loop is iterated over once

• C2 coverage (i.e. branch coverage):– Every path from a node is executed at least once– Unfortunately treats a compound predicate as a single statement (if n clauses, 2n combinations, but only 2

are tested…)» This is a serious oversimplification!

• See example at top of p.375

– C2 can be achieved in D+1 paths with D 2-way branching nodes» For 10.7 the paths are at top of p.374

• Multiple condition coverage– Condition coverage: Evaluate each condition as true and as false at least once…– Branch/condition coverage: ditto + each branch at least once– Multiple condition coverage: all true-false COMBINATIONS of simple conditions at least once…

» Subsumes all of the above (and similar to All-variants of ch.6)– N.B.: not necessarily achievable (e.g. due to lazy evaluation)

• Object code coverage (!!): for safety critical applications!

Page 13: Testing Procedures (You MUST bring Binder chapter 10)

134004 L8 - © D. Deugo, 2003 – 2008

Coverage Strategies (2)

• McCabe’s basis-path test model:– C = e – n + 2 (cyclomatic complexity metric) – Supported by most coverage tools– Not proven useful, esp. in OO where 90% of methods typically have

less than 10 lines of code…– Unreliable: see fig 10.9 p.379

» The metric is not correlated to the number of entry/exit paths… and collapses compound predicates into a single node.

• In fig 10.3, C is 5 (using X, Y and Z) and this is less than 1/3 of the expanded entry-exit paths

» It is possible to select C paths and achieve NEITHER statement NOR branch coverage!!!!

• Bottom line:– CFGs are limited to small members and classes– Some authors test only the canonical form of a class– Coverage does not address inheritance

Page 14: Testing Procedures (You MUST bring Binder chapter 10)

144004 L8 - © D. Deugo, 2003 – 2008

Dealing with Loops

• A loop can be thought of as a path with several special cases!• Fig 10.10 summarizes representation of different kinds of loops• Fixed sized loops can be translated (unrolled) into a single

segment • You need at least to test 0, 1, and 2 iterations• Fig 10.11: coverage can be hopeless for a method that contains

more than 1 loop – breaking and nesting are highly problematic!

• Fig 10.12: tests for ONE loop control variable– Test: min, min +1, typical, max –1, max + exclusions

• Nested loops can be tested according to the strategy of table 10.3 (which proceeds from Procedure 4 p.383)

– See table 10.3 p.384

• Spaghetti loops with several entry or exit points should be rejected!!

Page 15: Testing Procedures (You MUST bring Binder chapter 10)

154004 L8 - © D. Deugo, 2003 – 2008

Data Flow

Coverage

Page 16: Testing Procedures (You MUST bring Binder chapter 10)

164004 L8 - © D. Deugo, 2003 – 2008

Data Flow Coverage

• Considers how data gets modified in the system and how it can get corrupted

• Recasted in OO terms, at the method scope, Binder suggests a list of 7 typical errors (p.385)

– It is unlikely the DUK method catches the last 2 bullets…

• Three kinds of actions are considered: – Define: changes the value of an instance variable– Use: C-use: really r-value P-use: used inside a predicate– Kill: “kills” instance variable

• Table 10.4 p.387 : all in/valid D/K/U pairs: really not conclusive!!• Example p.386: J and K are interesting!• This strategy is to complement control coverage!! (see bottom of p.388)

• Binder’s recommendation (see quote p.389): – all-uses criterion: at least one DU path be exercised for every definition-use pair.

• Aliasing of variables causes serious problems!!• Working things out by hand for anything but small methods is hopeless…

Page 17: Testing Procedures (You MUST bring Binder chapter 10)

174004 L8 - © D. Deugo, 2003 – 2008

Another Example

A basic block

A decision predicateinvolving max

Definitions of maxA definition of len

main() /* find longest line */{ int len; extern int max; extern char save[];

max = 0; while ((len = getline ()) > 0) if (len >= max) { max = len; copy(); } if (max > 0) /* there was a line */ printf("%s", save);}

A p-use of max

A c-use of len

Page 18: Testing Procedures (You MUST bring Binder chapter 10)

184004 L8 - © D. Deugo, 2003 – 2008

Corresponding CFG

max = 0

while((len = …

if (len >= ..

max = len

if (max > ..

v = … DefinitionDEF(v, n)

v >= … P-useUSE(v,n)

… = …v … C-useUSE(v,n)

max = len

Interestingly enough, the notionsof l-value and r-value would bebetter!!

Page 19: Testing Procedures (You MUST bring Binder chapter 10)

194004 L8 - © D. Deugo, 2003 – 2008

Factorial Example

1. void FACTORIAL (int N)

2. int RESULT = 1;

3. begin

4. for int I in 2 .. N loop

5. RESULT = RESULT * I;

6. end loop;

7. return RESULT;

8. end;

DU pairs2 52 75 55 7

Page 20: Testing Procedures (You MUST bring Binder chapter 10)

204004 L8 - © D. Deugo, 2003 – 2008

Class Control Flow

Coverage

Page 21: Testing Procedures (You MUST bring Binder chapter 10)

214004 L8 - © D. Deugo, 2003 – 2008

The Class Flow Graph

• “Test design at the class scope must produce method activation sequences to exercise intraclass (ie intermethod) control and data flow.””

• The Class Flow Graph is constructed by joining the method flow graph with a state transition diagram for each method!

– It shows how paths in each method may be followed by paths in other methods, thereby supporting intraclass path analysis.

– It represents all possible intraclass control flow paths.

– If no sequential constraint exists for method activation, then the exit node of each method is effectively connected to the entry node of EVERY other method, including its own.

– Consider figs 10.13 through 10.17

– Can apply a coverage model to it. Alpha-omega paths are numerous, even if loops are limited to 0 and 1 iteration! Choose by inspection…

Page 22: Testing Procedures (You MUST bring Binder chapter 10)

224004 L8 - © D. Deugo, 2003 – 2008

Coverage and Path Sensitization

• Consider the code p.398– Last line is wrong– Need a specific test case to find this!– Neither coverage, no all-DU will find this…

• Marick (p.399) suggests another example:– Missing a condition to check when to raise the landing gear

» Preferably must be in flight ;-)

• Path sensitization is the process of determining argument and instance variable values that will cause a particular path to be taken:

– It is undecidable… must be solved heureustically– Gets complicated as size increases…– Most of the work may have been done through UCMs– Know the 6 cases (pp.400-1) of infeasible paths

• Bottom line: know about equivalence partitioning and choosing test values using boundary value analysis!

Page 23: Testing Procedures (You MUST bring Binder chapter 10)

234004 L8 - © D. Deugo, 2003 – 2008

Boundary Value Analysis

• Only through domain analysis can you find the required equivalence classes and boundary values!!

– Fig 10.18 domain fault model– Fig 10.19 for function at bottom of p.404

» Ignores stack…– On, off, in and out points defined p.405, open/closed boundaries p.406

» e.g., table 10.5 for our functions

• Applies to primitive data types. Not classes…– Relevant to instance variables and parameters…

» The input domain of a method considers the flattened preconditions and flattened class invariant

– Back to 7.16 and 7.17: you have to define the states of an instance if you want to apply boundary value analysis

» Abstract state on/off/in points pp.408-9• E.g., for a stack in table 10.6 p.409

• Basic strategy: one-by-one– One on point and one off point for each boundary– Rules pp.411-2– Back to the domain matrix… fig 10.21

Page 24: Testing Procedures (You MUST bring Binder chapter 10)

244004 L8 - © D. Deugo, 2003 – 2008

Definitions

• An on point is a value that lies on the boundary

• An off point is a value not on a boundary

• An in point is a value that satisfies all boundary conditions and does not lie on a boundary

• An out point is a value that satisfies NO boundary condition and does not lie on any boundary

Page 25: Testing Procedures (You MUST bring Binder chapter 10)

254004 L8 - © D. Deugo, 2003 – 2008

Appendix 1

Formal Definitions for

Data Flow Coverage

Page 26: Testing Procedures (You MUST bring Binder chapter 10)

264004 L8 - © D. Deugo, 2003 – 2008

Basic Idea

• Generates test data according to the way data is manipulated in the program

• Helps define intermediary criteria between all-edges testing (possibly too weak) and all-paths testing (often impossible)

• But needs effective tool support

Page 27: Testing Procedures (You MUST bring Binder chapter 10)

274004 L8 - © D. Deugo, 2003 – 2008

Basic Definitions (1)

• Node n CFG(P) is a defining node of the variable v V, written as DEF(v,n), iff the value of the variable v is defined in the statement corresponding to node n

• Node n CFG(P) is a usage node of the variable v V, written as USE(v,n), iff the value of the variable v is used in the statement corresponding to node n

• A usage node USE(v,n) is a predicate use (denoted as P-Use) iff the statement n is a predicate statement, otherwise USE(v,n) is a computation use (denoted as C-use)

– Not the same as l-value and r-value unfortunately…

Page 28: Testing Procedures (You MUST bring Binder chapter 10)

284004 L8 - © D. Deugo, 2003 – 2008

Basic Definitions (2)

• A definition-use (sub)path with respect to a variable v (denoted du-path) is a path in PATHS(P) such that, for some v V, there are define and usage nodes DEF(v, m) and USE(v, n) such that m and n are respectively the initial and final nodes of the path.

• A definition-clear (sub)path with respect to a variable v (denoted dc-path) is a definition-use path in PATH(P) with initial and final nodes DEF(v, m) and USE(v, n) such that no other node in the path is a defining node of v.

Page 29: Testing Procedures (You MUST bring Binder chapter 10)

294004 L8 - © D. Deugo, 2003 – 2008

Formal Definitions (1)

• The set T satisfies the all-Defs criterion for the program P iff for every variable v V, T contains definition clear paths from every defining node of v to a use of v

• The set T satisfies the all-Uses criterion for the program P iff for every variable v V, T contains definition clear paths from every defining node of v to every use of v, and to the successor node of each USE(v,n)

• The set T satisfies the all-P-Uses/Some C-Uses criterion for the program P iff for every variable v V, T contains definition clear paths from every defining node of v to every predicate use of v, and if a definition of v has no P-Uses, there is a definition-clear path to at least one computation use.

Page 30: Testing Procedures (You MUST bring Binder chapter 10)

304004 L8 - © D. Deugo, 2003 – 2008

Formal Definitions (2)

• The set T satisfies the all-C-Uses/Some P-Uses criterion for the program P iff for every variable v V, T contains definition-clear paths from every defining node of v to every computation use of v, and if a definition of v has no C-Uses, there is a definition-clear path to at least one predicate use.

• The set T satisfies the all-DU-Paths criterion for the program P iff for every variable v V, T contains definition-clear paths from every defining node of v to every use of v, and to the successor node of each USE(v,n), and that these paths are either single loops traversals, or they are cycle free.

Page 31: Testing Procedures (You MUST bring Binder chapter 10)

314004 L8 - © D. Deugo, 2003 – 2008

Subsumption All paths

All definition-use paths

All uses

All computational/some predicate uses

All computational uses

All definitions

All predicate/some computational uses

All predicate uses

Edge (Branch)

Statement

Page 32: Testing Procedures (You MUST bring Binder chapter 10)

324004 L8 - © D. Deugo, 2003 – 2008

Appendix 2

Another White-Box Approach:

Mutant Testing

Page 33: Testing Procedures (You MUST bring Binder chapter 10)

334004 L8 - © D. Deugo, 2003 – 2008

Mutation Testing (!!)

• Basic idea:– Take a program and test data generated for that program

– Create a number of similar programs (mutants), each differing from the original in one small way, i.e., each possessing a fault

– E.g., replace addition operator by multiplication operator

– The original data are then run through the mutants

– If test data detect differences in mutants, then the mutants are said to be dead

– If they do not, the test data are deemed inadequate and the test data need to be re-examined, possibly augmented to kill the live mutant

Page 34: Testing Procedures (You MUST bring Binder chapter 10)

344004 L8 - © D. Deugo, 2003 – 2008

Underlying Hypotheses

• Hypotheses:– Competent programmers: they write programs that are nearly

correct

– Coupling effect: Test data that distinguishes all programs differing from a correct one by only simple errors is so sensitive that it also implicitly distinguishes more complex errors

• Observations:– What about more complex errors, involving several

statements? Do you really believe the coupling effect?

– There is some empirical evidence of these hypotheses!!