<!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>
      <journal-title-group>
        <journal-title>Proceedings of the SQAMIA</journal-title>
      </journal-title-group>
      <issn pub-type="ppub">1613-0073</issn>
    </journal-meta>
    <article-meta>
      <title-group>
        <article-title>Reducing Combinatorial Testing Requirements Based on Equivalences with Respect to the Code Under Test</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>SARFRAZ KHURSHID</string-name>
        </contrib>
        <contrib contrib-type="author">
          <string-name>The University of Texas at Austin DARKO MARINOV</string-name>
          <email>marinov@illinois.edug</email>
        </contrib>
        <contrib contrib-type="author">
          <string-name>University of Illinois at Urbana-Champaign</string-name>
        </contrib>
      </contrib-group>
      <pub-date>
        <year>2018</year>
      </pub-date>
      <volume>7</volume>
      <fpage>27</fpage>
      <lpage>30</lpage>
      <abstract>
        <p>Combinatorial testing, where di erent combinations of parameter values are used to create test inputs, is a well-known approach for black-box testing of software systems. Researchers have de ned several coverage criteria for combinatorial testing. Among them, the most comprehensive criterion is all combinations coverage. While using this criterion gives the most assurance in the correctness of the code under test, this criterion can have too many test requirements, which can make it impractical to apply. This paper introduces a new, simple approach that provides the same assurance as all combinations coverage but typically with fewer test inputs, thereby reducing the overall cost of combinatorial testing. Our key insight is that one test input execution can cover several test requirements for combinatorial coverage criteria. Our approach builds on the Korat test-generation technique to explore which combinations of parameter values are equivalent with respect to the code under test. An illustration on a pedagogical example shows how this approach can lead to substantial reduction in the number of tests.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>1. INTRODUCTION</title>
      <p>Combinatorial testing (also known as “N-wise testing” or “combinatorial interaction testing”) is a
wellstudied approach for black-box testing of software systems [Grindal et al. 2005; Ammann and Offutt
2008; Nie and Leung 2011]. For example, two surveys of combinatorial testing [Grindal et al. 2005; Nie
and Leung 2011] cover dozens of techniques and are themselves cited over 430 times each (according to
Google Scholar on July 15, 2018). Combinatorial testing requires the user to provide domains of values
for each parameter input of the software system under test, and then creates test inputs by different
combinations of parameter values.</p>
      <p>Researchers have defined several coverage criteria for combinatorial testing. The criteria range from
the weakest base-choice, to stronger and widely used pairwise criterion (also known as “all-pairs
criterion”), to even stronger N-wise (for N &gt; 2), up to the most comprehensive criterion all combinations
coverage. As the criterion name implies, all combinations coverage requires the entire cross-product of
all parameter values from the input space to be used for testing. While using this criterion gives the
most assurance in the correctness of the code under test, this criterion can have too many test
requirements, which can make it impractical to apply. For example, if there are p parameters, each with only
2 values, then the total number of combinations is 2p.</p>
      <p>This paper introduces a novel, simple approach that provides the same assurance as all combinations
coverage but typically with fewer test inputs, thereby reducing the overall cost of combinatorial testing.
8:2
Our key insight is that execution of one test input can cover several test requirements for combinatorial
coverage criteria. In other words, multiple test requirements that are non-equivalent at the black-box
level (which does not consider the code under test but only its specification) may be equivalent at the
white-box level (which does consider the code under test). The key challenge is to determine which
combinations of given input parameter values have equivalent behavior for the given code under test.</p>
      <p>
        To address this challenge, the approach presented in this paper builds on the Korat test
