Title: CS 406 Software Testing Fall 98Part II: Functional Testing
1CS 406 Software Testing Fall 98 Part II
Functional Testing
- Aditya P. Mathur
- Purdue University
Last update July 19, 1998
2Part II Functional testing
- Learning objectives-
- What is functional testing?
- How to perform functional testing?
- What are clues, test requirements, and test
specifications? - How to generate test inputs?
- What are equivalence partitioning, boundary value
testing, domain testing, state testing, and
decision table testing?
3What is functional testing?
- When test inputs are generated using program
specifications, we say that we are doing
functional testing. - Functional testing tests how well a program meets
the functionality requirements.
4The methodology
- The derivation of test inputs is based on program
specifications. - Clues are obtained from the specifications.
- Clues lead to test requirements.
- Test requirements lead to test specifications.
- Test specifications are then used to actually
execute the program under test.
5Test methodology
Specifications
Clues
Expected behavior
Program output is correct
Test requirements
Oracle
or
Test specifications
Program has failed make a note and proceed with
testing or get into the debug mode.
Test driver
Until specs. Exhausted.
Actual behavior
Program
6Specifications
- Inputs and tasks
- Given inputs
- Perform tasks
-
7Specifications-continued
- Input properties
- Input
- must satisfy
- Function f is a pre-condition on input
-
8Specifications-continued
- Two types of pre-conditions are considered
- Validated those that are required to be
validated by the program under test and an error
action is required to be performed if the
condition is not true. - Assumed those that are assumed to be true and
not checked by the program under test.
9Specification example
- For the sort program
- Inputs are
- N
- pointer to a sequence of length N
- pointer to an area in memory where the output
sequence is to be placed.
10Specification example..continued
- Tasks to be performed
- Sort the sequence in ascending order
- Return the sorted sequence in an area provided.
- Return 1 if sorting is successful, -1 otherwise.
11Preconditions for sort
- Validated
- Ngt0
- On failure return -1 sorting considered
unsuccessful. - Assumed
- The input sequence contains N integers.
- The output area has space for at least N integers.
12Deriving pre-conditions
- Pre-conditions result from properties of inputs.
- Example
- alpha_sequence(name)
- alpha_sequence is the string obtained from name
by removing all characters other then A-Z, and
a-z. Thus, if name is A12C then alpha_name is
AC.
13Deriving pre-conditions-continued
- This leads to the following pre-condition
- Validated the string alpha_sequence(name) is
shorter than name. - On failure print invalid name.
- This property could also lead to the
pre-condition - Assumed the string alpha_ sequence(name) is
shorter than name.
14Post-conditions
- A post-condition specifies a property of the
output of a program. - The general format of a post-condition is
- if condition then effect-1 else effect-2
- Example
- For the sort program a post-condition is
- if Ngt0 then the output sequence has the same
elements as in the input sequence and in
ascending order.
15Post-condition-continued
- This could be stated more formally as
- if Ngt0 then
-
- and each is a member
of the input sequence and sort returns 1. - else
- the output sequence is undefined and sort
returns -1. -
16Post-condition-continued
- Another example
- if (AB) and (BC) then return equilateral
- Can you complete the above post-condition for a
program that is required to classify a triangle
given the length of three sides? - Convention We will not nest if-then-else
statements while specifying a post-condition.
17Incompleteness of specifications
- Specifications may be incomplete or ambiguous.
- Example post-condition
- if user places cursor on the name field then
read a string - This post-condition does not specify any limit on
the length of the input string hence is
incomplete.
18Ambiguous specifications
- It also does not make it clear as to
- whether a string should be input only after the
user has placed the cursor on the name field and
clicked the mouse or simply placed the cursor on
the name field. - and hence is ambiguous.
19Clues summary
- Clues are
- Pre-conditions
- Post-conditions
- Variables, e.g. A is a length implying thereby
that its value cannot be negative. - Operations, e.g. search a list of names or
find the average of total scores - Definitions, e.g. filename(name) is a name is no
spaces.
20Clues-continued
- Ideally variables, operations and definitions
should be a part of at least one pre- or
post-condition. - However, this may not be the case as
specifications are not always written formally. - Hence look out for variables, operations, and
definitions within a specification!
21Test requirements
- A test requirement is a description of how to
test the program that is under test. - Here is a sample test requirement for a program
that classifies a triangle given the length of
three sides. - A, B, C are non-zero and positive.
- One of A, B, C is negative error condition.
- One of A, B, C is zero error condition.
22Test requirements-derivation
- Test requirements are derived from clues.
- For example, consider the following
pre-conditions (clues) - Assumed A, B, and C are lengths
- Validated Agt0, Bgt0, Cgt0
- These pre-conditions on A, B, and C lead to the
test requirement given above.
23Test requirements-derivation
- Note that we have clumped pre-condition for each
input variable into one condition. This is being
done only for inconvenience. - It is recommended that pre-conditions be
separated for each variable.
24Test requirements-derivation
- Note also that each validated pre-condition
results in at least two requirements one for the
validated part and the other for the failure
part. - In our example above we did not list all
requirements. For example, we are content with
testing one of A, B, C is negative error
condition.
25Test requirements-derivation
- Post-conditions also lead to test requirements.
- For example, the partial post-condition
- if (AB) and (BC) then return equilateral
- leads to the following test requirement
- AB and BC.
26Compound validated pre-conditions
- Compound pre-conditions are ones that use the and
or or connectors. - Examples validated compound pre-conditions
- Pre-condition A and B
- Pre-condition user places the mouse over the
name field and clicks it.
27Compound validated pre-conditions
- The first of the above pre-conditions leads to
four requirements - A true, B true (This is the validated part)
- A false, B true (This and the rest are failures)
- A true, B false
- A false, B false
- You may work out the requirements for compound
pre-condition with the or connector.
28Compound validated pre-conditions
- Compound validated pre-conditions could become
quite complex. - Example (A and (B or C))
- Brute force method will lead to 8 test
requirements.
29Compound validated pre-conditions
- In general this will lead to too many test
requirements. - We can prune them by leaving out those
requirements that are unlikely to reveal a
program error. - For example, consider the validated
pre-condition A or B.
30Pruning test requirements
- There are four possible test requirements
- A true, B true
- A false, B true
- A true, B false
- A false, B false
- Consider a correct C implementation
- if (!(A B))
- exit_with_error(Error A is d, B is d, A,
B) - else.. / the validated code comes here./
31Possible errors
- Programmer forgets to check for one of the two
cases resulting in the code - if (!A)
- exit_with_error(Error A is d, B is d, A,
B) - or
- if (!B)
- exit_with_error(Error A is d, B is d, A,
B)
32Possible errors-continued
- Or use a wrong logical operator as in
- if (!(A B))
- exit_with_error(Error A is d, B is d, A,
B) - Let us analyze how the four different tests will
perform in each of the four implementations one
correct, and three incorrect ones.
33Truth table or condition
- A B !(A B) !(AB) !A !B
- T F F T F T
- F T F T T F
- F F T T T T
- T T F F F F
Inputs
Correct implementation
Incorrect implementations
Notice this one will it help find any of the
three possible errors?
34Truth table analysis
- Case 1
- A test input with Atrue and Bfalse will cause
the correct program to evaluate the condition to
false. - The two incorrect implementations, !(AB) and
(!B) will evaluate the condition to true.
35Truth table analysis-continued
- Both incorrect implementations will print the
error message. - The oracle will observe that the correct and the
incorrect implementations behave differently. - It will therefore announce failure for each
incorrect implementation thereby pointing to an
error. - End of Case 1.
36Truth table analysis-continued
- Case 2
- Test input Afalse and Btrue will reveal the
error in the two incorrect implementations,
!(AB) and (!A). - Case 3
- Test input Afalse and Bfalse might find a fault
in the then branch of the if condition.
37Truth table analysis-continued
- Case 4
- Test input Atrue and Btrue might find a fault
in the else branch of the if condition. - Thus, all four test inputs are likely to be
useful.
38Truth table analysis-continued
- However, if we were to check for the correct
implementation of the condition A or B, then only
the first two inputs are necessary. - In this example, reducing the number of test
specifications from 4 to 2 does not lead to any
significant savings. When will the savings be
significant? -
39Assumed pre-conditions
- Each assumed pre-condition is likely to result in
a test requirement. - Example
- Assumed MODE is on ground or flying
- This leads to two requirements
- MODE is on ground , MODE is not flying
- MODE is not on ground , MODE is flying
40Assumed pre-conditions
- These can be simplified to
- MODE is on ground
- MODE is flying
41Test requirements checklist
- Obtaining clues and deriving test requirements
can become a tedious task. - To keep it from overwhelming us it is a good idea
to make a checklist of clues. - This checklist is then transformed into a
checklist of test requirements by going through
each clue and deriving test requirements from it.
42Test specifications
- A test requirements indicates how to test a
program. But it does not provide exact values of
inputs. - A test requirement is used to derive test
specification, which is the exact specification
of values of input and environment variables.
43Test specifications-continued
- There may not be a one-to-one correspondence
between test requirements and test
specifications. - A test requirement checklist might contain 50
entries. These might result in only 22 test
specifications. - The fewer the tests the better but only if these
tests are of good quality!
44Test specifications-continued
- We will discuss test quality when discussing test
assessment. - A test specification looks like this
- Test 2
- global variable all_files is initially false.
- next_record is set to 1.
- Upon return expect
- all_files to be true
- next_record is last_record1
45Test specifications-continued
- Notice the format of a test specification
- Each test is given a number which serves as its
identifier. - There is a set of input values.
- There is a set of expected values upon return
from execution. Any side effects on files or
networks must also be specified here. In essence,
all observable effects must be specified in the
Expect part of a test specification.
46Test specifications-continued
- Any side effects on files or networks must also
be specified. In essence, all observable effects
must be specified in the Expect part of a test
specification. - Similarly, values of all input variables, global
or otherwise, must also be specified.
47Test requirements to specifications
- The test requirements checklist guides the
process of deriving test specifications. - Initially all entries in the checklist are
unmarked or set to 0. - Each time a test is generated from a requirement
it is marked or the count incremented by 1.
48Test requirements to specifications
- Thus, at any point in time, one could assess the
progress made towards the generation of test
specifications. - One could also determine how many tests have been
generated using any test requirement.
49Test requirements to specifications
- Once a test requirement has been marked or its
count is more than 0 we say that it has been
satisfied. - Some rules of thumb to use while designing tests
- Try to satisfy multiple requirements using only
one test. - Satisfy all test requirements.
50Test requirements to specifications
- Avoid reuse of same values of a variable in
different tests. Generating new tests by varying
an existing one is likely to lead to tests that
test the same part of the code as the previous
one. - In testing, variety helps!
- Though we try to combine several test
requirements to generate one test case, this is
not advisable when considering error conditions.
51Test requirements to specifications
- For example, consider the following
- speed_dial, an interval
- speed_diallt0 ,error
- speed_dialgt120, error
- zones, an interval
- zones lt5, error
- zonesgt10, error
52Test requirements to specifications
- One test specification obtained by combining the
two requirements above is - speed_dial-1
- zone3
- Now, if the code to handle these error conditions
is
53Test requirements to specifications
- if (speed_diallt0 speed_dialgt120)
- error_exit(Incorrect speed_dial)
- if (zonelt6 zonegt10)
- error_exit(Incorrect zone)
- For our test, the program will exit before it
reaches the second if statement. Thus, it will
miss detecting the error in coding the test for
zone.
error
54Test requirements to specifications
- Also, do not assume an error test to satisfy any
other test requirement. - Example
- Consider the function
- myfunction(int X, int Y)
- A test for the erroneous value of X might not
test the code that uses Y.
55Test requirements to specifications
- Test specifications must not mention internal
variables. Remember, a test specification aids
in setting input variables to suitable values
before the test begins. Values of internal
variables are computed during program execution. - However, there are exceptions to the above rule.
Can you think of one?
56Equivalence partitioning
- The input domain is usually too large for
exhaustive testing. - It is therefore partitioned into a finite number
of sub-domains for the selection of test inputs. - Each sub-domain is known as an equivalence class
and serves as a source of at least one test
input.
57Equivalence partitioning
Input domain partitioned into four sub-domains.
Input domain
Four test inputs, one selected from each
sub-domain.
Too many test inputs.
58How to partition?
- Inputs to a program provide clues to
partitioning. - Example 1
- Suppose that program P takes an input X, X being
an integer. - For Xlt0 the program is required to perform task
T1 and for Xgt0 task T2.
59How to partition?-continued
- The input domain is prohibitively large because X
can assume a large number of values. - However, we expect P to behave the same way for
all Xlt0. - Similarly, we expect P to perform the same way
for all values of Xgt0. - We therefore partition the input domain of P into
two sub-domains.
60Two sub-domains
One test case X-3
Equivalence class
Xlt0
Xgt0
Another test case X-15
Equivalence class
All test inputs in the Xlt0 sub-domain are
considered equivalent. The assumption is that if
one test input in this sub-domain reveals an
error in the program, so will the others. This
is true of the test inputs in the Xgt0 sub-domain
also.
61Non-overlapping partitions
- In the previous example, the two equivalence
classes are non-overlapping. In other words the
two sub-domains are disjoint. - When the sub-domains are disjoint, it is
sufficient to pick one test input from each
equivalence class to test the program.
62Non-overlapping partitions
- An equivalence class is considered covered when
at least one test has been selected from it. - In partition testing our goal is to cover all
equivalence classes.
63Overlapping partitions
- Example 2
- Suppose that program P takes three integers X, Y
and Z. It is known that - XltY
- ZgtY
64Overlapping partitions
XltY, ZltY X2, Y3, Z1
XgtY, ZltY X15, Y4, Z1
XltY
XgtY
XltY, ZgtY X3, Y4, Z7
ZgtY
ZltY
XgtY, ZgtY X15, Y4, Z7
65Overlapping partition-test selection
- In this example, we could select 4 test cases as
- X4, Y7, Z1 satisfies XltY
- X4, Y2, Z1 satisfies XgtY
- X1, Y7, Z9 satisfies ZgtY
- X1, Y7, Z2 satisfies ZltY
- Thus, we have one test case from each equivalence
class.
66Overlapping partition-test selection
- However, we may also select only 2 test inputs
and satisfy all four equivalence classes - X4, Y7, Z1 satisfies XltY and ZltY
- X4, Y2, Z3 satisfies XgtY and ZgtY
- Thus, we have reduced the number of test cases
from 4 to 2 while covering each equivalence class.
67Partitioning using non-numeric data
- In the previous two examples the inputs were
integers. One can derive equivalence classes for
other types of data also. - Example 3
- Suppose that program P takes one character X and
one string Y as inputs. P performs task T1 for
all lower case characters and T2 for upper case
characters. Also, it performs task T3 for the
null string and T4 for all other strings.
68Partitioning using non-numeric data
X LC, Y not null
X UC, Y not null
X LC
XUC
X LC, Y null
Y not null
Y null
LC Lower case character UC Upper case
character null null string.
X UC, Y null
69Non-numeric data
- Once again we have overlapping partitions.
- We can select only 2 test inputs to cover all
four equivalence classes. These are - X lower case, Y null string
- X upper case, Y not a null string
70Guidelines for equivalence partitioning
- Input condition specifies a range create one for
the valid case and two for the invalid cases. - e.g. for altXltb the classes are
- altXltb (valid case)
- Xlta and Xgtb (the invalid cases)
71Guidelines-continued
- Input condition specifies a value create one for
the valid value and two for incorrect values
(below and above the valid value). This may not
be possible for certain data types, e.g. for
boolean. - Input condition specifies a member of a set
create one for the valid value and one for the
invalid (not in the set) value.
72Sufficiency of partitions
- In the previous examples we derived equivalence
classes based on the conditions satisfied by
input data. - Then we selected just enough tests to cover each
partition. - Think of the advantages and disadvantages of this
approach!
73Boundary value analysis (BVA)
- Another way to generate test cases is to look for
boundary values. - Suppose a program takes an integer X as input.
- In the absence of any information, we assume that
X0 is a boundary. Inputs to the program might
lie on the boundary or on either side of the
boundary.
74BVA continued
- This gives us 3 test inputs
- X0, X-20, and X14.
- Note that the values -20 and 14 are on either
side of the boundary and are chosen arbitrarily. - Notice that using BVA we get 3 equivalence
classes. One of these three classes contains only
one value (X0), the other two are large!
75BVA continued
- Now suppose that a program takes two integers X
and Y and that x1ltXltx2 and y1ltYlty2.
14
2
5
1
y2
10
11
6
9
8
13
12
y1
3
4
7
x1
x2
76BVA-continued
- In this case the four sides of the rectangle
represent the boundary. - The heuristic for test selection in this case is
- Select one test at each corner (1, 2, 3, 4).
- Select one test just outside of each of the four
sides of the boundary (5, 6, 7, 8)
77BVA-continued
- Select one test just inside of each of the four
sides of the boundary (10, 11, 12, 13). - Select one test case inside of the bounded region
(9). - Select one test case outside of the bounded
region (14). - How many equivalence classes do we get?
78BVA -continued
- In the previous examples we considered only
numeric data. - BVA can be done on any type of data.
- For example, suppose that a program takes a
string S and an integer X as inputs. The
constraints on inputs are - length(S)lt100 and altXltb
- Can you derive the test cases using BVA?
79BVA applied to output variables
- Just as we applied BVA to input data, we can
apply it to output data. - Doing so gives us equivalence classes for the
output domain. - We then try to find test inputs that will cover
each output equivalence class.
80BVA-continued
- Example each student to construct one!
81Finite State Machines (FSMs)
- A state machine is an abstract representation of
actions taken by a program or anything else that
functions! - It is specified as a quintuple
- A a finite input alphabet
- Q a finite set of states
- q0 initial state which is a member of Q.
82FSMs-continued
- T state transitions which is a mapping
- Q x A--gt Q
- F A finite set of final states, F is a subset of
Q. - Example Here is a finite state machine that
recognizes integers ending with a carriage return
character. - A0,1,2,3,4,5,6,7,8,9, CR
- Qq0,q1,q2
- q0 initial state
83FSMs-continued
- T ((q0,d),q1),(q1,d),q1), (q1,CR),q2)
- F q2
- A state diagram is an easier to understand
specification of a state machine. For the above
machine, the state diagram appears on the next
page.
84State diagram
State transitions indicated by labeled arrows
from one state the another (which could be the
same). Each label must be from the alphabet. It
is also known as an event.
d denotes a digit
85State diagram-actions
x/y x is an element of the alphabet and y is an
action.
d/add 10d to i
d/set i to d
CR/output i
i is initialized to d when the machine moves from
state q0 to q1. i is incremented by 10d when the
machine moves from q1 to q1. The current value of
i is output when a CR is encountered. Can you
describe what this machine computes?Can you
construct a regular expression that describes
all strings recognized by this state machine?
86State machine languages
- Each state machine recognizes a language.
- The language recognized by a state machine is the
set S of all strings such that - when any string s in S is input to the state
machine the machine goes through a sequence of
transitions and ends up in the final state after
having scanned all elements of s.
87State diagram-errors
d/add 10d to I
d/set I to d
CR/output I
CR/output error
reset
q4
q4 has been added to the set of states. It
represents an error state. Notice that reset is a
new member added to the alphabet.
88State diagram-program
- A state diagram can be transformed into a program
using case analysis. Here is a C program fragment
that embodies logic represented by the previous
state diagram. - There is one function for each action.
- digit is assumed to be provided by the lexical
analyzer.
89Program for integer state machine
/ state is global, with values q0, q1, q2. i is
also global./
- case q0
- idigit / perform action. /
- stateq1 / set next state. /
- break / event digit is done. /
- case q1
- ii10digit / Add the next digit. /
- stateq1
- break
- /complete the program. /
void event_digit()
switch (state)
90Checking state diagrams
- Unreachable state One that cannot be reached
from q0 using any sequence of transitions. - Dead state One that cannot be left once it is
reached.
91Test requirements
- Every state must be reached at least once, Obtain
100 state coverage. - Every transition must be exercised at least
once.Obtain 100 transition coverage. - The textbook talks about duplicate transitions.
No transitions are duplicate if the state machine
definition we have given is used.
92Example test requirements
- For the integer state machine
- state machine transitions
- event digit in state q0
- event CR in state q0
- event digit in state q1
- event CR in state q1
- event reset in state q4
93More testing of state machines?
- Yes, it is possible!
- When we learn about path coverage we will discuss
how more test requirements can be derived from a
state diagram.
94Test specifications
- As before, test specifications are derived from
test requirements. - In the absence of dead states, all states and
transitions can be reached by one test. - It is advisable not to test the entire machine
with one test case. - Develop test specifications for our integer
state machine.
95Decision tables
- Requirements of certain programs are specified by
decision tables. - Such tables can be used for deriving test
requirements and specifications. - A decision table is useful when specifying
complex decision logic
96Decision tables
- A decision table has two parts
- condition part
- action part
- The two together specify under what condition
will an action be performed.
97Decision table-nomenclature
- C denotes a condition
- A denotes an action
- Y denotes true
- Ndenotes false
- X denotes action to be taken.
- Blank in condition denotes dont care
- Blank in action denotes do not take the action
98Bank example
- Consider a bank software responsible for debiting
from an account. The relevant conditions and
actions are - C1 The account number is correct
- C2 The signature matches
- C3 There is enough money in the account
- A1 Give money
- A2 Give statement indicating insufficient funds
- A3 Call vigilance to check for fraud!
99Decision tables
100Example-continued
- A1 is to be performed when C1, C2, and C3 are
true. - A2 is to be performed when C1 is true and C2 and
C3 are false or when C1 and C2 are true and C3 is
false. - A3 is to be performed when C2 and C3 are false.
101Default rules
- Are all possible combinations of conditions
covered? - No! Which ones are not covered?
- We need a default action for the uncovered
combinations. A default action could be an error
report or a reset.
102Example-test requirements
- Each column is a rule and corresponds to at
least one test requirement. - If there are n columns then there are at least n
test requirements. - What is the maximum number of test requirements?
103Example-test specifications
- For each test requirement find a set of input
values of variables such that the selected rule
is satisfied. - When this test is input to the program the output
must correspond to the action specified in the
decision table. - Should the testing depend on the order in which
the conditions are evaluated?
104Summary
- Specifications, pre-conditions, and
post-conditions. - Clues, test requirements, and test
specifications. - Clues from code.
- Test requirements catalog.
- Equivalence partitioning and boundary value
analysis.
105Summary-continued
- Finite state machine
- State diagram
- Events and actions
- Unreachable and dead states
- Test requirements and specifications for state
machines - Decision tables, rules, actions