<!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>Belgium-Netherlands Software Evolution Workshop Mons</journal-title>
      </journal-title-group>
    </journal-meta>
    <article-meta>
      <title-group>
        <article-title>Steps towards zero-touch mutation testing in Pharo</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Mehrdad Abdi</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Serge Demeyer</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Flanders Make</institution>
          ,
          <country country="BE">België</country>
        </aff>
        <aff id="aff1">
          <label>1</label>
          <institution>Universiteit Antwerpen</institution>
          ,
          <addr-line>Middelheimlaan 1, 2020 Antwerpen</addr-line>
          ,
          <country country="BE">België</country>
        </aff>
      </contrib-group>
      <pub-date>
        <year>2022</year>
      </pub-date>
      <volume>1</volume>
      <fpage>2</fpage>
      <lpage>13</lpage>
      <abstract>
        <p>Mutation testing is injecting artificial faults into the code to assess the written test methods. Not surprisingly, this process is time-consuming and may take hours and days to complete. On the other hand, developers, who are busy with diferent tasks, may find it cumbersome to run mutation testing in their workstations. In this paper, we propose some steps to develop a zero-touch mutation testing framework and facilitate employing mutation testing by developers. We extend MuTalk, the mutation testing framework in the live programming environment of Pharo, by (1) adding hierarchical mutation operators, (2) integrating it to GitHub-Actions, (3) visualizing the result in a web-based mutants explorer.</p>
      </abstract>
      <kwd-group>
        <kwd>eol&gt;Mutation testing Ops</kwd>
        <kwd>DevOps</kwd>
        <kwd>Zero-touch testing</kwd>
        <kwd>Test amplification</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>1. Introduction</title>
      <p>
        Software is everywhere, and its failures cost. Unit testing is writing small test code snippets
that exercise the unit under test and asserts the intended values. In mutation testing [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ], some
artificial bugs (mutations) are injected into the program under test to evaluate the test suite’s
strength. We say the test suite kills a mutant when at least one of the tests fails in the mutated
program. Alive mutants show that the test suite needs improvements because it is indiferent to
the injected faults.
      </p>
      <p>
        Pharo [
        <xref ref-type="bibr" rid="ref2 ref3">2, 3</xref>
        ] is a dynamically typed language with a live programming environment focusing
on simplicity and immediate feedback. The observations from the experiments in our past work
in Pharo motivated us for this work. We developed a test amplification tool, Small-Amp [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ], that
analyzes the program under test and its test suite and suggests new test methods to kill some of
the mutants. During the experiment, we noticed that MuTalk, the mutation testing in Pharo,
generates too few mutants compared to the mutation testing framework in Java from another
work [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ]. Mutation testing in Pharo generated 1102 mutants for 52 classes (≈ 21 mutants per
class), while there were 7980 mutants in 40 classes in Java (≈ 200 mutants per class). To the
extent that in one of the cases (TLLegendTest), it failed to generate any mutant despite the
class under test having 96 lines of code. This observation led us to expand the mutation operator
in MuTalk of which the details come in Section 2.
      </p>
      <p>After adding new mutation operators, we witnessed that the number of times Pharo has
recovered from freezing has increased, and the main reason was entering an infinite loop .
Section 3 explains this problem with an example and how we overcome this problem.</p>
      <p>In the next step, we created MuTalkCI as a zero-touch mutation testing for the live
programming environment of Pharo. By default, developers are expected to use MuTalk manually by
loading it in their Pharo image, running it over their project, and waiting a considerable time to
ifnish. We created a workflow in GitHub-Actions that loads the project under test and runs a
hierarchical mutation testing on it. We call it zero-touch because the burdensome parts of the
process are automated, and the developers’ attention is needed when the result is ready to be
audited. We also call it MutationTestingOps because of its similarities to DevOps in running
continuous mutation analysis. MuTalkCI is explained in Section 4.</p>
      <p>
        The framework also includes a web-based mutant explorer to stash the mutation coverage