generation [Boyapati et al. 2002]. Korat is a technique for generating structurally complex test inputs. Given
a predicate (i.e., a function that takes one input and returns a Boolean value) and a finitization (i.e., a
specification that bounds the size of some input components or provides concrete values for other input
components), Korat can generate all (non-isomorphic) inputs that satisfy the given predicate (i.e., for
which the predicate returns “true”) within the input space defined by the finitizations. For example,
Korat can be used to generate all red-black trees up to a given maximum size by providing a predicate
that checks whether an input graph is a red-black tree and a finitization that bounds the number of
nodes and provides values for the node color (red or black). Korat has been used to test various kinds
of software
        <xref ref-type="bibr" rid="ref15 ref16">(e.g., detecting 59 previously unknown bugs in products of eBay and Yahoo! [Zhong et al.
2016a; 2016b])</xref>
        , but was not applied to reduce the number of tests created by combinatorial testing.
      </p>
      <p>In this paper, we demonstrate how Korat can be applied to explore which combinations of parameter
values in combinatorial testing are equivalent with respect to the code under test. Before we
summarize our new approach, we first briefly describe how Korat operates. Korat searches through the (finite)
input space defined by the finitization. Korat instruments the predicate to monitor accesses that the
predicate makes to parts of the input. Korat then runs the predicate for some inputs and uses the
information from monitoring to prune large parts of the search space. As a result, Korat can effectively
explore very large state spaces, generating all inputs that satisfy the predicate but without explicitly
enumerating all elements of the input space.</p>
      <p>To apply Korat to combinatorial testing of a piece of code, namely a function with multiple
parameters, requires (1) turning the function into a predicate that conceptually takes one complex input
(e.g., one object whose fields represent the parameters of the original function), invokes the function
by passing the actual function arguments (from the input object’s field values), and returns “true”; and
(2) using the domains for parameter values provided for the original function as the finitization for
Korat. With such changes, we can run Korat on the newly constructed predicate and map the search
information from Korat back to the original combinations to determine which combinations result in
the same output of the original function.</p>
      <p>We illustrate the newly proposed approach on a pedagogical example of the triangle classification
function [Ammann and Offutt 2008]. This function is widely used to introduce basic concepts of
software testing. The function takes as input three integers that are supposed to represent the lengths of
the triangle sides, and returns as output the type of triangle (e.g., “equilateral” if all sides are the same
non-negative number, or “invalid” if the lengths do not represent a valid triangle). A widely used
textbook on introduction to software testing [Ammann and Offutt 2008] shows how combinatorial testing
can be applied on this function by using values -1, 0, 1, and 2 for the parameters and exploring various
combinations, up to all 43 = 64 combinations.</p>
      <p>
        We show how using our new approach can lead to a substantial reduction in the number of
combinations without losing any exhaustiveness and guarantees provided by all combinations. In other words,
our approach determines which combinations are definitely equivalent for the given code and does not
just randomly or systematically sample some subset of the combinations. In this particular example,
our approach finds that only 22 combinations are non-equivalent (while the remaining 42 are
equivalent). We also compare our approach, based on concrete exploration done by Korat, with the approach
based on symbolic execution, a traditional approach to test generation [King 1976; C
        <xref ref-type="bibr" rid="ref4">larke 1976</xref>
        ] that
is subject of many active research investigations. While symbolic execution, as expected, finds even
more equivalent paths than our Korat-based approach, note that symbolic execution comes at a great
runtime cost, unlike our Korat-based approach.
      </p>
      <p>The main contribution of this paper is to demonstrate how to reduce the number of combinations for
all combinations coverage using the approach of Korat’s pruning. We believe our work lays the
foundation for a new approach to reducing the cost of combinatorial testing, not just for all combinations
coverage, but also for other weaker but widely used criteria, such as pair-wise coverage.
2.</p>
    </sec>
    <sec id="sec-2">
      <title>OVERVIEW</title>
      <p>
        This section uses an illustrative example to give an overview of our approach and compare its results
with two previous approaches: traditional combinatorial testing with all combinations coverage, which
is a black-box approach, and symbo
        <xref ref-type="bibr" rid="ref4">lic execution [King 1976</xref>
        ; C
        <xref ref-type="bibr" rid="ref4">larke 1976</xref>
        ], which is a white-box
