<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>Researching of methods for assessing the complexity of program code when generating input test data</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Konstantin Serdyukov</string-name>
          <email>zores@live.ru</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Tatyana Avdeenko</string-name>
          <email>tavdeenko@mail.ru</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Novosibirsk State Technical University</institution>
          ,
          <addr-line>Novosibirst</addr-line>
          ,
          <country country="RU">Russia</country>
        </aff>
      </contrib-group>
      <pub-date>
        <year>2020</year>
      </pub-date>
      <fpage>299</fpage>
      <lpage>304</lpage>
      <abstract>
        <p>-This article proposes a comparison of methods for determining code complexity when generating data sets for software testing. The article offers the results of a study for evaluating one path of program code, the work is not finished yet, it will be further expanded to select data for testing many paths. To solve the problem of generating test data sets, it is proposed to use a genetic algorithm with various metrics for determining the complexity of program code. A new metrics is proposed for determining code complexity based on changing weights of nested operations. The article presents the results and comparison of the generated input test data for the passage along the critical path. For each metric considered in the article, conclusions are presented to identify specifics depending on the selected data.</p>
      </abstract>
      <kwd-group>
        <kwd>test data generation</kwd>
        <kwd>genetic algorithm</kwd>
        <kwd>metrics of asserting code complexity</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>I. INTRODUCTION</title>
      <p>Software engineering is a comprehensive, systematic
approach to the development and maintenance of software.
When developing programs, the following stages are most
often distinguished - analysis, design, programming and
testing. At the stage of analysis, software requirements are
determined and documentation is performed. At the design
stage, the appearance of the program is detailed, its internal
functionality is determined, the product structure is
developed, and requirements for subsequent testing are
introduced. Writing the source code of a program in one of
the programming languages is done at the programming
stage.</p>
      <p>One of the most important steps in developing software
products is testing. Important goals of testing are the
compliance of the developed program with the specified
requirements, adherence to logic in the data processing
processes and obtaining correct final results. Therefore, for
testing it is very important to generate input test data, on the
basis of which the program will be checked for errors and
compliance with specified requirements. To esteem the
quality of the input data a code coverage indicator is used,
that is percentage of the entire program can the test sets
“cover”. It is determined by the ratio of the tested operations
to the total number of operations in the code.</p>
      <p>Some software code testing processes are improving quite
slowly. The development of most types of test scenarios is
most often done manually, without the use of any automation
systems. Because of this the testing process becomes
incredibly complicated and costly both in time and in
finances, if you approach it in all seriousness. Up to 50% of
all time costs can be spent on testing some programs.</p>
      <p>One of the main goals of testing is to create a test sets that
would ensure a sufficient level of quality of the final product
by checking most of the various paths of the program code,
i.e. would provide maximum coverage. Nevertheless, the task
of finding many paths itself consists of several sub-tasks, the
solution of which is necessary to find high-quality test sets.
One of the local problems that can be solved to find a test set
is to determine one of the most complex code paths.</p>
      <p>For the most part, validation and verification of software
products is difficult to optimize. It is especially difficult to
automate the generation of test data, which for the most part
is done manually.</p>
      <p>Nevertheless, there are many studies using non-standard
algorithms to solve the automation problem. For example, in
[1] it is proposed to use a Constraint-Based Algorithm for the
Mort system, which uses error testing to find input test data.
Test data is selected in such a way as to determine the
presence or absence of certain errors.</p>
      <p>Quite often, genetic algorithms are used in one way or
another to solve this problem. The article [2] compares
different methods for generating test data, including genetic
algorithms, a random search method and other heuristic
methods.</p>
      <p>In [3] to solve the problem, it is proposed to use
Constraint Logic Programming and Symbolic Execution. In
[4], the Constraint Handling Rules are used to help in manual
verification of problem areas in the program.</p>
      <p>Some researchers use heuristic methods to automate the
testing process using a data-flow diagram. Studies of
automation methods using this diagram were done in articles
[5, 6, 7, 8]. In [5] it is proposed to additionally use genetic
algorithms to generate new input test data sets based on
previously generated ones.</p>
      <p>
        In articles [
        <xref ref-type="bibr" rid="ref10">9, 10</xref>
        ] it is proposed to use hybrid methods for
