Yuan and Memon (2007) obtain GUI run-time
feedback from the execution of a “seed test suite”
and then use static analysis (with a data-flow static
analyzer) to analyze this seed test suite and
iteratively generate new test cases. The authors
utilize the run-time state to explore a larger input
space and improve fault-detection effectiveness.
They automated this feedback-based technique into a
GUI functional system testing process. Techniques
similar to static analysis from the machine learning
field, such as reinforced learning, have been used
(Mariani et al., 2012) to discover the most relevant
functionalities and to generate test cases that
thoroughly sample these functionalities. This
technique learns by itself how to interact with the
software and simulate its functionalities. Other
approaches use search-based techniques to execute
actions and observe states of a certain behaviour in
the source code (Gross et al., 2012) to generate test
cases at the GUI level.
3 PROPOSED SOLUTION
Our solution is to verify the GUI using static
analysis. The objective is that by adding the
functional system logic tests, we can verify the whole
software. Subsection 3.1 describes the ECB design
principle. Subsection 3.2 presents our definition of
input-output relation for the GUI layer of a GUI-
based software. Section 3.3 presents our fault model.
Subsection 3.4 presents our solution. Subsection 3.5
presents our implementation of the solution.
3.1 Entity Control Boundary (ECB)
Design Principle
Our work assumes that the design of the GUI-based
software under verification follows the Entity-
Control-Boundary (ECB) design principle which
divides classes over three main categories (Bruegge
and Dutoit, 2000; Bein, 2017; IBM, 2017; Pearce,
2017): Entity classes represent the information the
software needs to manipulate and determine the state
of the software (i.e., the temporary and permanent
information); Control classes realize the use cases,
implement the logic of the software, and determine
how the state of the software changes (i.e., when and
how the state changes); Boundary classes realize the
interactions between the software and the actors (e.g.,
human, hardware, other software), transmit requests
and data and determine how the software is presented
to the outside world (Bruegge and Dutoit, 2000;
Bein, 2017; IBM, 2017; Pearce, 2017). When the
software interacts with humans, Boundary classes
necessarily represent GUI classes and are
implemented with well-known packages (e.g., Swing
in Java). This design principle also assumes that
when a Boundary class transmits requests and data
back and forth between the application logic (Control
classes) and actors, thereby converting it from/into a
form that can be dealt with in the Control classes, it
does so without changing the semantics of the
information, though possibly changing the type of the
information (e.g., from an
int variable to an
Integer object) (Nunes and Cunha, 2000),
(Bruegge and Dutoit, 2000) (page 182). Our work
relies on this important design assumption.
3.2 Input-Output Relation
We refer to input variable as any variable in the GUI
code that receives a value from the user. We refer to
argument variable as any variable in the header of a
method in a Control class. We use the term input-
output relation to refer to the relation between these
two kinds of variables: an input is received from a
human actor as an input variable which, through
some control flow in the UI code, reaches an
argument variable. This is a way to model the flow
followed by data when a Boundary class converts
data received from a human actor into a form that can
be dealt with in a Control class.
Our solution, which we discuss below, relies on
the understanding of the multiplicities of this input-
output relation. This understanding will also help
during the validation of our solution. We distinguish
between six different kinds of multiplicities. In the
Many to One (N-1) multiplicity, several input
variables to Boundary classes are used to form (i.e.
compute) one argument variable to a function in a
Control class. In a One to One (1-1) multiplicity, one
input variable to a Boundary class becomes one
argument variable to a Control method. In a Many to
Many (N-M) multiplicity, many input variables to
Boundary classes contribute to many argument
variables. In a Many or One to zero (1-N..0)
multiplicity, one or more variables do not contribute
to any argument variable to the Control class. In a
One to Many (1-M) multiplicity there is one input
variable to the GUI that contributes to many
arguments of methods in Control classes. In a Zero to
one or Many (0-1..M) multiplicity, there is no input
variable to the GUI but one or many arguments to
Control methods.