Vous êtes sur la page 1sur 29

ECE 453 CS 447 SE 465 Software Testing & Quality Assurance

Instructor Kostas Kontogiannis

Overview
Structural Testing
Introduction General Concepts Flow Graph Testing
DD-Paths Test Coverage Metrics Basis Path Testing Guidelines and Observations

Data Flow Testing Hybrid Methods Retrospective on Structural Testing

Structural Testing
Also known as glass box, structural, clear box and open box testing. A software testing technique whereby explicit knowledge of the internal workings of the item being tested are used to select the test data. Unlike black box testing that is using the program specification to examine outputs, white box testing is based on specific knowledge of the source code to define the test cases and to examine outputs.
http://www.webopedia.com/TERM/W/White_Box_Testing.html

Structural Testing
Structural testing methods are very amenable to:
Rigorous definitions
Data flow, control flow, objectives, coverage criteria, relation to programming language semantics

Mathematical analysis
Graphs, path analysis

Precise measurement
Metrics, coverage analysis
4

Program Graph - Definition


Given a program written in an imperative programming language, its Program Graph, is a directed labeled graph in which nodes are either groups of entire statements or fragments of a statement, and edges represent flow of control

P. Jorgensen, Software Testing a Craftsmans Approach

Program Graph
If i, j, are nodes in the program graph, there is an edge from node i, to node j in the program graph if an only if, the statement corresponding to node j, can be executed immediately after the last statement of the group of statement(s) that correspond to node i.
The groups of statements that make up a node in the Program Graph is called a basic block. There is a straightforward algorithm to segment a code fragment into basic blocks and create the corresponding Program Graph.
6

White-box Testing: Determining the Basic Blocks