status over the development time (similar to coveralls.io but for mutation testing). Using this
mutant explorer, developers can assess the alive mutants and decide which to kill. We also
equip the mutant explorer with a coverage indicator based on the RIPR model [
        <xref ref-type="bibr" rid="ref10 ref6 ref7 ref8 ref9">6, 7, 8, 9, 10</xref>
        ]
which helps developers in their assessment. This web interface is bidirectional and allows the
developer to mark the mutants as to be killed, which creates an issue in the repository on GitHub.
The interactive mutant explorer comes in Section 4.1.
      </p>
    </sec>
    <sec id="sec-2">
      <title>2. Expanding Mutation Operators in MuTalk</title>
      <sec id="sec-2-1">
        <title>2.1. Pharo and MuTalk</title>
        <p>Pharo is a pure object-oriented, dynamically typed language based on Smalltalk. It ofers a simple
language model: every action in the language is accomplished by sending messages to objects.
In the context of Pharo, the term message sending is used instead of method invocation. As an
example, there is no predefined if statement in the language: it is implemented as sending the
message ifTrue: with a block argument to boolean objects. Another significant diferences
between Pharo and other programming languages are Phaor’s live programming environment
and its snapshot base nature. Unlike most programming languages, Pharo provides a live
programming environment. In Pharo, developers snapshot the state of their image when they
exit the environment, and reload the snapshot when they reenter. This nature of Pharo makes
it vulnerable to unrecoverable changes in the system by a mutation testing tool unintentionally.</p>
        <p>
          MuTalk1 is a mutation testing framework for programs written in Smalltalk. The original
mutation operators in MuTalk includes some known patterns related to Boolean messages,
Magnitude messages, Collection messages, Number messages and Flow control
messages [
          <xref ref-type="bibr" rid="ref11">11</xref>
          ]. Most of the original operators interchange a known messages with other know
messages. For example, one of operators replaces ifTrue: messages with ifFalse:. Other
operators may remove the function return operator, remove exception handling blocks, replace a
block with an empty block, or replace the ifTrue: receiver object with true/false objects.
        </p>
        <sec id="sec-2-1-1">
          <title>1https://github.com/pavel-krivanek/mutalk</title>
        </sec>
      </sec>
      <sec id="sec-2-2">
        <title>2.2. Mutation Operators</title>
        <p>
          Learned from previous works and other mutation testing frameworks2, we added the following
new mutation operators to MuTalk3. The list is sorted from the most coarse-grained to the
ifner operators:
• Extreme transformation. We adopted an extreme transformation operator [
          <xref ref-type="bibr" rid="ref12 ref13">12, 13</xref>
          ] that
stips the whole body of the test method. In Pharo, these stipped methods always return
their object (^ self). We use this operator as the most coarse-grained mutation that
verifies whether the tests are sensitive to removing all statements from a covered method
or not.
• Disabling invocations. As we explained earlier, every action in Pharo is achieved
by sending messages. The message #yourself is a special message that returns the
object itself. We implemented a mutation operator that replaces the sent message with
#yourself to disable an invocation. We use this operator as the second coarse mutation
that verifies whether the tests are sensitive to disabling a statement from a covered method
or not.
• Nullifying the arguments. In this mutation operator, we replace an argument in a
message send node with nil. This operator also verifies whether the tests are sensitive
to disabling an argument in one of the statements.
• Mutating the literals. In this mutation operator, we mutate the literal values. We use
a negation for the Boolean constants, an increase/decrease or zero for the numerical
constants, and replacing with an empty string or a specific predefined string for the string
values.
        </p>
      </sec>
    </sec>
    <sec id="sec-3">
      <title>3. Detecting Infinite Loops</title>
      <p>After adding the new operators, we witnessed the number of times Pharo freezes has increased
so that scarcely an execution finishes. The main freezing reason was entering an infinite loop .
Here we explain it using an example. The first code in the Listing 1 shows a method in which
the factorial of an integer number is calculated recursively. The next code snippets are mutated
versions of this method. In these mutants, when MuTalk runs the test to verify mutation
detection, an infinite loop happens because the mutation operator disables the conditional
statement. Sometimes, the operating system kills the process by an Out of memory error.
factorial: anInt
anInt == 1 ifTrue: [ ^ 1 ].</p>
      <p>^ anInt ∗ (self factorial: anInt −1)