approach. We use the well-known triangle classification problem as our illustrative example, which has
been widely studied in the software testing literature. Specifically, we use the Java implementation
written by Jeff Offutt [Ammann and Offutt 2008], with the following method being the main triangle
classification routine:
private static int Triang (int Side1, int Side2, int Side3)
{
int tri_out;
// tri_out is output from the routine:
// Triang = 1 if triangle is scalene
// Triang = 2 if triangle is isosceles
// Triang = 3 if triangle is equilateral
// Triang = 4 if not a triangle
// After a quick confirmation that it's a legal
// triangle, detect any sides of equal length
if (Side1 &lt;= 0 || Side2 &lt;= 0 || Side3 &lt;= 0)
{
tri_out = 4;
return (tri_out);
}
}
tri_out = 0;
if (Side1 == Side2)
      </p>
      <p>tri_out = tri_out + 1;
if (Side1 == Side3)</p>
      <p>tri_out = tri_out + 2;
if (Side2 == Side3)</p>
      <p>tri_out = tri_out + 3;
if (tri_out == 0)
{ // Confirm it's a legal triangle before declaring
// it to be scalene
if (Side1+Side2 &lt;= Side3 || Side2+Side3 &lt;= Side1 ||</p>
      <p>Side1+Side3 &lt;= Side2)
tri_out = 4;
else</p>
      <p>tri_out = 1;
return (tri_out);
/* Confirm it's a legal triangle before declaring */
/* it to be isosceles or equilateral */
if (tri_out &gt; 3)</p>
      <p>tri_out = 3;
else if (tri_out == 1 &amp;&amp; Side1+Side2 &gt; Side3)</p>
      <p>tri_out = 2;
else if (tri_out == 2 &amp;&amp; Side1+Side3 &gt; Side2)</p>
      <p>tri_out = 2;
else if (tri_out == 3 &amp;&amp; Side2+Side3 &gt; Side1)</p>
      <p>tri_out = 2;
else</p>
      <p>tri_out = 4;
return (tri_out);
} // end Triang</p>
      <p>The method Triang takes three integer inputs—Side1, Side2, and Side3—and returns an integer
result. Each input represents a length, and the method determines whether the three lengths can form
a valid triangle and if so, what kind of triangle it is. Specifically the method returns:
—1 if the triangle is scalene, i.e., all 3 sides have different lengths;
—2 if the triangle is isosceles, i.e., exactly 2 sides of have the same length;
—3 if the triangle is equilateral, i.e., all 3 sides have the same length; and
—4 if the three input lengths cannot be the lengths of sides of a valid triangle.</p>
    </sec>
    <sec id="sec-3">
      <title>2.1 Traditional all combinations coverage</title>
      <p>We first apply the traditional all combinations coverage criteria to define the test requirements for
Triang. Following the standard black-box testing methodology, for each input parameter, we first
partition the domain of all possible values for the parameter into a finite number of blocks and choose one
representative value from each block [Ammann and Offutt 2008]. Consider the following 4 blocks to
partition the domain of all integers based: b1: “&lt; 0”, b2: “== 0”, b3: “== 1”, b4: “&gt; 1”. Block b1 contains
all integers that are less than 0; b2 contains just one integer, i.e., 0; b3 also contains just one integer,
i.e., 1; and b4 contains all integers greater than 1. Next, we pick the following representative values for
each block: b1: -1, b2: 0, b3: 1, b4: 2. Blocks b2 and b3 each contain just 1 integer, which must be selected.
For blocks b1 and b4, we use the boundary values, i.e., -1 and 2 respectively. We use the same blocks
and representative values for each of the 3 parameters. Now we apply the all combinations coverage
(ACoC) criterion to combine the values across different blocks for different parameters. The ACoC
criterion requires all combinations of blocks (representative values) from all parameters to be covered.
For the chosen blocks, ACoC requires 4 4 4 = 64 test requirements to be covered. The following is a
partial list of test executions explored by ACoC:
1: -1, -1, -1 --&gt; 4
2: -1, -1, 0 --&gt; 4
3: -1, -1, 1 --&gt; 4
4: -1, -1, 2 --&gt; 4
5: -1, 0, -1 --&gt; 4
...
Each entry shows an id for the test execution, followed by the three parameter values, followed by the
result; --&gt; is the separator between the input values and the output.</p>
    </sec>
    <sec id="sec-4">
      <title>2.2 Our approach</title>
      <p>Observe that while each of the 64 test inputs created by traditional all combinations coverage is unique