FindMean (FILE ScoreFile) { float SumOfScores = 0.0; int NumberOfScores = 0; 1 float Mean=0.0; float Score; Read(ScoreFile, Score); 2 while (! EOF(ScoreFile) { 3 if (Score > 0.0 ) { SumOfScores = SumOfScores + Score; NumberOfScores++; } 5 Read(ScoreFile, Score); 6

} /* Compute the mean and print the result */ 7 if (NumberOfScores > 0) { Mean = SumOfScores / NumberOfScores; printf( The mean score is %f\n, Mean); } else printf (No scores found in file\n); 9 }

Constructing the Logic Flow Diagram


Start 1 F T 3 T 4 6 7 T 8 Exit
8

F 5

F 9

Program Graph - Example

Flow Graphs Use in determining Paths for Testing


V(G) = 3 Basis set: 1, 2, 3, 4, 6, 7 1, 2, 3, 4, 5, 4, 6, 7 1, 2, 6, 7 x = z+5 z = 4*3-y if(x > z) goto A; for( u=0; u < x; u++) { z = z+1; }; A: y = z + k z = z+1 u++ 1 x = z+5 z = 4*3-y

x>z
f

2 t
6

R1

R2
3

u=0 4

f 7

y = z+k

R3

u<x

Example of a simple control flowgraph.

10

Program Graph - Paths


Lets consider the following program graph:
4 8 9

5 10 6 14 7 21 16 17 15 11 12 13

18

19

22

20

11

DD-Paths (1)
The best known form of structural testing is based on a construct known as a decision-to-decision path. A DD-Path is a chains obtained from a program graph, where a chain is a path in which the initial and terminal nodes are distinct, and every interior node has indegree = 1, and outdegree = 1. We show in the next slide on selecting the nodes from a program graph to form a DD-Path chain. DD-Paths are used to create DD-Path Graphs. Note that the initial node is 2-connected to every other node in the chain, and there are no instances of 1- or 3- connected nodes. An example of a chain is shown below:

Initial node

Internal nodes

Final node 12

DD-Paths (2)
More formally a DD-Path is a chain obtained from a program graph such that:
Case1: it consists of a single node with indeg=0. Case2: it consists of a single node with outdeg=0, Case3: it consists of a single node with indeg 2 or outdeg 2 Case4: it consists of a single node with indeg =1, and outdeg = 1 Case5: it is a maximal chain of length 1
13

DD-Path Formation - Example


4 8 9

Program Graph Nodes


5

DD-Path Name first A B C D E F G

Case # 1 5 4 4 3 5 4 3

4
10
6 14 7 21 16 17 15 11 12 13

5-8 9 10 11 12-14

18

19

15 16

22

20

17
18 19 20 21 22

H
I J K L last

4
3 4 3 4 2

14

DD-Path Graph
Given a program written in an imperative language, its DD-Path graph is a labeled directed graph, in which nodes are DD-Paths pf its program graph, and edges represent control flow between successor DD-Paths.
In this respect, a DD-Path is a condensation graph. For example 2-connected program graph nodes are collapsed to a single DD-Path graph node.
15

Program Graph Nodes 4

DD-Path Name first A B C D E F G H I J K L

Case # 1 5 4 4 3 5 4 3 4 3 4 3 4

5 10 6 14 7 15 11 12 13

5-8 9 10 11 12-14
21
16 17

15 16

18

19

17 18

first

22

20

19 20

A A B C E

21

22

last

16
last

Test Coverage Metrics


The motivation of using DD-paths is that they enable very precise descriptions of test coverage.
In our quest to identify gaps and redundancy in our test cases as these are used to exercise (test) different aspects of a program we use formal models of the program structure to reason about testing effectiveness.

Test coverage metrics are a device to measure the extend to which a set of test cases covers a program.
17

Test Coverage Metrics


Metric
C0 C1 C1P C2 Cd CMCC Cik Cstat C

Description of Coverage
Every Statement Every DD-Path Every predicate to each outcome C1 Coverage + loop coverage C1 Coverage + every dependent pair of DD-Paths Multiple condition coverage Every program path that contains up to k repetitions of a loop (usually k=2) Statistically significant fraction of paths All possible execution paths
18

Statement and Predicate Coverage Testing


Statement coverage based testing aims to devise test cases that collectively exercise all statements in a program.
Predicate coverage (or branch coverage, or decision coverage) based testing aims to devise test cases that evaluate each simple predicate of the program to True and False. Here the term simple predicate refers to either a single predicate or a compound Boolean expression that is considered as a single unit that evaluates to True or False. This amounts to traversing every edge in the DD-Path graph. For example in predicate coverage for the condition if(A or B) then C we could consider the test cases A=True, B= False (true case), and A=False, B=False (false case). Note if the program was encoded as if(A) then C we would not detect any problem.
19

DD-Path Graph Edge Coverage C1


1 Here a T,T and F,F combination will suffice to have DD-Path Graph edge coverage or Predicate coverage C1 T P1 2 F

P2

20

DD-Path Coverage Testing C1P


This is the same as the C1 but now we must consider test cases that exercise all all possible outcomes of the choices T,T, T,F, F,T, F,F for the predicates P1, and P2 respectively, in the DD-Path graph.

P1

P2

21

Multiple Condition Coverage Testing


Now if we consider that the predicates P1 is a compound predicate (i.e. (A or B)) then Multiple Condition Coverage Testing requires that each possible combination of inputs be tested for each decision. Example: if (A or B) requires 4 test cases: A = True, B = True A = True, B = False A = False, B = True A = False, B = False The problem: For n conditions, 2n test cases are needed, and this grows exponentially with n
22

Dependent DD-Path Pairs Coverage Testing Cd


In simple C1 coverage criterion we are interested simply to traverse all edges in the DD-Path graph.
If we enhance this coverage criterion by ensuring that we also traverse dependent pairs of DD-Paths also we may have the chance of revealing more errors that are based on data flow dependencies. More specifically, two DD-Paths are said to be dependent iff there is a define/reference relationship between these DD-Paths, in which a variable is defined (receives a value) in one DD-Path and is referenced in the other. In Cd testing we are interested on covering all edges of the DD-Path graph and all dependent DD-Path pairs.
23

Loop Coverage
The simple view of loop testing coverage is that we must devise test cases that exercise the two possible outcomes of the decision of a loop condition that is one to traverse the loop and the other to exit (or not enter) the loop.
An extension would be to consider a modified boundary value analysis approach where the loop index is given a minimum, minimum +, a nominal, a maximum -, and a maximum value or even robustness testing. Once a loop is tested, then the tester can collapse it into a single node to simplify the graph for the next loop tests. In the case of nested loops we start with the inner most loop and we proceed outwards. If loops are knotted then we must apply data flow analysis testing techniques, that we will examine later in the course.
24

Statistically Significant Path Coverage Testing


Exhaustive testing of software is not practical because variable input values and variable sequencing of inputs result in too many possible combinations to test. NIST developed techniques for applying statistical methods to derive sample test cases would address how to select the best sample of test cases and would provide a statistical level of confidence or probability that a program implements its functional specification correctly. The goal of statistically significant coverage is to develop methods for software testing based on statistical methods, such as Multivariable Testing, Design of Experiments, and Markov Chain usage models, and to develop methods for software testing based on statistical measures and confidence levels.
Source: http://www.itl.nist.gov/div897/ctg/stat/mar98ir.pdf

25

Basis Path Testing


We can apply McCabes Cyclomatic Complexity metric
gives an upper bound on number of test cases to ensure edge coverage is satisfied.
in practice, it is usually the lower bound of the number of test cases due to the presence of loops.
26

Basis Path Testing - Motivation


If we consider the paths in a program graph (or DD-Graph) to form a vector space V, we are interested to devise a subset of V say B that captures the essence of V; that is every element of V can be represented as a linear combination of elements of B. Addition of paths means that one path is followed by another and multiplication of a number by a path denotes the repetition of a path.
If such a vector space B contains linearly independent paths and forms a basis for V then it certainly captures the essence of V.
27

McCabe Algorithm to Determine Basis Paths


The algorithm is straightforward:
The method begins with the selection of a baseline path, which should correspond to a normal execution of a program (from start node to end node, and has as many decisions as possible). The algorithm proceeds by retracing the paths visited and flipping the conditions one at a time. The process repeats up to the point all flips have been considered.

The objective is to generate test cases that exercise these basis paths.
28

Flow Graphs Use in determining Paths for Testing - Revisited


V(G) = 3 Basis set: 1, 2, 3, 4, 6, 7 1, 2, 3, 4, 5, 4, 6, 7 1, 2, 6, 7 x = z+5 z = 4*3-y if(x > z) goto A; for( u=0; u < x; u++) { z = z+1; }; A: y = z + k z = z+1 u++ 1 x = z+5 z = 4*3-y x>z f 2

t
6

R1

R2
3 y = z+k

u=0 4

f 7

R3

u<x

Example of a simple control flowgraph.

29

Vous aimerez peut-être aussi