generating test data. In [9], an approach is used that combines
strategies of Random Strategy, Dynamic Symbolic Execution
and Search-Based Strategies. The article [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ] proposes a
theoretical description of the search method using the genetic
algorithm. The approaches to search for local and global
extrema on real programs are considered. A hybrid approach
for generating test data is proposed - a Memetic Algorithm.
      </p>
      <p>
        The approach in [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ] uses a hybrid intelligent search
algorithm to generate test data. Proposed approach center on
the methods of Branches and Borders and the Hill Climbing
to improve intellectual search.
      </p>
      <p>
        There are also studies using machine learning, for
example, in [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ]. It proposes a method using a neural network
and user-customizable clustering of input data for sequential
learning.
      </p>
      <p>
        Novelty Search can also be used to generate test data. In
the article [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ] it is proposed to use this approach to evaluate
large spaces of input data and is compared with approaches
based on the genetic algorithm.
      </p>
      <p>
        The possibilities of generating test data for testing web
services are also being investigated, for example, in the
WDSL specification [
        <xref ref-type="bibr" rid="ref14">14</xref>
        ].
      </p>
      <p>
        For the convenience of generating test data, UML
diagrams are also used [
        <xref ref-type="bibr" rid="ref15 ref16">15, 16</xref>
        ]. The articles suggest using
genetic algorithms to generate triggers for UML diagrams
that will allow to find a critical path in the program. The
article [
        <xref ref-type="bibr" rid="ref1 ref17">17</xref>
        ] proposes an improved method based on a genetic
algorithm for selecting test data for many parallel paths in
UML diagrams.
      </p>
      <p>
        In addition to UML diagrams, the program can be
described as a Classification-Tree Method developed by
Grochtmann and Grimm [
        <xref ref-type="bibr" rid="ref18">18</xref>
        ]. In [
        <xref ref-type="bibr" rid="ref19">19</xref>
        ] the problem of
constructing trees is considered and an integrated
classification tree algorithm is proposed, and in [
        <xref ref-type="bibr" rid="ref20">20</xref>
        ] was
investigated the developed ADDICT prototype (short for
AutomateD test Data generation using the Integrated
Classification-Tree methodology) for an integrated approach.
      </p>
      <p>This article proposes a comparison of different methods
for evaluating code complexity for generating test data. The
article is structured as follows. Section 2 introduces
terminology and provides basic information on the genetic
algorithm. The third section sets the problem to be solved and
introduces one of the methods for assessing code complexity.
Section 4 proposes the results of the operation of the input
data generation method using the introduced code estimation
method. In section 5 there is comparing of different code
evaluation methods.</p>
    </sec>
    <sec id="sec-2">
      <title>II. GENETIC ALGORITHM</title>
      <p>Formally, the genetic algorithm is not an optimization
method, at least in the understanding of classical optimization
methods. Its purpose is not to find the optimal and best
solution, but to find close enough to it. Therefore, this
algorithm is not recommended to be used if fast and
welldeveloped optimization methods already exist. But at the
same time, the genetic algorithm perfectly shows itself in
solving non-standardized tasks, tasks with incomplete data or
for which it is impossible to use optimization methods
because of the complexity of implementation or the duration
of execution [21, 22].</p>
      <p>A genetic algorithm is considered to be completed if a
certain number of iterations is passed (it is desirable to limit
the number of iterations, since the genetic algorithm works on
the basis of trial and error, which is a rather lengthy process),
or if a satisfactory value of the fitness function was obtained.
As usual a genetic algorithm solves the problem of
maximizing or minimizing and the adequacy of each solution
(chromosome) is evaluated using the fitness function.</p>
      <p>The genetic algorithm works according to the following
principle:</p>
      <p>Initialization. A fitness function is introduced. An initial
population is being formed. In classical theory, the initial
population is formed by randomly filling each gene in the
chromosomes. But to increase the rate of convergence of the
solution, the initial population can be specified in a certain
way, or random values can be analyzed in advance to exclude
definitely inappropriate ones.</p>
      <p>Population assessment. Each of the chromosomes is
