Concurrent programming is increasingly present in modern applications. Although it provides higher performance and better use of available resources, the mechanisms of interaction between processes/threads result in a greater challenge for software testing activity. The nondeterminism present in those applications is one of the main issues during the test activity since the same test input can produce different possible execution paths, which may or not contain defects. The test data automatic generation can alleviate this problem, ensuring higher speed and reliability in software testing activity. This paper explores the automatic test data generation for concurrent programs through Genetic Algorithm, a bioinspired optimization technique, and proposes a test data generation approach for concurrent programs, called BioConcST, and a new operator for the selection of test subjects, called FuzzyST, which uses fuzzy logic. The approaches were evaluated in an experimental study towards their validation. The results showed that BioConcST is more promising than the other approaches at all analyzed levels. FuzzyST, together with Elitism and Tournament operators, provided the best results; however, it proved more suitable for concurrent programs of higher complexity.
K E Y W O R D Sconcurrent software testing, search-based software testing, test data generation
INTRODUCTIONAlthough most people may not know it, all current computer users and smartphones use concurrent software daily. Operating systems (OSs), included in such devices, employ concurrent programming mechanisms to manage the scheduling and execution of processes, whether in mono-processed environments, with pseudo-parallelism, or in multi-processed ones, where there is parallel execution between processes.The first contribution of concurrent programming to operating systems was proposed by Dijkstra, 1 who aimed to identify and resolve mutual exclusion for preventing a simultaneous access to a shared resource, also called a critical region. This and other mechanisms of concurrent programming have enabled Operational Systems to optimize the use of computational resources and, consequently, improve their performance.Presently, concurrent programming is no longer restricted to Operating Systems, since modern applications also demand a better use of resources and higher performance in the execution of routines and tasks. As an example, parallel programming and distributed programming, branches of concurrent programming, have led to the emergence of new technologies widely used, such as Web services and Cloud computing, which employ concepts of concurrent programming to provide communication and optimization mechanisms of services. 2,3