"Mutant 1: disabled the conditional statement by replacing the message"
factorial: anInt
(anInt == 1) yourself.
^ anInt ∗ (self factorial: anInt −1)
2PIT: https://pitest.org/quickstart/mutators/
3https://github.com/mabdi/mutalk
"Mutant 2: replaced the condition with always false"
factorial: anInt
false ifTrue: [ ^ 1 ].</p>
      <p>
        ^ anInt ∗ (self factorial: anInt −1)
"Mutant 3: removed return operator"
factorial: anInt
anInt == 1 ifTrue: [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ].
^ anInt ∗ (self factorial: anInt −1)
      </p>
      <sec id="sec-3-1">
        <title>Listing 1: Examples of an infinate loop after mutation testing.</title>
        <p>
          In a language like Java, the mutation testing framework and the test runner run in two
diferent processes. As a result, the test runner process fails with a StackOverFlow error in a
similar mutation and is detected efortlessly by mutation testing. However, the story is diferent
in Pharo because it is a live programming environment. The mutation testing framework and
the test runner run in a shared process called Pharo image. So, an infinite loop for the test
runner means the whole process losses its availability. We explained this problem in [
          <xref ref-type="bibr" rid="ref14">14</xref>
          ].
        </p>
        <p>To solve this problem, we need a mechanism similar to StackOverflow error in Pharo. We
added an auxiliary statement at the beginning of the mutated method that counts the number
of its executions and throws an exception that fails the test if it reaches the defined threshold.
We exploited the technique used in the class Halt in Pharo internals for its implementation.
Although this technique significantly decreased the number of freezings, the process still may
crash or freeze for other reasons. We leave recovering from other crashes as future work.</p>
      </sec>
      <sec id="sec-3-2">
        <title>Listing 2: Auxiliary exception for avading infinate loops.</title>
        <p>factorial: anInt</p>
        <p>RecursionError onCount: 1024. "I will go of if executed 1024 times"
(anInt == 1) yourself.</p>
        <p>^ anInt ∗ (self factorial: anInt −1)</p>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>4. Zero-touch MuTalk</title>
      <p>For using MuTalk, developers should perform some tedious tasks, including installing the tool
on their Pharo image, initializing it, running it over their programs, and waiting a considerable
time to obtain the results. These burdensome steps may hinder MuTalk from being used
regularly. In this part, we propose a zero-touch mutation testing solution to automate the
unnecessary involvement of developers.</p>
      <p>
        Recently, mutation testing has been employed at scale in Google by integrating it into the
build system and using a dif-based probabilistic approach to reduce the number of mutants [
        <xref ref-type="bibr" rid="ref15">15</xref>
        ].
Then in the code-review process, alive mutants are shown to developers, and they decide to kill
or ignore them. In this part, we try to setup a similar process for Pharo’s open-source projects.
      </p>
      <p>Figure 1 illustrates the proposed hierarchical approach for running MuTalk in the CI/CD
build servers. This framework is also comparable to DevOps [16] frameworks. DevOps provides
agility in continuous software delivery by an iterative approach based on automation and
P
r
o
T
n
H
:
1
collaboration. Similarly, we can define Mutation testing Ops (MutOps) as a continuous mutation
analysis based on automation and collaboration.</p>
      <p>
        Mutation testing is a time-consuming process. For a mutation testing analysis in a reasonable
time, we reduce the mutation testing surface by (1) employing a dif-based mutation testing
works [
        <xref ref-type="bibr" rid="ref15">17, 15</xref>
        ] that only considers the changed part in the repository and (2) using a hierarchical
analysis to exclude some part of code before a full feature mutation testing.
      </p>
      <p>The continuous mutation testing workflow is triggered when a new code is pushed to the