evaluated by a fitness function. Based on the given
requirements, chromosomes get the exact value of how well
they correspond to the problem being solved.</p>
      <p>Selection. After each of the chromosomes has its own
fitness value, the best chromosomes are selected.
Selection can be done by different methods, for
example, from the sorted in order first n chromosomes
are selected, or only the most suitable, but not less
than n, etc.</p>
      <p>
        Crossing. [
        <xref ref-type="bibr" rid="ref23">23</xref>
        ]. The first is a significant difference
from standard optimization methods. After selection of
chromosomes suitable for solving the problem, they
crossing. Random chromosomes from all the "chosen
ones" randomly generate new chromosomes. Crossing
occurs on the basis of the choice of a certain position
in two chromosomes and the replacement of parts of
each other. After the required number of chromosomes
is generated to create a population, the algorithm
proceeds to the next step.
      </p>
      <p>Mutation. [24]. Also the step specific to GA. In a
random order, a random gene can change values to a
random one. The main point in a mutation is the same
as in biology - to bring genetic diversity into a
population. The main goal of mutations is to obtain
solutions that could not be obtained with existing
genes. This will allow, firstly, to avoid falling into
local extremes, since a mutation can allow the
algorithm to be transferred to a completely different
branch, and secondly, to “dilute” the population in
order to avoid a situation where in the whole
population there will be only identical chromosomes
that will not generally move towards a solution.</p>
      <p>After all the steps have been passed on, it is defined
whether the population has reached the desired accuracy of
the decisions or has come to limit the number of populations,
and if so, the algorithm stops working. Otherwise, the cycle
with the new population is repeated until the conditions are
achieved.</p>
    </sec>
    <sec id="sec-3">
      <title>III. PROBLEM DESCRIPTION</title>
      <p>The use of genetic algorithms in the testing process allows
to find the most complex parts of the program in which the
risks due to errors are greatest. Evaluation occurs due to the
use of the fitness function, the parameters of which are the
weights of each passable operation. Definition of weights, i.e.
the complexity of the program code, occurs due to various
metrics used depending on the requirements for the input sets.</p>
      <p>The task of generating input test data consists of three
subtasks:
1. Search for input data for passing along one of the most
complex code paths. Difficulty is determined by the
chosen metric for code evaluation;
2. The exclusion or reduction of the weights of
operations on the path for which the data were
selected, based on the fitness function for other paths;</p>
      <p>Generation of input test data for many paths of
program code.
always maximum (random values were limited to 100), the
second value is less than the first, but more than the third.</p>
      <p>The limit on the number of sets of input data is
established after the development stage and will allow to
concentrate on certain paths.</p>
      <p>The whole algorithm is performed cyclically - the
procedure for searching for input data for one path is started,
after which operations in this path are excluded from further
calculations and the data search for one path is started again.</p>
      <p>As one of the ways to determine the complexity of the
code, an method is proposed that works as follows:




</p>
      <p>The first operation is assigned a weight of, for
example, 100 units.</p>
      <p>Each subsequent operation is also assigned a weight
if there are no conditions or cycles, the weight is taken
in accordance with the previous operation.</p>
      <p>Conditions share the weight in accordance with the
rule - if the condition contains only one branch (only if
...), then the weight of each operation is reduced by
80%. If the condition is divided into several branches
(if ... else ...), then the weight is divided into equal
parts - for two branches 50% / 50%, for three 33% /
33% / 33%, etc.</p>
      <p>The weights of operations in the cycle remain, but can
also be multiplied by certain weights, if necessary.
All nested restrictions are summed, for example, for
two nested conditions the weight of operations will be
80% * 80% = 64%</p>
      <p>Assigned weights can be used to develop test cases using
genetic algorithms, that is, to assess how much calculated
weight assigned on one or another branch for certain values
of input parameters.</p>
      <p>For convenience, we introduce the following notation:</p>
    </sec>
    <sec id="sec-4">
      <title>X - data sets;</title>
      <p>F (X) is the value of the fitness function for each data set
depending on the calculated values of the weights.</p>
      <p>The challenge is to maximize the objective function, i.e. F