in terms of the specific combination of input values it tries, not all test inputs exercise different
program behaviors. Consider, for example, tests 1 and 2. Both tests set parameter Side1 to value -1. When
Side1 is -1, the method Triang returns 4 without using (reading) the values of parameters Side2 and
Side3, which means that the method’s execution, when Side1 is -1, does not depend on the values of
Side2 and Side3. Therefore, tests 1 and 2 are equivalent in terms of exercising the method’s behavior.
Simply executing any one of them covers the behavior and gives the result for the other without
executing it at all. This observation forms the basis of our approach to optimize all combinations coverage.</p>
      <p>Specifically, our approach executes a test and observes which parameter values are actually used
(read) by the method under test, and based on that it creates the next test. To illustrate, for input
h 1; 1; 1i, the method only uses the first parameter’s value and therefore our approach creates the
next test which has a different value for that parameter, i.e., h0; 1; 1i. Doing so prunes from the
search all (16) combinations of the form h 1; ?; ?i. Thus the first test that our approach runs serves as
a representative for 16 unique combinations, which all exercise the same behavior and result in the
same output. In the end, our approach creates the following 22 tests for all combinations coverage:
1: -1, -1, -1 --&gt; 4
2: 0, -1, -1 --&gt; 4
3: 1, -1, -1 --&gt; 4
4: 1, 0, -1 --&gt; 4
5: 1, 1, -1 --&gt; 4
6: 1, 1, 0 --&gt; 4
7: 1, 1, 1 --&gt; 3
8: 1, 1, 2 --&gt; 4
9: 1, 2, -1 --&gt; 4
10: 1, 2, 0 --&gt; 4
11: 1, 2, 1 --&gt; 4</p>
      <p>For this example, our approach provides a 2.9X reduction in the number of test requirements while
providing the same confidence in the method’s correctness.</p>
    </sec>
    <sec id="sec-5">
      <title>2.3 Symbolic execution</title>
      <p>
        While traditional combinatorial testing is a black-box approach, our approach optimizes it by
observing what parameter values are actually used in the method’s execution, and therefore makes use of
information that exists at the white-box level. Next, we compare our approach with a purely white-box
approach, name
        <xref ref-type="bibr" rid="ref4">ly symbolic execution [King 1976</xref>
        ; C
        <xref ref-type="bibr" rid="ref4">larke 1976</xref>
        ], which is a classic program analysis
technique. In contrast with traditional execution that runs the program on concrete inputs, symbolic
execution runs it on symbolic inputs and maintains a symbolic program state, which consists of
algebraic expressions that represent values of program variables expressed in terms of the symbolic input
values. Moreover, for conditional statements in the program, symbolic execution considers each of
the two possible outcomes for condition evaluation separately. Thus, symbolic execution explores each
execution path in the program individually. Because programs with loops or recursion can have an
unbounded number of paths, symbolic execution tools often bound the length of each execution path
and backtrack when the bound is reached to guarantee that the analysis terminates. For each path
(prefix) that symbolic execution explores, it checks the path feasibility by (1) building a path condition,
i.e., a constraint on input symbols that is a necessary condition for that path to be taken by the inputs;
and (2) checking the feasibility of the path condition by using off-the-shelf decision procedures, e.g.,
satisfiability-modulo-theory (SMT) solvers such as the popular Z3 [de Moura and Bjorner 2008]. The
exploration performed by symbolic execution forms an execution tree that contains all paths explored.
8:6
      </p>
      <p>We apply symbolic execution to the Triang method to create a set of tests that give full path