repository. It runs a hierarchical analysis on the selected portion:
1. Firstly, it runs a code coverage tool to find the uncovered parts (report number 1:
uncovered methods). If a method is not covered, all its mutants will survive, so we do not
need to run mutation testing on it. So, we exclude all uncovered parts from the following
analysis.
2. Then, a light mutation testing is executed (report number 2: undetected extreme
transformations). In our implementation, we only use the extreme transformation operator.
Similarly, if an extreme mutation on a method is not detected, we exclude it from the next
analysis.
3. In the third step, a more detailed mutation testing, including all remained operators, is
executed on the parts detected by the previous step, and report number 3 is formed.</p>
      <p>
        Based on the RIPR model [
        <xref ref-type="bibr" rid="ref10 ref6 ref7 ref8 ref9">6, 7, 8, 9, 10</xref>
        ], a test method can kill a mutant if it reaches the
mutant (reachability); the program state is diferent from the state in the original version at that
point (infection); the infected change is propagated to the state of the test (propagation); finally,
the change is revealed by an assertion statement (reveal).
      </p>
      <p>To help developers to kill the mutant manually, we provide two types of coverage status
for alive mutants: the list of tests covering each alive mutant and the list of tests having a
propagated change (report number 4). The tests covering a mutant are start points for manual
investigations on how to kill a mutant. A method with a propagated change is also interesting
for developers because it says that they can kill the mutant only by adding an oracle statement
to assert the state change caused by the mutation.</p>
      <p>We developed a GitHub-Actions workflow 4 that runs MuTalk, and exports the reports
as json outputs. The outputs are sent to the mutants explorer API (See Section 4.1) using
GitHub’s authenticated account token. We use GitHub-Actions because most of Pharo’s
projects currently are hosted on GitHub, and it is freely available for all open-source projects.</p>
      <sec id="sec-4-1">
        <title>4.1. Mutants Explorer</title>
        <p>Since interpreting the reports generated in Section 4 may be cumbersome, we designed a
web-based mutant explorer5. The explorer keeps the history of all builds (similar to coveralls)
and visualizes mutants and their coverage status. Furthermore, it is interactive and allows
developers to assess the mutants and decide whether they should be killed or ignored. If they
decide a mutant to be killed, the explorer adds an item to a GitHub issue related to this build in
the repository.</p>
        <p>4https://github.com/mabdi/smalltalk-SmallBank/blob/master/.github/workflows/mutalkCI.yml
5https://github.com/harolato/mutation-testing-coverage
A
:
2</p>
        <p>It is noteworthy that we have three levels in our proof-of-concept because we skip infection
level for simplicity.</p>
        <p>In this example, we see that testWithdraw not only covers the method (the first green
block), but the state change from this mutant is propagated to its context (second green block).
Using this report, developers understand that they can add an assertion statement to this test
method to verify the method’s return value withdraw: and kill the mutant. They can click
the FIX button to add an issue (right figure) to the GitHub repository. Using GitHub’s REST
APIs and the user’s token obtained with oAuth, the web interface creates an issue per build and
appends all items to fix. Developers can refer to this issue later and amplify their tests manually
by adding new test methods or updating their existing tests.</p>
      </sec>
    </sec>
    <sec id="sec-5">
      <title>5. Conclusion and Future work</title>
      <p>In this paper, we propose an approach for creating a zero-touch mutation testing (or
MutationTestingOps) framework with: (1) adding new mutation testing operators to MuTalk and use an
approach to identify the infinite loops and evade freezings; (2) developing a zero-touch mutation
testing to automate burdensome tasks by implementing a GitHub-Actions workflow that loads
the project under test and MuTalk, and runs a mutation testing process; (3) the outputs are sent
to a mutant explorer in which the history of mutations is recorded and allows developers to
assess mutants and mark them as to be fixed. The assessments are collected in a GitHub issue
that developers can refer to in the future to amplify the tests manually.</p>
      <p>In future work, the system will be run in practice, and a user study will be conducted to
evaluate it.</p>
    </sec>
    <sec id="sec-6">
      <title>Acknowledgments</title>
      <p>This work is supported by (a) the Fonds de la Recherche Scientifique-FNRS and the Fonds