(X) → max</p>
    </sec>
    <sec id="sec-5">
      <title>IV. THE RESULTS OF THE METHOD</title>
      <p>In accordance with the previously proposed option for
assessing the complexity of program code, this method is
being finalized to better meet real requirements. Weights are
considered in accordance with the operability of the program,
in other words, the more iterations the program performs, the
more weight the initial test version will have.</p>
      <p>The first population is formed by random values. Each
population contains 100 chromosomes. The total number of
the population is also 100. Due to this, a sufficient number of
different options will be formed and the best ones will be
selected. Table 1 presents the test results.</p>
      <p>In each of the tests, at least two different versions of the
data were generated, in which the considered program code
will work the most times, which means that it will go the
greatest number of times in different ways. In addition, you
can see certain patterns in the results - the first value is
Population
0
20
50
Result
(100)</p>
      <p>For the researching, several tests of the algorithm with
four different metrics were carried out - a modified metric,
the logic of which was described in Section 3, SLOC metrics
for evaluating the number of lines of code, ABC metrics and
Jilb metrics.</p>
      <p>The metric SLOC (abbr. Source Lines of Code) is
determined by the number of lines of code. This metric takes
into account only the total number of lines of code in the
program, which makes it the easiest to understand. In this
case, the number of lines refers to the number of commands,
and not the physical number of lines.</p>
      <p>The ABC metric, or Fitzpatrick metric, is a metric that is
determined based on three different indicators ABC = &lt;na, nb,
nc&gt;. The first indicator na (Assignment) is allocated for lines
of code that are responsible for assigning variables a certain
value, for example, int number = 1. The indicator nb (Branch)
is responsible for using functions or procedures, that is,
operands that work out of sight of the current program code.
The indicator nc (Condition) calculates the number of logical
operands, such as conditions and loops. The metric value is
calculated as the square root of the sum of the squared values
of na, nb and nc.</p>
      <p>F = √n 2 + n 2 + n 2 (1)</p>
      <p>It is noteworthy that one line of code can be taken into
account in different parameters, for example, when assigning
a variable the value of a certain function (double number =
Math.Pow (2, 3) is assigned both in na and nb). The
disadvantages of this metric include the possible return of a
zero value in some parts of the code.</p>
      <p>The Jilb metric is aimed to determine the complexity of
program code depending on its saturation with conditional
operands. This metric is useful for determining the
complexity of program code, both for writing and for
understanding it:</p>
      <p>F =  / , (2)
where cl – the number of conditional operands, n – the total
number of lines of code.</p>
      <p>For testing, code is used with many different paths, where
one is critical which has the largest number of operations. The
selection of input data for this path will be a solution to the
subtask and from this data it will be possible to determine
how accurately the data is selected. The critical path will be
reached if the 1st and 3rd values from the selected data are
greater than 50 and 1 value is less than 3.</p>
      <p>The following genetic algorithm settings are used to
generate input test data:
 Number of generations – 100
 Number of populations in one generation – 100
Range of received data values – (0, 100)
A. Results using the metric proposed in the article</p>
      <p>An algorithm with this metric selects data with a priority
of operations of a higher level. As a result (99th generation),
two data sets were obtained - (70, 9, 78) and (75, 67, 82).
Both sets go along the longest code path, which is the
solution to the subtask. Table 2 presents the first 10 options in
each of the generations.</p>
      <p>0
(70, 9, 78) = 164</p>
      <p>100
(75, 67, 82) =</p>
      <p>164 100
(61, 29, 94) =</p>
      <p>164 100
(63, 52, 87) =</p>
      <p>164 100
(63, 49, 83) =</p>
      <p>164 100
(5, 68, 90) =</p>
      <p>96 382
(60, 37, 3) =</p>
      <p>32 500
(12, 80, 49) = 16</p>
      <p>000
(47, 12, 17) = 16</p>
      <p>000
(53, 35, 76) = 16</p>
      <p>000</p>
      <p>Can be seeing that the algorithm works quite efficiently