coverage. Figure 1 shows the execution tree explored by symbolic execution. Symbolic execution creates 14
tests. In addition, it explores three paths that are infeasible. Because symbolic execution is a
whitebox approach, it creates fewer tests and gives higher code coverage than either our approach or the
traditional all combinations coverage. However, symbolic execution requires a much more expensive
analysis that involves building path conditions and solving them. Overall, our approach provides a
sweet spot between all combinations coverage and symbolic execution. Our approach requires
minimal analysis overhead (just monitoring parameter reads) and, as this example illustrates, can require
much fewer test executions than traditional all combinations coverage.</p>
    </sec>
    <sec id="sec-6">
      <title>3. RELATED WORK</title>
      <p>We briefly review most closely related work on combinatorial testing and Korat.</p>
      <p>
        Combinatorial testing has been widely studied in research literature [Grindal et al. 2005; Nie and
Leung 2011] and applied in practice. AETG [Cohen et al. 1997] is one of the most widely used
combinatorial testing systems. An important topic in the context of combinatorial testing is constraints among
parameters that rule out some combinations of parameter values [Cohen et al. 2007]; our approach is
orthogonal to the work on constraints as we propose how to find definitely equivalent combinations,
which can be done for the combinations allowed by the constraints. There is also work on
reconstructing models (thus implicitly constraints, albeit of a different kind) from the code under test [Bures et al.
2018]; our approach cannot apply in a pure black-box manner on the code but could apply in a
whitebox manner on the model. There have been also approaches that investigated the interplay between
combinatorial testing and symbolic execution
        <xref ref-type="bibr" rid="ref8 ref9">(e.g., [Gao et al. 2016; Grieskamp et al. 2009])</xref>
        ; however,
to the best of our knowledge, no prior approach considered Korat-like search for combinatorial testing.
      </p>
      <p>Korat has been applied for test generation of several software systems, e.g., recently detecting 59
previously unknown bugs in products of eBay and Yahoo! [Zhong et al. 2016a; 2016b]. In fact, the
comKorat work [Zhong et al. 2016a; 2016b] is closely related to this paper because comKorat uses ideas from
combinatorial testing to reduce the inputs generated by Korat in its traditional setting of
constraintbased test input generation. A more general approach is introduced in field-exhaustive testing [Ponzio
et al. 2016] where coverage criteria from combinatorial testing are integrated in constraint-based test
generation to reduce the number of tests. Conceptually, this paper takes the opposite direction from
comKorat and field-exhaustive testing: we use ideas from Korat to reduce the number of combinations
required by combinatorial testing. Similar in this spirit, some prior work used Korat-style pruning to
reduce test executions for configurable systems, including an evaluation in an industrial setting [Kim
et al. 2013]. The key difference is that the prior work focused only on setting the configuration
parameters for a specific class of systems that were constructed to be configurable, and executed existing tests,
but did not consider creating new tests from all combinations, as we do in this paper.</p>
    </sec>
    <sec id="sec-7">
      <title>4. CONCLUSIONS</title>
      <p>Combinatorial testing is widely used to generate test inputs from combinations of parameter values.
