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.