and already in the first generation the data was selected for
the critical path.</p>
      <sec id="sec-5-1">
        <title>B. SLOC metric</title>
        <p>This metric is the simplest from the point of view of
implementation, it takes into account only the total number of
lines of code. The results are presented in table 3. The
algorithm with this metric picked up 3 sets - (63, 72, 91), (68,
50, 94) and (80, 70, 88). All three satisfy the conditions for
passing along the critical path.</p>
        <p>As with the previous metric, the algorithm in the first
generation picked up suitable data.</p>
      </sec>
      <sec id="sec-5-2">
        <title>C. ABC metric</title>
        <p>This metric takes into account more variations of the
values, such as assigning values to variables, logical checks
and function calls. The algorithm with the ABC metric picked
up 2 options for the input data that pass along the critical path
- (69, 46, 78) and (77, 36, 98). The remaining results are
presented in table 4.</p>
        <p>Unlike previous metrics, this one takes into account the
absolute complexity of the program, which is calculated by
dividing the number of cycles and conditions by the total
number of operations on the way. The complexity of the
program is determined in a completely different way, which
led to the fact that the input data was selected for a different
path. The results are presented in table 5.</p>
        <p>The data obtained are very different both with other
metrics and within the metric. This is due to the features of
the tested code - it has one common loop, within which there
is one common condition. If this condition is not met, then
none of the operations, except the cycle and conditions, will
be taken into account when calculating the metric. A value of
100 indicates that among all operations on the path, all are
cycles or conditions, i.e. formally selected input data are
options when the first condition was not met and other
operations were not taken into account.</p>
      </sec>
    </sec>
    <sec id="sec-6">
      <title>VI. CONCLUSION</title>
      <p>Evolutionary methods work in such a way as to find the
best solutions to problems that are impossible or too costly to
solve with standard optimization methods. They do not
always work quickly or efficiently, but in problems with
nonstandard approaches it shows superiority.</p>
      <p>The introduction of various metrics for calculating the
fitness function made it possible to add a method for
generating input test data of greater variability and the ability
to introduce new data requirements. Each metric is focused
on specific code parameters and can be used when data must
be selected in accordance with certain requirements. In
addition, in the case when the metric does not select data
efficiently, it is possible to use other metrics that can overlap
each other’s shortcomings.</p>
      <p>All analyzed metrics, with the exception of the Jilb
metric, generated several data sets for the critical path that
was originally selected. It is noticeable that metrics for a
small code of 130 lines with several code paths successfully
select data in the first generation, which indicates a rather
high convergence rate of the algorithm. In subsequent
generations, various options are sequentially eliminated.</p>
      <p>The conducted studies allow to propose a new method for
generating test data based on the genetic algorithm, in which
the fitness function will be formed not on the basis of one of
the known metrics for assessing code complexity (as in this
paper), but on the basis of a hybrid metric, which is a
weighted sum of the indicators present in metrics considered
in this paper. It also seems promising in terms of increasing
the degree of code coverage by creating an effective
mechanism for regulating (increasing and decreasing) the
weights of operations in the fitness function while increasing
the nesting level of the code section.</p>
      <p>In the future, it is planned to expand ways to determine
the complexity of the code. In addition to using metrics
directly, it is planned to develop a method for taking into
account indicators of the number of operations, functions,
conditions and cycles with different weights. It is also
possible to establish the degree of reduction or increase in the
weights of operations at different levels of nesting. This will
allow you to set the priority for input generation when certain
requirements arise.</p>
    </sec>
    <sec id="sec-7">
      <title>ACKNOWLEDGMENT</title>
      <p>The reported study was funded by RFBR, project number
