Formal Testing

Formal Testing is an approach to Software Testing in which a particular class of Formal Languages is used extensively in testing activities in an integrated manner. Its birth can be situated in the research work on Formal Methods.
Formal Testing intensively uses compiler technology and research results in the area of Programming Languages that have influenced the development of other Computer Languages. These technologies introduce a sophisticated automation degree in testing activities, which enables to increment both the productivity and the effectivity of Test Engineers.
Formal Testing is an approach to Software Testing in which a particular class of Formal Languages, the so-called Computer Languages, is used extensively and in an integrated manner in testing activities. Some examples are the following:
# The use of Specification Languages to develop models of the system under test from which test cases can be generated automatically (sub-approach known as Model-Based Testing)Utting, M., Pretschner, A., and Legard, B.: A taxonomy of model-based testing approaches, in Software testing, verification and reliability. John Wiley & Sons, Ltd; 2011..
# The use of Process Definition Languages Osterweil, L.J.: Software processes are software too, in Proceedings of the 9th International Conference of Software Engineering. 1987. Monterey, USA.Piccinelli, G.: A process Decomposition technique for distributed workflow management. Springer Science + Business Media; 1999. New York, USA. to document test processes to ease, among other things, the customization of products to implement these processes. 
# The use of compiler components (such as lexical, syntactic or semantic analysers)Aho, A., Lam, M; Sethi, R; Ulman, J.: Compilers: Principles, Techniques and Tools (Second Edition). Pearson Education Limited; 2014. to process the program, architecture or specification of the system under test to detect defects and obtain structural metrics to help guide testing activities.
A solid way (because it facilitates the comprehension of its fundamentals) to start applying Formal Testing in an organization is the following:
# To use a Process Definition Language to document the testing process: a) to facilitate its maintenance and continuous improvement, and to help keep it updated, consistent and complete; b) to facilitate the customization of a product to implement this process; and c) to enable the description generation of the roles involved in the process. 
# To use compiler components to analyze the code of programs, architectures or specifications to detect defects, omissions and bad practices, as well as to obtain structural metrics (specially complexity, since the more complex the component, the more error-prone it is and therefore the more it should be tested, proportionally).
# To use a Specification Language to write models of the system under test and generate automatically test cases, increasing with this the test engineers’ productivity and effectivity and making possible for them to spend more time on more strategic tasks.
A fast way (although not the most solid one) to start applying Formal Testing would include the same steps but in a different order, namely: 2, 1, 3.
The following are important milestones in the development and application of the Formal Testing approach:
The first high-level Programming Languages were developed at the end of the 1950’s. They contributed significantly to the increase of the software developers’s productivity and to the growth of the industry, and built a solid foundation for the development of other Computer Languages. 
Much of the initial work around Formal Methods to develop software goes back to the 1960’s; it was common that these methods used several Computer Languages, in particular Specification Languages and Programming Languages.
On the other hand, it is usually considered that Software Testing was born as discipline on its own with work like the one of G. Myers at the end of the 1970’s.
On top of this foundations, in the 1980’s appeared work on Formal Model Based Testing; this approach applies concepts, techniques and tools developed in the field of Formal Methods, in particular the use of Specification Languages. In those years tools based on compiler components to do program analysis also started to be used to obtain information to guide test activities.
Also in this decade quality models for software development were applied, in particular CMM (Capability Maturity Model), and some organizations applied them using Process Definition Languages.
In the 1990’s appeared many CAST tools (Computer Aided Software Testing).
In the decade of 2000 quality models for software testing were applied, like Testing Maturity Model y Test Process Improvement, and some organizations applied them using Process Definition Languages.
The decade of 2010 has seen the consolidation of these elements of the Formal Testing approach.
Category:Software testing
Category:Software engineering
Category:Formal methods