The strongest combinatorial coverage criterion is all combinations, which gives the most assurance but
often has too many test requirements, being impractical to apply. We introduced a simple approach
that provides the same guarantees as all combinations coverage but typically with fewer test inputs,
thereby reducing the overall cost of combinatorial testing. Being white-box, our approach can perform
better than pure black-box testing. We illustrated how our approach builds on the Korat test generation
to explore which combinations of parameter values are equivalent with respect to the code under test.
An illustration on the pedagogical example of the triangle classification shows how our approach can
substantially reduce the number of test inputs. We leave it for future work to evaluate our approach
on a larger scale and to further investigate improving combinatorial testing using Korat-like search.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          <string-name>
            <given-names>Paul</given-names>
            <surname>Ammann</surname>
          </string-name>
          and
          <string-name>
            <given-names>Jeff</given-names>
            <surname>Offutt</surname>
          </string-name>
          .
          <year>2008</year>
          .
          <article-title>Introduction to Software Testing (1 ed</article-title>
          .). Cambridge University Press.
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          <string-name>
            <given-names>Chandrasekhar</given-names>
            <surname>Boyapati</surname>
          </string-name>
          , Sarfraz Khurshid, and
          <string-name>
            <given-names>Darko</given-names>
            <surname>Marinov</surname>
          </string-name>
          .
          <year>2002</year>
          . Korat:
          <source>Automated Testing Based on Java Predicates. In ISSTA.</source>
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          <string-name>
            <given-names>Miroslav</given-names>
            <surname>Bures</surname>
          </string-name>
          , Karel Frajta´ k, and
          <string-name>
            <surname>Bestoun</surname>
            <given-names>S.</given-names>
          </string-name>
          <string-name>
            <surname>Ahmed</surname>
          </string-name>
          .
          <year>2018</year>
          .
          <article-title>Tapir: Automation Support of Exploratory Testing Using Model Reconstruction of the System Under Test</article-title>
          .
          <source>IEEE Trans. Reliability</source>
          <volume>67</volume>
          ,
          <issue>2</issue>
          (
          <year>2018</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          <string-name>
            <given-names>L. A.</given-names>
            <surname>Clarke</surname>
          </string-name>
          .
          <year>1976</year>
          .
          <article-title>A System to Generate Test Data and Symbolically Execute Programs</article-title>
          .
          <source>IEEE TSE 2</source>
          ,
          <issue>3</issue>
          (
          <year>1976</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          <string-name>
            <given-names>David M.</given-names>
            <surname>Cohen</surname>
          </string-name>
          ,
          <string-name>
            <surname>Siddhartha R. Dalal</surname>
          </string-name>
          , Michael L.
          <string-name>
            <surname>Fredman</surname>
          </string-name>
          , and
          <string-name>
            <surname>Gardner</surname>
            <given-names>C.</given-names>
          </string-name>
          <string-name>
            <surname>Patton</surname>
          </string-name>
          .
          <year>1997</year>
          .
          <article-title>The AETG System: An Approach to Testing Based on Combinatiorial Design</article-title>
          .
          <source>IEEE TSE 23</source>
          ,
          <issue>7</issue>
          (
          <year>1997</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          <string-name>
            <surname>Myra</surname>
            <given-names>B.</given-names>
          </string-name>
          <string-name>
            <surname>Cohen</surname>
          </string-name>
          , Matthew B.
          <string-name>
            <surname>Dwyer</surname>
            , and
            <given-names>Jiangfan</given-names>
          </string-name>
          <string-name>
            <surname>Shi</surname>
          </string-name>
          .
          <year>2007</year>
          .
          <article-title>Interaction testing of highly-configurable systems in the presence of constraints</article-title>
          .
          <source>In ISSTA.</source>
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          <string-name>
            <surname>Leonardo de Moura and Nikolaj Bjorner</surname>
          </string-name>
          .
          <year>2008</year>
          .
          <article-title>Z3: An Efficient SMT Solver</article-title>
          .
          <source>In TACAS.</source>
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          <string-name>
            <given-names>Ruizhi</given-names>
            <surname>Gao</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Linghuan</given-names>
            <surname>Hu</surname>
          </string-name>
          , W. Eric Wong,
          <string-name>
            <surname>Han-Lin</surname>
            <given-names>Lu</given-names>
          </string-name>
          , and
          <string-name>
            <surname>Shih-Kun Huang</surname>
          </string-name>
          .
          <year>2016</year>
          .
          <article-title>Effective Test Generation for Combinatorial Decision Coverage</article-title>
          .
          <source>In QRS.</source>
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          <string-name>
            <given-names>Wolfgang</given-names>
            <surname>Grieskamp</surname>
          </string-name>
          , Xiao Qu, Xiangjun Wei, Nicolas Kicillof, and
          <string-name>
            <surname>Myra</surname>
            <given-names>B.</given-names>
          </string-name>
          <string-name>
            <surname>Cohen</surname>
          </string-name>
          .
          <year>2009</year>
          .
          <article-title>Interaction Coverage Meets Path Coverage by SMT Constraint Solving</article-title>
          . In TestCom/FATES.
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          <string-name>
            <given-names>Mats</given-names>
            <surname>Grindal</surname>
          </string-name>
          , Jeff Offutt,
          <string-name>
            <given-names>and Sten F.</given-names>
            <surname>Andler</surname>
          </string-name>
          .
          <year>2005</year>
          .
          <article-title>Combination Testing Strategies: A Survey</article-title>
          .
          <source>STVR 15</source>
          ,
          <issue>3</issue>
          (
          <year>2005</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          <string-name>
            <given-names>Chang</given-names>
            <surname>Hwan Peter Kim</surname>
          </string-name>
          , Darko Marinov, Sarfraz Khurshid, Don S. Batory, Sabrina Souto,
          <source>Paulo Barros, and Marcelo d'Amorim</source>
          .
          <year>2013</year>
          .
          <article-title>SPLat: Lightweight Dynamic Analysis for Reducing Combinatorics in Testing Configurable Systems</article-title>
          . In ESEC/SIGSOFT FSE.
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          <string-name>
            <given-names>James C.</given-names>
            <surname>King</surname>
          </string-name>
          .
          <year>1976</year>
          .
          <article-title>Symbolic Execution and Program Testing</article-title>
          .
          <source>CACM 19</source>
          ,
          <issue>7</issue>
          (
          <year>1976</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          <string-name>
            <given-names>Changhai</given-names>
            <surname>Nie</surname>
          </string-name>
          and
          <string-name>
            <given-names>Hareton</given-names>
            <surname>Leung</surname>
          </string-name>
          .
          <year>2011</year>
          .
          <article-title>A Survey of Combinatorial Testing</article-title>
          .
          <source>ACM Comput. Surv</source>
          .
          <volume>43</volume>
          ,
          <issue>2</issue>
          (
          <year>2011</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          <string-name>
            <given-names>Pablo</given-names>
            <surname>Ponzio</surname>
          </string-name>
          , Nazareno Aguirre,
          <string-name>
            <given-names>Marcelo F.</given-names>
            <surname>Frias</surname>
          </string-name>
          , and
          <string-name>
            <given-names>Willem</given-names>
            <surname>Visser</surname>
          </string-name>
          .
          <year>2016</year>
          .
          <article-title>Field-Exhaustive Testing</article-title>
          .
          <source>In SIGSOFT FSE.</source>
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          <string-name>
            <given-names>Hua</given-names>
            <surname>Zhong</surname>
          </string-name>
          , Lingming Zhang, and
          <string-name>
            <given-names>Sarfraz</given-names>
            <surname>Khurshid</surname>
          </string-name>
          . 2016a.
          <article-title>Combinatorial generation of structurally complex test inputs for commercial software applications</article-title>
          .
          <source>In SIGSOFT FSE.</source>
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          <string-name>
            <given-names>Hua</given-names>
            <surname>Zhong</surname>
          </string-name>
          , Lingming Zhang, and
          <string-name>
            <given-names>Sarfraz</given-names>
            <surname>Khurshid</surname>
          </string-name>
          .
          <year>2016b</year>
          .
          <article-title>The comKorat Tool: Unified Combinatorial and Constraint-Based Generation of Structurally Complex Tests</article-title>
          .
          <source>In NFM.</source>
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>