19-37-90156. The research is supported by Ministry of
Science and Higher Education of Russian Federation (project
No. FSUN-2020-0009)
[1]
[2]
[3]
[4]
[5]
[6]
[7]
[8]
[9]
[21] K.Serdyukov and T. Avdeenko, “Investigation of the genetic
algorithm possibilities for retrieving relevant cases from big data in</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          17, no.
          <issue>9</issue>
          , pp.
          <fpage>900</fpage>
          -
          <lpage>910</lpage>
          ,
          <year>1991</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          <string-name>
            <given-names>P.</given-names>
            <surname>Maragathavalli</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Anusha</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P.</given-names>
            <surname>Geethamalini</surname>
          </string-name>
          and
          <string-name>
            <given-names>S.</given-names>
            <surname>Priyadharsini</surname>
          </string-name>
          , “
          <article-title>Automatic Test-Data Generation for Modified Condition. Decision Coverage Using Genetic Algorithm,”</article-title>
          <source>International Journal of Engineering Science and Technology</source>
          , vol.
          <volume>3</volume>
          , no.
          <issue>2</issue>
          , pp.
          <fpage>1311</fpage>
          -
          <lpage>1318</lpage>
          ,
          <year>2011</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          <string-name>
            <given-names>C.</given-names>
            <surname>Meudec</surname>
          </string-name>
          , “
          <article-title>ATGen: Automatic Test Data Generation using Constraint Logic Programming</article-title>
          and Symbolic Execution,”
          <source>Software Testing Verification and Reliability</source>
          ,
          <year>2001</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          <string-name>
            <given-names>R.</given-names>
            <surname>Gerlich</surname>
          </string-name>
          , “
          <article-title>Automatic Test Data Generation and Model Checking with CHR</article-title>
          ,
          <source>” 11th Workshop on Constraint Handling Rules</source>
          ,
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          <string-name>
            <surname>M.R. Girgis</surname>
          </string-name>
          , “
          <article-title>Automatic Test Data Generation for Data Flow Testing Using a Genetic Algorithm,”</article-title>
          <source>Journal of Universal Computer Science</source>
          , vol.
          <volume>11</volume>
          , no.
          <issue>6</issue>
          , pp.
          <fpage>898</fpage>
          -
          <lpage>915</lpage>
          ,
          <year>2005</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          <string-name>
            <given-names>E.J.</given-names>
            <surname>Weyuker</surname>
          </string-name>
          , “
          <article-title>The complexity of data flow criteria for test data selection,” Inf</article-title>
          . Process. Lett., vol.
          <volume>19</volume>
          , no.
          <issue>2</issue>
          , pp.
          <fpage>103</fpage>
          -
          <lpage>109</lpage>
          ,
          <year>1984</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          <string-name>
            <given-names>A.</given-names>
            <surname>Khamis</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Bahgat</surname>
          </string-name>
          and
          <string-name>
            <given-names>R.</given-names>
            <surname>Abdelazi</surname>
          </string-name>
          , “
          <article-title>Automatic test data generation using data flow information</article-title>
          ,” Dogus University Journal, vol.
          <volume>2</volume>
          , pp.
          <fpage>140</fpage>
          -
          <lpage>153</lpage>
          ,
          <year>2011</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          <string-name>
            <given-names>S.</given-names>
            <surname>Singla</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Kumar</surname>
          </string-name>
          ,
          <string-name>
            <given-names>H. M.</given-names>
            <surname>Rai</surname>
          </string-name>
          and
          <string-name>
            <given-names>P.</given-names>
            <surname>Singla</surname>
          </string-name>
          , “
          <article-title>A hybrid pso approach to automate test data generation for data flow coverage with dominance concepts</article-title>
          ,
          <source>” Journal of Advanced Science and Technology</source>
          , vol.
          <volume>37</volume>
          , pp.
          <fpage>15</fpage>
          -
          <lpage>26</lpage>
          ,
          <year>2011</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          <string-name>
            <given-names>Z.</given-names>
            <surname>Liu</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Z.</given-names>
            <surname>Chen</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Fang</surname>
          </string-name>
          and
          <string-name>
            <given-names>Q.</given-names>
            <surname>Shi</surname>
          </string-name>
          , “
          <article-title>Hybrid Test Data Generation,” State Key Laboratory for Novel Software Technology</article-title>
          ,
          <source>ICSE Companion Proceedings of the 36th International Conference on Software Engineering</source>
          , pp.
          <fpage>630</fpage>
          -
          <lpage>631</lpage>
          ,
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <given-names>M.</given-names>
            <surname>Harman</surname>
          </string-name>
          and
          <string-name>
            <given-names>P.</given-names>
            <surname>McMinn</surname>
          </string-name>
          , “
          <article-title>Theoretical and Empirical Study of Search-Based Testing: Local, Global,</article-title>
          and Hybrid Search,
          <source>” IEEE Transactions on Software Engineering</source>
          , vol.
          <volume>36</volume>
          , no.
          <issue>2</issue>
          , pp.
          <fpage>226</fpage>
          -
          <lpage>247</lpage>
          ,
          <year>2010</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <given-names>Y.</given-names>
            <surname>Xing</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Y.</given-names>
            <surname>Gong</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Y.</given-names>
            <surname>Wang</surname>
          </string-name>
          and
          <string-name>
            <given-names>X.</given-names>
            <surname>Zhang</surname>
          </string-name>
          , “
          <article-title>Hybrid Intelligent Search Algorithm for Automatic Test Data Generation</article-title>
          ,” Mathematical Problems in Engineering,
          <year>2015</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [12]
          <string-name>
            <given-names>C.</given-names>
            <surname>Paduraru</surname>
          </string-name>
          , and
          <string-name>
            <given-names>M.C.</given-names>
            <surname>Melemciuc</surname>
          </string-name>
          , “
          <article-title>An Automatic Test Data Generation Tool using Machine Learning</article-title>
          ,
          <source>” 13th International Conference on Software Technologies (ICSOFT)</source>
          , pp.
          <fpage>472</fpage>
          -
          <lpage>481</lpage>
          ,
          <year>2018</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          [13]
          <string-name>
            <given-names>M.</given-names>
            <surname>Boussaa</surname>
          </string-name>
          ,
          <string-name>
            <given-names>O.</given-names>
            <surname>Barais</surname>
          </string-name>
          ,
          <string-name>
            <given-names>G.</given-names>
            <surname>Sunyé</surname>
          </string-name>
          and
          <string-name>
            <given-names>B.</given-names>
            <surname>Baudry</surname>
          </string-name>
          , “
          <article-title>Novelty Search Approach for Automatic Test Data Generation,”</article-title>
          <source>8th International Workshop on Search-Based Software Testing</source>
          ,
          <year>2015</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          [14]
          <string-name>
            <given-names>M.</given-names>
            <surname>Lopez</surname>
          </string-name>
          ,
          <string-name>
            <given-names>H.</given-names>
            <surname>Ferreiro</surname>
          </string-name>
          and
          <string-name>
            <given-names>L.M.</given-names>
            <surname>Castro</surname>
          </string-name>
          , “
          <source>DSL for Web Services Automatic Test Data Generation,” 25th International Symposium on Implementation and Application of Functional Languages</source>
          ,
          <year>2013</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          [15]
          <string-name>
            <given-names>C.</given-names>
            <surname>Doungsa-ard</surname>
          </string-name>
          ,
          <string-name>
            <given-names>K.</given-names>
            <surname>Dahal</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.G.</given-names>
            <surname>Hossain</surname>
          </string-name>
          and
          <string-name>
            <given-names>T.</given-names>
            <surname>Suwannasart</surname>
          </string-name>
          , “
          <article-title>An automatic test data generation from UML state diagram using genetic algorithm,”</article-title>
          IEEE Computer Society Press, pp.
          <fpage>47</fpage>
          -
          <lpage>52</lpage>
          ,
          <year>2007</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          [16]
          <string-name>
            <given-names>S.</given-names>
            <surname>Sabharwal</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Sibal</surname>
          </string-name>
          and
          <string-name>
            <given-names>C.</given-names>
            <surname>Sharma</surname>
          </string-name>
          , “
          <article-title>Applying Genetic Algorithm for Prioritization of Test Case Scenarios Derived from UML Diagrams,”</article-title>
          <source>IJCSI International Journal of Computer Science Issues</source>
          , vol.
          <volume>8</volume>
          , no.
          <issue>3-2</issue>
          ,
          <year>2011</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          [17]
          <string-name>
            <given-names>C.</given-names>
            <surname>Doungsa-ard</surname>
          </string-name>
          ,
          <string-name>
            <given-names>K.</given-names>
            <surname>Dahal</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Hossain</surname>
          </string-name>
          and
          <string-name>
            <given-names>T.</given-names>
            <surname>Suwannasart</surname>
          </string-name>
          , “
          <article-title>GAbased Automatic Test Data Generation for UML State Diagrams with Parallel Paths,” Part of book Advanced design and manufacture to gain a competitive edge: New manufacturing techniques and their role in improving enterprise performance</article-title>
          , pp.
          <fpage>147</fpage>
          -
          <lpage>156</lpage>
          ,
          <year>2008</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref18">
        <mixed-citation>
          [18]
          <string-name>
            <given-names>M.</given-names>
            <surname>Grochtmann</surname>
          </string-name>
          and
          <string-name>
            <surname>K.</surname>
          </string-name>
          “Grimm, “
          <article-title>Classification trees for partition testing</article-title>
          .
          <source>Software Testing,” Verification and Reliability</source>
          , vol.
          <volume>3</volume>
          , no.
          <issue>2</issue>
          , pp.
          <fpage>63</fpage>
          -
          <lpage>82</lpage>
          ,
          <year>1993</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref19">
        <mixed-citation>
          [19]
          <string-name>
            <given-names>T.Y.</given-names>
            <surname>Chen</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P.L.</given-names>
            <surname>Poon</surname>
          </string-name>
          and
          <string-name>
            <given-names>T.H.</given-names>
            <surname>Tse</surname>
          </string-name>
          , “
          <article-title>An integrated classification-tree methodology for test case generation,”</article-title>
          <source>International Journal of Software Engineering and Knowledge Engineering</source>
          , vol.
          <volume>10</volume>
          , no.
          <issue>6</issue>
          , pp.
          <fpage>647</fpage>
          -
          <lpage>679</lpage>
          ,
          <year>2000</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref20">
        <mixed-citation>
          [20]
          <string-name>
            <given-names>A.</given-names>
            <surname>Cain</surname>
          </string-name>
          ,
          <string-name>
            <given-names>T.Y.</given-names>
            <surname>Chen</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Grant</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P.L.</given-names>
            <surname>Poon</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.F.</given-names>
            <surname>Tang</surname>
          </string-name>
          and
          <string-name>
            <given-names>T.H.</given-names>
            <surname>Tse</surname>
          </string-name>
          , “
          <article-title>An Automatic Test Data Generation System Based on the Integrated Classification-Tree Methodology,”</article-title>
          <source>Software Engineering Research and Applications, Lecture Notes in Computer Science</source>
          , vol.
          <volume>3026</volume>
          ,
          <year>2004</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref21">
        <mixed-citation>
          <year>1903</year>
          , pp.
          <fpage>36</fpage>
          -
          <lpage>41</lpage>
          ,
          <year>2017</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref22">
        <mixed-citation>
          <string-name>
            <given-names>R.S.</given-names>
            <surname>Praveen</surname>
          </string-name>
          and
          <string-name>
            <surname>K.</surname>
          </string-name>
          <article-title>Tai-hoon, “Application of Genetic Algorithm in Software Testing</article-title>
          ,”
          <source>International Journal of Software Engineering and Its Applications</source>
          , vol.
          <volume>3</volume>
          , no.
          <issue>4</issue>
          , pp.
          <fpage>87</fpage>
          -
          <lpage>96</lpage>
          ,
          <year>2009</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref23">
        <mixed-citation>
          [23]
          <string-name>
            <given-names>W.M.</given-names>
            <surname>Spears</surname>
          </string-name>
          , “
          <article-title>Crossover or mutation?” Foundations of Genetic Algorithms</article-title>
          , vol.
          <volume>2</volume>
          , pp.
          <fpage>221</fpage>
          -
          <lpage>237</lpage>
          ,
          <year>1993</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref24">
        <mixed-citation>
          <string-name>
            <given-names>H.</given-names>
            <surname>Mühlenbein</surname>
          </string-name>
          , “
          <article-title>How genetic algorithms really work: Mutation and hillclimbing,” Parallel Problem Solving from Nature</article-title>
          , vol.
          <volume>2</volume>
          ,
          <year>1992</year>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>