Wetenschappelijk Onderzoek - Vlaanderen (FWO) under EOS Project 30446992 SECO-ASSIST (b) Flanders Make vzw,
the strategic research centre for the manufacturing industry.</p>
      <p>Mutant explorer is developed by Haroldas Latonas.
40th International Conference on Software Engineering: Software Engineering in Practice,
ICSE-SEIP ’18, Association for Computing Machinery, New York, NY, USA, 2018, p. 163–171.</p>
      <p>URL: https://doi.org/10.1145/3183519.3183521. doi:10.1145/3183519.3183521.
[16] L. Leite, C. Rocha, F. Kon, D. Milojicic, P. Meirelles, A survey of devops concepts and
challenges, ACM Computing Surveys (CSUR) 52 (2019) 1–35.
[17] W. Ma, T. Laurent, M. Ojdanić, T. T. Chekam, A. Ventresque, M. Papadakis, Commit-aware
mutation testing, in: 2020 IEEE International Conference on Software Maintenance and
Evolution (ICSME), IEEE, 2020, pp. 394–405.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>M.</given-names>
            <surname>Papadakis</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Kintis</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Zhang</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Y.</given-names>
            <surname>Jia</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Y. L.</given-names>
            <surname>Traon</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Harman</surname>
          </string-name>
          ,
          <article-title>Chapter six - mutation testing advances: An analysis and survey</article-title>
          , volume
          <volume>112</volume>
          of Advances in Computers, Elsevier,
          <year>2019</year>
          , pp.
          <fpage>275</fpage>
          -
          <lpage>378</lpage>
          . URL: https://www.sciencedirect.com/science/article/pii/S0065245818300305. doi:https://doi.org/10.1016/bs.adcom.
          <year>2018</year>
          .
          <volume>03</volume>
          .015.
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>O.</given-names>
            <surname>Nierstrasz</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Ducasse</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Pollet</surname>
          </string-name>
          , Pharo by Example, Square Bracket Associates, c/o Oscar Nierstrasz,
          <year>2010</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>A.</given-names>
            <surname>Bergel</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Cassou</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Ducasse</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Laval</surname>
          </string-name>
          , Deep Into Pharo, Square Bracket Associates,
          <year>2013</year>
          . URL: http://books.pharo.org/deep-into-pharo/.
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <given-names>M.</given-names>
            <surname>Abdi</surname>
          </string-name>
          ,
          <string-name>
            <given-names>H.</given-names>
            <surname>Rocha</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Demeyer</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Bergel</surname>
          </string-name>
          ,
          <article-title>Small-amp: Test amplification in a dynamically typed language</article-title>
          ,
          <source>Empirical Software Engineering</source>
          <volume>27</volume>
          (
          <year>2022</year>
          )
          <article-title>128</article-title>
          . URL: https://doi.org/10. 1007/s10664-022-10169-8. doi:
          <volume>10</volume>
          .1007/s10664-022-10169-8.
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>B.</given-names>
            <surname>Danglot</surname>
          </string-name>
          ,
          <string-name>
            <given-names>O. L.</given-names>
            <surname>Vera-Pérez</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B.</given-names>
            <surname>Baudry</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Monperrus</surname>
          </string-name>
          ,
          <article-title>Automatic test improvement with dspot: a study with ten mature open-source projects</article-title>
          ,
          <source>Empirical Software Engineering</source>
          , Springer Verlag (
          <year>2019</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>N.</given-names>
            <surname>Li</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Ofutt</surname>
          </string-name>
          ,
          <article-title>Test oracle strategies for model-based testing</article-title>
          ,
          <source>IEEE Transactions on Software Engineering</source>
          <volume>43</volume>
          (
          <year>2017</year>
          )
          <fpage>372</fpage>
          -
          <lpage>395</lpage>
          . doi:
          <volume>10</volume>
          .1109/TSE.
          <year>2016</year>
          .
          <volume>2597136</volume>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <given-names>O. L.</given-names>
            <surname>Vera-Pérez</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B.</given-names>
            <surname>Danglot</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Monperrus</surname>
          </string-name>
          ,
          <string-name>
            <surname>B. Baudry,</surname>
          </string-name>
          <article-title>Suggestions on test suite improvements with automatic infection and propagation analysis</article-title>
          ,
          <source>arXiv preprint arXiv:1909</source>
          .
          <volume>04770</volume>
          (
          <year>2019</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>L. J.</given-names>
            <surname>Morell</surname>
          </string-name>
          ,
          <article-title>A theory of fault-based testing</article-title>
          ,
          <source>IEEE Transactions on Software Engineering</source>
          <volume>16</volume>
          (
          <year>1990</year>
          )
          <fpage>844</fpage>
          -
          <lpage>857</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>R. A.</given-names>
            <surname>DeMillo</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A. J.</given-names>
            <surname>Ofutt</surname>
          </string-name>
          , et al.,
          <article-title>Constraint-based automatic test data generation</article-title>
          ,
          <source>IEEE Transactions on Software Engineering</source>
          <volume>17</volume>
          (
          <year>1991</year>
          )
          <fpage>900</fpage>
          -
          <lpage>910</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <surname>J. M. Voas</surname>
          </string-name>
          ,
          <article-title>Pie: A dynamic failure-based technique</article-title>
          ,
          <source>IEEE Transactions on software Engineering</source>
          <volume>18</volume>
          (
          <year>1992</year>
          )
          <fpage>717</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <given-names>H.</given-names>
            <surname>Wilkinson</surname>
          </string-name>
          ,
          <string-name>
            <given-names>N.</given-names>
            <surname>Chillo</surname>
          </string-name>
          , G. Brunstein, Mutation testing,
          <year>2009</year>
          .
          <article-title>European Smalltalk User Group (ESUG 09)</article-title>
          . Brest, France. http://www.esug.org/data/ESUG2009/Friday/Mutation_ Testing.pdf.
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [12]
          <string-name>
            <given-names>R.</given-names>
            <surname>Niedermayr</surname>
          </string-name>
          ,
          <string-name>
            <given-names>E.</given-names>
            <surname>Juergens</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Wagner</surname>
          </string-name>
          ,
          <article-title>Will my tests tell me if i break this code?</article-title>
          ,
          <source>in: 2016 IEEE/ACM International Workshop on Continuous Software Evolution and Delivery</source>
          (CSED), IEEE,
          <year>2016</year>
          , pp.
          <fpage>23</fpage>
          -
          <lpage>29</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          [13]
          <string-name>
            <given-names>O. L.</given-names>
            <surname>Vera-Pérez</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B.</given-names>
            <surname>Danglot</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Monperrus</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B.</given-names>
            <surname>Baudry</surname>
          </string-name>
          ,
          <article-title>A comprehensive study of pseudotested methods</article-title>
          ,
          <source>Empirical Software Engineering</source>
          <volume>24</volume>
          (
          <year>2019</year>
          )
          <fpage>1195</fpage>
          -
          <lpage>1225</lpage>
          . URL: https://doi. org/10.1007/s10664-018-9653-2. doi:
          <volume>10</volume>
          .1007/s10664-018-9653-2.
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          [14]
          <string-name>
            <given-names>M.</given-names>
            <surname>Abdi</surname>
          </string-name>
          ,
          <string-name>
            <given-names>H.</given-names>
            <surname>Rocha</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Demeyer</surname>
          </string-name>
          ,
          <article-title>Reproducible crashes: Fuzzing pharo by mutating the test methods</article-title>
          , in: International Workshop on Smalltalk Technologies,
          <string-name>
            <surname>IWST</surname>
          </string-name>
          ,
          <year>2020</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          [15]
          <string-name>
            <given-names>G.</given-names>
            <surname>Petrović</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Ivanković</surname>
          </string-name>
          ,
          <article-title>State of mutation testing at google</article-title>
          ,
          <source>in: Proceedings of the</source>
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>