Test Template Framework Explained

The Test Template Framework (TTF) is a model-based testing (MBT) framework proposed by Phil Stocks and David Carrington in for the purpose of software testing. Although the TTF was meant to be notation-independent, the original presentation was made using the Z formal notation. It is one of the few MBT frameworks approaching unit testing.

Introduction

The TTF is a specific proposal of model-based testing (MBT). It considers models to be Z specifications. Each operation within the specification is analyzed to derive or generate abstract test cases. This analysis consists of the following steps:

  1. Define the input space (IS) of each operation.
  2. Derive the valid input space (VIS) from the IS of each operation.
  3. Apply one or more testing tactics,[1] starting from each VIS, to build a testing tree for each operation. Testing trees are populated with nodes called test classes.
  4. Prune each of the resulting testing trees.
  5. Find one or more abstract test cases from each leaf in each testing tree.

One of the main advantages of the TTF is that all of these concepts are expressed in the same notation of the specification, i.e. the Z notation. Hence, the engineer has to know only one notation to perform the analysis down to the generation of abstract test cases.

Important concepts

In this section the main concepts defined by the TTF are described.

Input space

Let

Op

be a Z operation. Let

x1...xn

be all the input and (non-primed) state variables referenced in

Op

, and

T1...Tn

their corresponding types. The Input Space (IS) of

Op

, written

ISOp

, is the Z schema box defined by

[x1:T1...xn:Tn]

.

Valid input space

Let

Op

be a Z operation. Let

preOp

be the precondition of

Op

. The Valid Input Space (VIS) of

Op

, written

VISOp

, is the Z schema box defined by

[ISOp|preOp]

.

Test class

Let

Op

be a Z operation and let

P

be any predicate depending on one or more of the variables defined in

VISOp

. Then, the Z schema box

[VISOp|P]

is a test class of

Op

. Note that this schema is equivalent to

[ISOp|preOp\landP]

. This observation can be generalized by saying that if

COp

is a test class of

Op

, then the Z schema box defined by

[COp|P]

is also a test class of

Op

. According to this definition the VIS is also a test class.

If

COp

is a test class of

Op

, then the predicate

P

in

C'Op==[COp|P]

is said to be the characteristic predicate of

C'Op

or

C'Op

is characterized by

P

.

Test classes are also called test objectives, test templates and test specifications.

Testing tactic

In the context of the TTF a testing tactic[1] is a means to partition any test class of any operation. However, some of the testing tactics used in practice actually do not always generate a partition of some test classes.

Some testing tactics originally proposed for the TTF are the following:

S\spadesuitT

where

\spadesuit

is one of

\cup

,

\cap

and

\setminus

(see Set theory).

\begin{array}{l|l} S=\emptyset,T=\emptyset&S\emptyset,T\emptyset,S\subsetT\\ \hline S=\emptyset,T\emptyset&S\emptyset,T\emptyset,T\subsetS\\ \hline S\emptyset,T=\emptyset& S\emptyset,T\emptyset,T=S\\ \hline S\emptyset,T\emptyset,S\capT=\emptyset& S\emptyset,T\emptyset,S\capT\emptyset,lnot(S\subseteqT),lnot(T\subseteqS),ST \end{array}

As can be noticed, standard partitions might change according to how much testing the engineer wants to perform.

In any of these cases, the standard partitions of the operators appearing in the expression or in the definition of a complex one, are combined to produce a partition for the expression. If the tactic is applied to the second case, then the resulting partition can be considered as the standard partition for that operator. Stocks and Carrington in illustrate this situation with

RG=(domG\ntriangleleftR)\cupG

, where

\ntriangleleft

means domain anti-restriction, by giving standard partitions for

\ntriangleleft

and

\cup

and propagating them to calculate a partition for

.

Some other testing tactics that may also be used are the following:

expr\in\{expr1,...,exprn\}

. In this case, it generates test classes such that a predicate of the form

expr=expri

is added to each of them.

var=val

where is the name of the variable and is one of the values of the set.

Z

(or its "subtype"

N

). It consists in associating a range to a variable and deriving test classes by comparing the variable with the limits of the range in some ways. More formally, let be a variable of type

Z

and let

[i,j]

be the associated range. Then, the tactic generates the test classes characterized by the following predicates:

n<i

,

n=i

,

i<n\landn<j

,

n=j

,

n>j

.

expr\subset\{expr1,...,exprn\}

. When PSSE is applied it generates

2n-1

test classes where a predicate of the form

expr=Ai

with

i\in[1,2n-1]

and

Ai\inP\{expr1,...,exprn\}\setminus\{\{expr1,...,exprn\}\}

, is added to each class.

\{expr1,...,exprn\}

is excluded from

P\{expr1,...,exprn\}

because is a proper subset of

\{expr1,...,exprn\}

.

expr\subseteq\{expr1,...,exprn\}

in which case it generates

2n

by considering also

\{expr1,...,exprn\}

.

Testing tree&

The application of a testing tactic to the VIS generates some test classes. If some of these test classes are further partitioned by applying one or more testing tactics, a new set of test classes is obtained. This process can continue by applying testing tactics to the test classes generated so far. Evidently, the result of this process can be drawn as a tree with the VIS as the root node, the test classes generated by the first testing tactic as its children, and so on. Furthermore, Stocks and Carrington in propose to use the Z notation to build the tree, as follows.

\begin{align} VIS&==[IS|

1
P]\\ TCL
T1

&==[VIS|

1
P
T1
n
]\\ &...\\ TCL
T1

&==[VIS|

n
P
T1
1
]\\ TCL
T2

&==

i
[TCL
T1

|

1
P
T2
m
]\\ &...\\ TCL
T2

&==

i
[TCL
T1

|

m
P
T2
1
]\\ &...\\ TCL
T3

&==

j
[TCL
T2

|

1
P
T3
k
]\\ &...\\ TCL
T3

&==

j
[TCL
T2

|

k
P
T3

]\\ &...\\ &...\\ &... \end{align}

Pruning testing trees

In general a test class' predicate is a conjunction of two or more predicates. It is likely, then, that some test classes are empty because their predicates are contradictions. These test classes must be pruned from the testing tree because they represent impossible combinations of input values, i.e. no abstract test case can be derived out of them.

Abstract test case

An abstract test case is an element belonging to a test class. The TTF prescribes that abstract test cases should be derived only from the leaves of the testing tree. Abstract test cases can also be written as Z schema boxes. Let

Op

be some operation, let

VISOp

be the VIS of

Op

, let

x1:T1...xn:Tn

be all the variables declared in

VISOp

, let

COp

be a (leaf) test class of the testing tree associated to

Op

, let

P1...Pm

be the characteristic predicates of each test class from

COp

up to

VISOp

(by following the edges from child to parent), and let

v1:T1...vn:Tn

be

n

constant values satisfying

P1\land...\landPm

. Then, an abstract test case of

COp

is the Z schema box defined by

[COp|x1=v1\land...\landxn=vn]

.

See also

References

Notes and References

  1. Stocks and Carrington use the term testing strategies in .