<!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>Attention, Test Code is Low-quality!</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Xinye Tang</string-name>
          <email>tangxinye@nfs.iscas.ac.cn</email>
          <xref ref-type="aff" rid="aff0">0</xref>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Institute of Software</institution>
        </aff>
        <aff id="aff1">
          <label>1</label>
          <institution>State Key Laboratory of Computer Science</institution>
        </aff>
      </contrib-group>
      <fpage>27</fpage>
      <lpage>32</lpage>
      <abstract>
        <p>In this paper, we describe the formatting guidelines for ACM SIG Proceedings. Software testing is an essential process during software development and maintenance for improving software quality. Test code, the artefact during software testing, has been widely used in many software quality assurance techniques. Traditionally, software quality assurance techniques, e.g., automatic bug repair, fault localization, test case prioritization, and mining API usage from test code are based on the hypothesis of a sound quality of the test code. However, via empirical study on four open source projects, we found that the quality of test code is quite low comparing with corresponding source code, and this might hurt the above software quality assurance techniques. In this paper, we studied more than 140,000 LOC(lines of code) test code from four large scale and widely used open source projects and found that it is common for test code to be unregulated and of low-quality in open source projects. First, the comment clone ratio, unreleased resource ratio and clone code ratio of test code is much higher than that of corresponding source code; second, bug-fixed coverage is down to 0. We have learned the following lessons: the quality of test code is quite low comparing with corresponding source code, and the low quality test code may misguide existing software quality assurance techniques.</p>
      </abstract>
      <kwd-group>
        <kwd>eol&gt;Test code quality</kwd>
        <kwd>empirical study</kwd>
        <kwd>testing</kwd>
        <kwd>software quality assurance</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>1. INTRODUCTION</title>
      <p>Software testing is an essential process during software
development and maintenance. Test code is widely used as the
artefact during software testing for ensuring software quality.
Copyright © 2015 for this paper by its authors. Copying permitted for
private and academic purposes</p>
      <p>
        Therefore, it’s critical to maintain high quality test code. Existing
work [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ] revealed that high quality test code of a software system
could improve the development team’s performance. Moreover,
they reported that the bad quality of test code demonstrated a
significant positive correlation between test code quality and the
throughput and productivity of issue handling. In this paper, we
conduct a pilot study to examine test code quality from a different
aspect, specifically, we try to study the potential relation between
test code quality and some software quality assurance techniques,
e.g., automatic bug repair, fault localization, test case
prioritization, and mining API usage from test code.
      </p>
      <p>
        Traditionally, software quality assurance techniques, e.g.,
automatic bug repair [
        <xref ref-type="bibr" rid="ref14 ref4 ref9">4, 9, 14</xref>
        ], fault localization [
        <xref ref-type="bibr" rid="ref11 ref15">11, 15</xref>
        ], test
case prioritization [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ], and mining APIs from test code [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ][
        <xref ref-type="bibr" rid="ref16">16</xref>
        ] are
based on the hypothesis of a sound quality of the test code.
Research studies on automatic fault repair leverage test code to
measure their performance. For fault localization, test code is
required to improve the accuracy and establish the lower and
upper bounds. Test case Prioritization techniques aim to rearrange
the execution order of test cases, which is based on the sound
quality of the test code. What’s more, test code is essential to
mine API usage examples, which is helpful for developers to learn
and understand the correct usage of APIs of libraries.
      </p>
      <p>In this paper, via empirical study on four large scale and widely
used open source projects, we found that the quality of test code is
quite low comparing with corresponding source code, and this
might have negative impact on the above software quality
assurance techniques. We studied more than 140,000 LOC test
code from four large scale and widely used open source projects
and found that it is common for test code to be unregulated and
low-quality in open source projects. Specifically, first the
comment clone ratio, unreleased resource ratio and clone code
ratio of test code is much higher than that of corresponding source
code; second, bug-fixed coverage is down to 0.</p>
      <p>We have learned the following lessons: the quality of test code is
quite low comparing with corresponding source code, and the low
quality test code may misguide existing software quality assurance
techniques. The main contributions of this work include:
1. We proposed five criteria for the measurement of test code
quality.
2. Based on proposed criteria, we measured test code quality of
four large scale, widely used open source projects. Results show
that the quality of test code is quite low comparing with
corresponding source code. We further discuss the potential
impact of low quality test code on existing software quality
assurance techniques. To the best of our knowledge, this is the
first work to report that the test code is low-quality and
untrustworthy, which should be taken seriously.</p>
      <p>In the remainder of this paper, section II presents points on which
