Developing software, which is free from faults, remains one of the most challenging and fundamental problems in software engineering. To realizing the precise need of software architectures, researchers have pursued formal methods, mathematically based notations, techniques, and tools for correctly documenting the software. Despite the availability and potential benefits of formal methods, the
... [Show full abstract] use of such methods is still far from the routine practices. There are numerous reasons, involving issues such as the complexity of the languages and tools, lack of expertise, and the existing software development culture. Perhaps most importantly, the use of formal methods is widely considered to be expensive, which prohibits their use for most of the critical systems. As a result of these cost issues, practicing software engineers have largely avoided formal methods, instead relying on testing. Despite the costs associated with identifying good candidate test cases, running the tests, and validating the results, developers rely upon testing as their primary method of ensuring software dependability.