the author would like to get the most advice on; Section III
presents essential background and related work of our study;
Section IV shows our motivation; Section V present the three
categories for the measurement of the test code quality. Section
VI explains how we conduct our empirical study; Section VII
discusses the threats to this work; Section VIII concludes this
paper and discuss our future work.</p>
    </sec>
    <sec id="sec-2">
      <title>2. ADVICE WANTED</title>
      <p>As for the points on which we would like to get the most advice
on, we are thinking about the possibilities of proceeding our
research further. Specifically, we plan to conduct quantitative and
qualitative studies to explore how exactly the low-quality test
code could impact software quality assurance techniques, i.e.,
automatic bug repair, fault localization, test case prioritization,
and mining API usage. We will appreciate it if mentors could give
insightful suggestions on whether the work is valuable and how it
could be effectively done. Also, any feedback on the structure and
content of the paper would be welcome.</p>
    </sec>
    <sec id="sec-3">
      <title>3. BACKGROUND AND RELATED WORK</title>
      <p>
        Automatic Bug Repair: is the process of automatically
generating patches for repairing bugs. A lot of studies have been
carried out to address this issue. Weimer et al. [
        <xref ref-type="bibr" rid="ref14">14</xref>
        ] present a fully
automated technique for repairing bugs using one part of a
program as a template to repair another part. Kim et al. [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ]
proposed a patch generation approach learned from
humanwritten patches and identified common fix patterns for automatic
patch generation. Tan et al. [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ] propose an approach of
automated repair of software regression bugs. Test code is used to
evaluate the effectiveness of these approaches, specifically, given
a bug, if a generated repair patch could pass all test cases, the
generated repair patch will be treated as an effective repair for this
bug.
      </p>
      <p>
        Fault Localization: is the indispensable process to identify
exactly where the bugs are before fixing them. Xuan et al. [
        <xref ref-type="bibr" rid="ref15">15</xref>
        ]
pointed out that the effectiveness of fault localization depends on
the quantity of test code and proposed an approach to improve
fault localization with test case purification. Steimann et al. [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ]
empirically explored performance of existing fault locators and
their results shown the quality of test code is a key factor for fault
locators. Campos et al. [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ] proposed an approach to fault
localization by entropy-based test generation.
      </p>
    </sec>
    <sec id="sec-4">
      <title>Test Case Prioritization: aims to rearrange the</title>
      <p>
        execution order of test cases to maximize specific objectives.
Elbaum et al. [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ] compare different test case prioritization
techniques in regression testing on the performance in improving
the rate of fault detection.
      </p>
    </sec>
    <sec id="sec-5">
      <title>Mining API Usage from Test Code: Understanding</title>
      <p>
        and learning the correct usage of APIs of libraries are significant
but complex activities for developers. Ghafari et al. [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ] described
an approach to code recommendation where examples are
obtained by mining and manipulating the unit tests of the API.
Zhu et al. [
        <xref ref-type="bibr" rid="ref16">16</xref>
        ] proposed an approach to mining API usage
examples from test code, combining the technique of clustering to
improve the representativeness of extracted examples. Nasehi et al.
[
        <xref ref-type="bibr" rid="ref10">10</xref>
        ] proposed to supplement the standard API documentation
with relevant examples taken from the unit tests. Thus, the quality
of APIs usage in test code is critical to this topic.
      </p>
      <p>Test Code Quality: It is critical to detect the quality of test
code, however there are not enough work done in this field.</p>
      <p>
        Athanasiou et al. [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ] revealed that high quality test code of a
      </p>
    </sec>
    <sec id="sec-6">
      <title>4. MOTIVATION</title>
      <p>As is mentioned above, test code is closely related with software
quality assurance techniques, e.g., automatic bug repair, fault
localization, test case prioritization, and mining API usage from
test code. These studies are based on the hypothesis of a sound
quality of the test code. Thus, the quality of test code is critical for
the performance of these techniques. In this study, we try to
conduct a pilot study to explore the quality of test code according
to the five criteria.</p>
    </sec>
    <sec id="sec-7">
      <title>5. TEST CODE QUALITY</title>
      <p>In this section, we present the three categories for the
measurement of test code quality.</p>
    </sec>
    <sec id="sec-8">
      <title>5.1 Incorrectness</title>
      <p>This category consists of test criteria that focus on measuring the
error detection ability of the code. Unreleased resource and code
clone are the main criteria for this category.</p>
      <sec id="sec-8-1">
        <title>5.1.1 Unreleased resource</title>
        <p>Unreleased resource is a kind of incorrect use of APIs. Unreleased
resource occurs when developers fail to release resource such as
File, ResultScanner and so on. When developers finished the
input and output operations on a file object, developers should
close file and release resources, or there will be a potential
memory leak vulnerability. Moreover, developers should close the
resource with finally clause to ensure the resource is closed no
matter what happens in the try block.</p>
        <p>The following real test case from Ant 1.9.4, is an example where
the method did not close the file object it opened.</p>
        <sec id="sec-8-1-1">
          <title>Unreleased</title>
        </sec>
        <sec id="sec-8-1-2">
          <title>Resource</title>
          <p>Ratio#
0.20
# Clone Com(Comment) are the number of test classes which clone comment, and Clone Comment Ratio represents the number of clone
comment classes out of the total number of test classes. Unreleased Resources are the number of test classes which do not release resources,
and Unreleased Resource Ratio represents the number of test classes which do not release resource out of the total number of test classes.
Code Clones represent the lines of clone code, and Clone Code Ratio represents the lines of clone code out of the total lines of code.
1 public void testPassFile () throws Exception {
buildRule . executeTarget (”test3 ”);
File f = new File (
buildRule . getProject (). getBaseDir () ,
“testpassfile .tmp ”);
assertTrue ( . . . ) ;
assertEquals ( . . . ) ;</p>
          <p>In this study, the unreleased resource ratio is defined as the
following:
Unreleased Resource Ratio = (#unreleased resource classes)/TC
where #unreleased resource classes shows the number of the
classes which did not release resources, and TC shows the total
number of the classes.</p>
          <p>We have developed a tool to automatically examine the code, and
checked whether every resource was closed after being opened
and used. If the resource was closed, we checked whether the
close statement is enclosed in finally blocks. We counted both the
resources which were not closed and those that were not closed in
finally block for the unreleased resources.</p>
        </sec>
      </sec>
      <sec id="sec-8-2">
        <title>5.1.2 Code Clones</title>
        <p>
          Code clones are separate fragments of code that are very similar.
They are a common phenomenon in the open source systems
which have been under development for some time. Clone codes
are often referred to due to the difficulty it makes in changing and
maintaining the open source systems since developers have to
locate and update many fragments frequently. For example,
Fowler [
          <xref ref-type="bibr" rid="ref7">7</xref>
          ] argues that code duplicates are bad smells of poor
designFigure 1 shows an example of clone codes. Clone code
ratio is defined as the following:
        </p>
        <p>Clone Code Ratio = (#clone code lines)/LOC
where #clone code line shows the lines of clone code, and LOC
shows the lines of code.</p>
        <p>
          To estimate the clone code, we use PMD’s Copy/Paste Detector
(CPD) [
          <xref ref-type="bibr" rid="ref2">2</xref>
          ] and set the minimum Tile-size at 10, meaning that CPD
cannot find clones in methods that are less than 10 statements
long. Figure 1 indicates that the clone analysis tool can find
fragments which differ in the names of variables and parameters,
and in which some statements have been rearranged.
        </p>
      </sec>
    </sec>
    <sec id="sec-9">
      <title>5.2 Insufficiency</title>
      <p>Criteria that fall inside this category focus on measuring the loss
detection ability of the code. To identify the loss of code, we
choose code coverage and bug-fixed coverage as the main criteria.</p>
      <sec id="sec-9-1">
        <title>5.2.1 Code Coverage</title>
        <p>
          Code coverage is the most frequently used metric for test code
quality assessment [
          <xref ref-type="bibr" rid="ref3">3</xref>
          ]. It is used to describe the degree to which
the source code of a project is tested by a particular test suite.
Usually the project with lower code coverage has been
insufficiently tested and therefore has a higher chance of
containing bugs. There exist many tools for dynamic code
coverage estimation (e.g., Clover 5 and Cobertura 6 for Java,
Testwell CTC++ 7 for C++, NCover 8 for C#). We used Clover [
          <xref ref-type="bibr" rid="ref1">1</xref>
          ]
to obtain a code coverage metric.
        </p>
      </sec>
      <sec id="sec-9-2">
        <title>5.2.2 Bug-fixed Coverage</title>
        <p>In general, after fixing a bug, new unit test should be created and
added to the regression test suite to ensure this bug will not be
reintroduced in the following versions of the projects. The
bugfixed coverage is a measure used to describe the degree to which
extent the fixed bug is covered by test code. If a fixed bug has not
been covered by test cases, this fixed bug will be under high risk
of reopening. In this study, the bug-fixed coverage is defined as
the following:</p>
        <p>Bug-fixed Coverage = (#tested bugs)/ (#fixed bugs)
where #tested bugs is the number of fixed bugs which is tested in
the current version of the project, and #fixed bugs is the number
of fixed bugs in the current version of the project.</p>
        <p>To calculate the bug-fixed coverage, we first collected the fixed
bugs for the responding version of the four open source projects
from their release notes; second, we found the fixed bugs which
are not tested in the current version, manually. Specifically, the
first author is responsible for the collection of un-tested fixed
bugs, after which the second author recollected the data. Then
results are merged, and conflicts were get resolved by a joint
pairinspection of all three authors.</p>
      </sec>
    </sec>
    <sec id="sec-10">
      <title>5.3 Bad Readability</title>
      <p>This category consists of test criteria that focus on measuring the
detection of the unreadable code. Clone comment ratio is the main
criterion for this category.Comments make the code
developerreadable. They generate code documentation in predefined format.
Clone comments are the same prologue comment of different
methods, which makes the code inconsistent with the code
documentation and hard to understand. Often this occurs when
developers miss to change the clone comment.</p>
      <p>Consider the following real test code from Ant 1.9.4:
4
5 }
9</p>
      <p>In this study, the clone comment ratio is defined as the following:</p>
      <p>Clone Comment Ratio = (#clone comment classes)/TC
where #clone comment classes shows the number of the classes
which clone comment, and TC shows the total number of the
classes.</p>
      <p>The logic of the two test cases are different, yet the comments are
the same, which might cause the developers’ confusion in terms of
the understanding of the test logic of these two test cases. We
developed a simple tool to detect cloned comments, which could
look into the code and locate the functions that share comment,
and collect the clone comments automatically.</p>
    </sec>
    <sec id="sec-11">
      <title>6. EMPIRICAL STUDY</title>
      <p>In this section, we present the quality of test code of the four open
source projects according to the five criterion respectively.</p>
    </sec>
    <sec id="sec-12">
      <title>6.1 Dataset</title>
      <p>In this paper, we try to explore the quality of test code of four
large-scale and widely used open source projects, i.e., Ant, Maven,
Log4j, and Commons Math, using the five criteria. For each
project, we extracted the test code and source code separately
from the latest version. Details of these projects are shown in
Table 1.</p>
    </sec>
    <sec id="sec-13">
      <title>6.2 Result Analysis</title>
      <sec id="sec-13-1">
        <title>6.2.1 Unreleased Resource</title>
        <p>As is shown in Table 1, in the four projects, the unreleased
resource ratio for test code is up to 32% and on average it is 20%,
while the average ratio for source code is less than 7%. Overall,
all the unreleased resource ratios in test code are much higher
than that in the corresponding source code.</p>
        <sec id="sec-13-1-1">
          <title>Potential Impact on Software Quality Assurance Techniques:</title>
          <p>
            The results indicate that the quality of source code is much higher
than test code. As the test code is widely used for mining API
usage examples [
            <xref ref-type="bibr" rid="ref10 ref16">10, 16</xref>
            ], this can result in bad API usage
examples, making API learning quite confusing for developers.
# FBs are the number of fixed bugs in the current version, and Tested FBs are the number of fixed bugs which have been tested in the
current version. Bug Coverage is the ratio of Test FBs out of FBs.
          </p>
        </sec>
      </sec>
      <sec id="sec-13-2">
        <title>6.2.2 Code Clone</title>
        <p>As is shown in Table 1, in the open source projects, the clone
code ratio for test code is up to 40% and on average the ratio is
about 23%, while the average ratio for source code is about 17%.
Overall, all the clone code ratios in test code are much higher than
that in corresponding source code.</p>
        <sec id="sec-13-2-1">
          <title>Potential Impact on Software Quality Assurance Techniques:</title>
          <p>Clone test code is harmful for software quality, which increases
test maintenance overhead and propagates any pre-existing errors.
Clone test code always cover similar source code, which reduces
the discrimination among test code and might hurt fault
localization and test case prioritization.</p>
        </sec>
      </sec>
      <sec id="sec-13-3">
        <title>6.2.3 Code Coverage</title>
        <p>As is shown in Table 2, in the four projects, the code coverage for
test code varies from 75% to 85%, while the average ratio for
code coverage is around 80 %. Overall, the code coverage are
high enough to basically cover the test of the source code.</p>
      </sec>
      <sec id="sec-13-4">
        <title>6.2.4 Bug-fixed Coverage</title>
        <p>Results are shown in Table 2, Bug-fixed Coverage in our studied
versions of Ant and Log4j is 0, which means none of the fixed 20
bugs in Ant 1.9.4 and Log4j 1.2.17 has been tested after fixing. In
Maven, and Commons Math, values of Bug-fixed Coverage are
also quite low, more than 70% fixed bugs are not addressed in test
code. Overall, the bug-fixed coverage is so low that the test for the
fixed bugs are not sufficient.</p>
        <sec id="sec-13-4-1">
          <title>Potential Impact on Software Quality Assurance Techniques:</title>
          <p>The low Bug-fixed Coverage values in software projects make it
hard to practice test case prioritization, and also hurt the
effectiveness of automatic bug repair. Since test case prioritization
aims to arrange test cases based on the code coverage for
accelerating bug detection, the low Bug-fixed Coverage means
that when un-tested fixed bugs are re-introduced, prioritized test
cases might not reveal these bugs; for automatic bug repair, the
low Bug-fixed Coverage makes the evaluation inefficient.
Automatic bug repair evaluates its repair patch by running all test
cases. If all test cases are passed, the generated patch will be
treated as an effective repair patch for a bug. However the low
Bug-fixed Coverage means many fixed bugs are not tested by the
existing test cases. So when evaluating generated repair patches,
even all test cases are passed, these un-covered fixed bugs might
be re-introduced.</p>
        </sec>
      </sec>
      <sec id="sec-13-5">
        <title>6.2.5 Comment Clone</title>
        <p>As is shown in Table 1, the average clone comment ratio for test
code is about 20% and the average clone comment ratio for source
code is less than 10%. Overall, the clone comment ratio in test
code is much higher than that in source code of the four projects.
The results indicate that the quality of source code is much higher
than the test code in terms of comment clone.</p>
        <sec id="sec-13-5-1">
          <title>Potential Impact on Software Quality Assurance Techniques:</title>
          <p>
            Program comments are important for developers to understand
code. Moreover, comments that are inconsistent with code can
easily confuse and misguide developers to introduce bugs in
subsequent versions [
            <xref ref-type="bibr" rid="ref12">12</xref>
            ]. The high clone comment ratio in test
code is harmful for developers to understand the test logic.
          </p>
        </sec>
      </sec>
    </sec>
    <sec id="sec-14">
      <title>7. THREATS TO VALIDITY</title>
    </sec>
    <sec id="sec-15">
      <title>7.1 Internal Validity</title>
      <p>In this paper, we study the quality of test code. we present the five
criteria for the measurement of test code quality. However, other
criteria that we have overlooked may also can measure the quality
of test code.</p>
    </sec>
    <sec id="sec-16">
      <title>7.2 External Validity</title>
      <p>In this work we investigate the quality of test code in terms of five
proposed criteria on open source projects. However, it is possible
that our approach may not work well on some closed-source
software, or small scale open source software projects. The
purpose of this work is to study the impact of low quality test
code on several software assurance techniques, however, not all
projects maintain valid test code. Our approach is not suitable for
these projects without test code.</p>
    </sec>
    <sec id="sec-17">
      <title>8. CONCLUSION AND FUTURE WORK</title>
      <p>This paper found that it is common for test code to be unregulated
and of low quality in the open source projects. We studied 1164
test classes and more than 140,000 LOC test code from the
current version of four open source projects. Results indicate that
the quality of test code is much lower than that for the
corresponding source code in terms of the proposed criteria, e.g.,
unreleased resource, code clone and comment clone, and the the
coverage of test code for fixed bug is not sufficient.</p>
      <p>We further discussed the potential impact of low quality on the
existing software quality assurance techniques. To the best of our
knowledge, this is the first work to report that the test code is
lowquality and untrustworthy, which should be taken seriously.
Future work. Our research is in a final stage. We explored the
quality of test code in terms of five proposed criteria and the
impact of test code on software quality assurance techniques. In
the future, we plan to conduct quantitative and qualitative studies
to explore how exactly the low-quality test code could impact
software quality assurance techniques, i.e., automatic bug repair,
fault localization, test case prioritization, and mining API usage.</p>
    </sec>
    <sec id="sec-18">
      <title>Acknowledgment</title>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <surname>Clover</surname>
          </string-name>
          . https://www.atlassian.com/software/clover/overview. Accessed April 20,
          <year>2015</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          <article-title>[2] Pmd's cpd</article-title>
          . http://pmd.sourceforge.
          <source>net/pmd-4.3</source>
          .0/cpd.html.
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>D.</given-names>
            <surname>Athanasiou</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Nugroho</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Visser</surname>
          </string-name>
          ,
          <article-title>and</article-title>
          <string-name>
            <given-names>A.</given-names>
            <surname>Zaidman</surname>
          </string-name>
          .
          <article-title>Test code quality and its relation to issue handling performance</article-title>
          . volume
          <volume>40</volume>
          , pages
          <fpage>1100</fpage>
          -
          <lpage>1125</lpage>
          ,
          <year>Nov 2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <given-names>E. T.</given-names>
            <surname>Barr</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Y.</given-names>
            <surname>Brun</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P.</given-names>
            <surname>Devanbu</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Harman</surname>
          </string-name>
          , and
          <string-name>
            <given-names>F.</given-names>
            <surname>Sarro</surname>
          </string-name>
          .
          <article-title>The plastic surgery hypothesis</article-title>
          .
          <source>In 22nd ACM SIGSOFT International Symposium on the Foundations of Software Engineering (FSE</source>
          <year>2014</year>
          ), Hong Kong, volume
          <volume>16</volume>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>J.</given-names>
            <surname>Campos</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Abreu</surname>
          </string-name>
          , G. Fraser, and
          <string-name>
            <surname>M.</surname>
          </string-name>
          <article-title>d'Amorim. Entropybased test generation for improved fault localization</article-title>
          .
          <source>In Automated Software Engineering (ASE)</source>
          ,
          <year>2013</year>
          IEEE/ACM 28th International Conference on, pages
          <fpage>257</fpage>
          -
          <lpage>267</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>S.</given-names>
            <surname>Elbaum</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Malishevsky</surname>
          </string-name>
          , and
          <string-name>
            <surname>G. Rothermel.</surname>
          </string-name>
          <article-title>Test case prioritization: A family of empirical studies</article-title>
          . volume
          <volume>28</volume>
          , pages
          <fpage>159</fpage>
          -
          <lpage>182</lpage>
          ,
          <year>2002</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <given-names>M.</given-names>
            <surname>Fowler</surname>
          </string-name>
          .
          <article-title>Refactoring: Improving the design of existing code</article-title>
          .
          <source>In Proceedings of the Second XP Universe and First Agile Universe Conference on Extreme Programming and Agile Methods - XP/Agile Universe</source>
          <year>2002</year>
          , page
          <volume>256</volume>
          ,
          <year>2002</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>M.</given-names>
            <surname>Ghafari</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Ghezzi</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Mocci</surname>
          </string-name>
          , and
          <string-name>
            <given-names>G.</given-names>
            <surname>Tamburrelli</surname>
          </string-name>
          .
          <article-title>Mining unit tests for code recommendation</article-title>
          .
          <source>In Proceedings of the 22Nd International Conference on Program Comprehension</source>
          , pages
          <fpage>142</fpage>
          -
          <lpage>145</lpage>
          . ACM,
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>D.</given-names>
            <surname>Kim</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Nam</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Song</surname>
          </string-name>
          , and
          <string-name>
            <given-names>S.</given-names>
            <surname>Kim</surname>
          </string-name>
          .
          <article-title>Automatic patch generation learned from human-written patches</article-title>
          .
          <source>In Proceedings of the 2013 International Conference on Software Engineering</source>
          , pages
          <fpage>802</fpage>
          -
          <lpage>811</lpage>
          . IEEE Press.
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <given-names>S. M.</given-names>
            <surname>Nasehi</surname>
          </string-name>
          and
          <string-name>
            <given-names>F.</given-names>
            <surname>Maurer</surname>
          </string-name>
          .
          <article-title>Unit tests as api usage examples</article-title>
          .
          <source>In Software Maintenance (ICSM)</source>
          ,
          <year>2010</year>
          IEEE International Conference on, pages
          <fpage>1</fpage>
          -
          <lpage>10</lpage>
          . IEEE,
          <year>2010</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <given-names>F.</given-names>
            <surname>Steimann</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Frenkel</surname>
          </string-name>
          , and
          <string-name>
            <given-names>R.</given-names>
            <surname>Abreu</surname>
          </string-name>
          .
          <article-title>Threats to the validity and value of empirical assessments of the accuracy of coverage-based fault locators</article-title>
          .
          <source>In Proceedings of the 2013 International Symposium on Software Testing and Analysis</source>
          , pages
          <fpage>314</fpage>
          -
          <lpage>324</lpage>
          . ACM.
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [12]
          <string-name>
            <given-names>L.</given-names>
            <surname>Tan</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Yuan</surname>
          </string-name>
          , G. Krishna, and
          <string-name>
            <given-names>Y.</given-names>
            <surname>Zhou</surname>
          </string-name>
          . /* iComment:
          <article-title>Bugs or bad comments? */</article-title>
          .
          <source>In Proceedings of the 21st ACM Symposium on Operating Systems Principles (SOSP07)</source>
          ,
          <year>October 2007</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          [13]
          <string-name>
            <given-names>S. H.</given-names>
            <surname>Tan</surname>
          </string-name>
          and
          <string-name>
            <given-names>A.</given-names>
            <surname>Roychoudhury</surname>
          </string-name>
          .
          <article-title>relifix: Automated repair of software regressions</article-title>
          .
          <source>In Proceedings of the 2015 International Conference on Software Engineering. IEEE</source>
          ,
          <year>2015</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          [14]
          <string-name>
            <given-names>W.</given-names>
            <surname>Weimer</surname>
          </string-name>
          ,
          <string-name>
            <given-names>T. V.</given-names>
            <surname>Nguyen</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C. L.</given-names>
            <surname>Goues</surname>
          </string-name>
          , and
          <string-name>
            <given-names>S.</given-names>
            <surname>Forrest</surname>
          </string-name>
          .
          <article-title>Automatically finding patches using genetic programming</article-title>
          .
          <source>In Proceedings of the 31st International Conference on Software Engineering</source>
          , pages
          <fpage>364</fpage>
          -
          <lpage>374</lpage>
          . IEEE Computer Society,
          <year>2009</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          [15]
          <string-name>
            <given-names>J.</given-names>
            <surname>Xuan</surname>
          </string-name>
          and
          <string-name>
            <given-names>M.</given-names>
            <surname>Monperrus</surname>
          </string-name>
          .
          <article-title>Test case purification for improving fault localization</article-title>
          .
          <source>In Proceedings of the 22nd ACM SIGSOFT International Symposium on Foundations of Software Engineering</source>
          , pages
          <fpage>52</fpage>
          -
          <lpage>63</lpage>
          . ACM,
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          [16]
          <string-name>
            <given-names>Z.</given-names>
            <surname>Zhu</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Y.</given-names>
            <surname>Zou</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B.</given-names>
            <surname>Xie</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Y.</given-names>
            <surname>Jin</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Z.</given-names>
            <surname>Lin</surname>
          </string-name>
          , and
          <string-name>
            <surname>L. Zhang.</surname>
          </string-name>
          <article-title>Mining api usage examples from test code</article-title>
          .
          <source>In Software Maintenance and Evolution (ICSME)</source>
          ,
          <year>2014</year>
          IEEE International Conference on, pages
          <fpage>301</fpage>
          -
          <lpage>310</lpage>
          . IEEE.
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>