<!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>Compositional ioco using model-based mocking</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Jore J. Booy</string-name>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Jeroen J.A. Keiren</string-name>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Machiel van der Bijl</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Axini</institution>
          ,
          <addr-line>Van Boshuizenstraat 12, 1083 BA, Amsterdam</addr-line>
          ,
          <country country="NL">The Netherlands</country>
        </aff>
        <aff id="aff1">
          <label>1</label>
          <institution>Eindhoven University of Technology</institution>
          ,
          <addr-line>Groene Loper 3, 5612 AE, Eindhoven</addr-line>
          ,
          <country country="NL">The Netherlands</country>
        </aff>
      </contrib-group>
      <abstract>
        <p>Model-based testing is a compelling method for the end-to-end testing of microservices. However, when testing with a large number of services, state space explosion is a common problem. It is especially a problem since input-output conformance (ioco) is not compositional. We developed a novel and theoretically grounded testing method called model-based mocking (MBM) to end-to-end test microservice systems compositionally. We tested the MBM method using the Axini Modeling platform by inserting 20 mutants into an example microservice system. In our set of inserted bugs, MBM found more than half of the bugs faster compared to other methods and was slower for none of the bugs.</p>
      </abstract>
      <kwd-group>
        <kwd>eol&gt;Mobel-based testing</kwd>
        <kwd>ioco</kwd>
        <kwd>microservices</kwd>
        <kwd>Axini Modeling Platform</kwd>
        <kwd>model-based mocking</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>1. Introduction</title>
      <p>should be amenable to MBT: one can describe the entire system by modeling the individual
services, and models can be combined to describe the entire system. However, since there is
often a large number of services, state space explosions are common.</p>
      <p>
        To avoid state space explosions, it is desired to test systems individually. However,
iocotesting is not compositional: even though individual SUTs may conform to their specification,
their parallel composition may not conform to the parallel composition of the specifications.
Some solutions have been proposed. Input-enabled specifications are for instance
compositional, and input-enabled specifications can be using
demonic completion [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ]. Alternatively,
the set of traces used in the definition of conformance can be reduced, leading to
uioco [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ].
      </p>
      <p>
        Environmental testing tests if top-level services use their components correctly according to
their STS specification [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ]. Also, if there are no ambiguous states in the parallel composition
of the model, ioco is still compositional [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ]. A similar idea, mutual acceptance, was studied in
uioco [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ].
      </p>
      <p>Contributions. In this paper, we develop a theoretical approach called model-based mocking
(MBM) for testing microservices using ioco with on-the-fly ambiguous state detection. In
particular, we show that when testing a specific microservice, the services that are used can be
replaced by a mock (generated by the model), which simulates the implementation that adheres
to the specification. In theory, this reduces communication and processing delays in the testing
process. It is not required for the specifications to be input-enabled. Rather, it is suficient to
check for (absence of) ambiguous states at runtime. We evaluate the theory by implementing
the technique in AMP, and testing 20 diferent mutants of a microservice. We show that MBM
often outperforms existing testing approaches.</p>
    </sec>
    <sec id="sec-2">
      <title>2. Preliminaries</title>
      <p>
        Input-output conformance (ioco) is a theory for MBT based on labelled transition systems
(LTSs) [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ]. In this setting, the labels are separated into input and output labels.
      </p>
      <sec id="sec-2-1">
        <title>Definition 2.1.</title>
        <p>where  is a countable, non-empty set of states;  and  are countable sets of input and output
labels, such that  =  ∪  , and  ∩  = ∅. We write  =  ∪ { }, where  /∈  is the
internal action.  ⊆  ×  ×  is the transition relation, and 0 ∈  is the initial state.</p>
        <p>An input-output labeled transition system (IOLTS) is a 5-tuple ⟨,  ,  , , 0⟩
We use the following notation. Let , ′ ∈ , 
∈  , ,  ∈  and 
→− 
′ for (, ,  ′) ∈  , →−

if →−

′ for some ′, and ↛−</p>
        <p>if ¬(→−

the transition relation to weak transitions in the standard way, that is, we write  
if ∃1, · · ·
if there is a (possibly empty) sequence of  -transitions from  to ′; we write 
 ⇒ →1−
 2 ⇒ ′ for some 1, 2. We generalize this to weak traces by writing  ==1=·..=.·=⇒ ′
,  :  = 1 =⇒1 · · ·
===−⇒1  = ′, and  ⇒ if there exists ′ such that  ⇒ ′.
⇒
 ⇒ ′</p>
        <p>′ if
∈ * . We write
 ). We generalize
input-enabled IOLTS is referred to as an input-output transition system (IOTS).</p>
      </sec>
      <sec id="sec-2-2">
        <title>Definition 2.2.</title>
        <p>An IOLTS ⟨,  ,  , , 0⟩ is input-enabled if ∀ ∈ ,  ∈  :  ⇒ . An
A state from which no output can be produced is called quiescent.</p>
      </sec>
      <sec id="sec-2-3">
        <title>Definition 2.3.</title>
        <p>quiescent if for all</p>
        <p>Let  be an IOLTS ⟨,  ,  , , 0⟩ and  ∈ * a trace of . A state  ∈  is
∈  ∪{ }, →− ̸ . We write  () if  is quiescent. We can make the observation
of quiesence explicit by extending our IOLTS. We write Δ() = ⟨,  , 
∪ { }, Δ( ), 0⟩ for
for  ∪ { }. The suspension traces of  are Straces() = { ∈ * | 0 ⇒Δ }.
this IOLTS, where Δ( ) =  ∪ {(, ,  ) |  ∈  ∧  ()}. We write →Δ and ⇒Δ when we
explictly refer to this transition relation or the corresponding weak transition relation, and use 
In the definition of ioco, we further use the following notation. The set of states in which the
system can be after executing  is denoted  after  = {′ |  ⇒Δ ′}. The outputs that are
enabled in state  are () = { ∈  |  ⇒ Δ }. We use  after  to denote 0 after  .</p>
      </sec>
      <sec id="sec-2-4">
        <title>Definition 2.4.</title>
        <p>Let  be an IOTS and  an IOLTS with input labels  and output labels  . Then
 ioco  = ∀ ∈ () : ( after  ) ⊆ ( after  ).</p>
        <p>Parallel composition (‖) is used to define how actions are ordered between two processes. Given
two IOLTS 1 and 2, then the set of actions must synchronize (i.e. happen at the same time) is
 = (1 ∩ 2 ) ∪ (1 ∩ 2 ). Then all other actions (1 ∪ 2) ∖  are interleaved.
 is the minimal set satisfying the following inference rules (where  ∈  ):</p>
      </sec>
      <sec id="sec-2-5">
        <title>Definition 2.5.</title>
        <p>1 ∩ 2 = 1 ∩ 2 = ∅. If 1 and 2 are composable, then 1 ‖ 2 = ⟨,  ,  , , 1
where  = {(1, 2) | 1 ∈ 1, 2 ∈ 2},  = (1 ∖ 2 ) ∪ (2 ∖ 1 ),  = 1 ∪ 2 , and
‖ 2⟩
For  = 1, 2 let  be IOLTS ⟨, 

,  , , ⟩. 1 and 2 are composable if
1→− 
1 ‖ 2→−</p>
        <p>1′,  /∈ 2
1′ ‖ 2
2→− 
1 ‖ 2→−</p>
        <p>2′,  /∈ 1
1 ‖ 2′
1→−</p>
        <p>1′, 2→− 
1 ‖ 2→−

2′,  ̸= 
1′ ‖ 2′
Note that, in this definition, if 1 and 2 synchronize on action ,  is an output of 1 ‖ 2.</p>
      </sec>
    </sec>
    <sec id="sec-3">
      <title>3. Compositional ioco-testing</title>
      <p>
        Modern systems are often composed of multiple components running in parallel. Ideally, we
want to be able to test the individual components, as this allows for simpler descriptions, and
alleviates the state space explosion problem, while still being able to draw conclusions about
the system as a whole. However, in general, ioco is not compositional: if implementation
1 ioco 1 and 2 ioco 2, it is not generally the case that 1 ‖ 2 ioco 1 ‖ 2 [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ].
      </p>
      <p>
        Diferent solutions have been proposed to allow for compositional testing. For instance,
when all specifications are input-enabled, ioco is compositional [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ]. Alternatively, the weaker
relation uioco can be used for compositional testing. This corresponds to first making the
specification input-enabled using demonic completion, and subsequently applying the standard
ioco-relation [
        <xref ref-type="bibr" rid="ref6 ref9">6, 9</xref>
        ]. As ioco is a stronger relation, and AMP is built on it, we instead investigate
compositionality in the setting of ioco. Daca et al. [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ] proposed a solution that avoids ambiguous
states. These are states in the parallel composition where one component wants to do an output,
but the other component is not ready to do the corresponding input.
Definition 3.1. Let 1, 2 be composable IOLTSs, and let  = ⟨,  ,  , , 0 ⟩. A pair
(1, 2) ∈ 1 × 2 is an ambiguous state if there exists a shared action  ∈ 1 ∩ 2 such that
→2−  and →1̸−  , or  ∈ 2 ∩ 1 such that →1−  and →2̸−  .
      </p>
      <p>
        For specifications without ambiguous states, ioco is compositional [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ]. However, detecting
ambiguous states requires building the parallel composition of the specifications before testing,
and if there are ambiguous states, the specifications need to be updated to remove those.
      </p>
      <p>In this paper, we do not perform direct compositional testing. Instead, we use the results
from Daca et al. to show that we can replace implementations that we do not want to test with
their specification. This is formalized using the following result.</p>
      <p>Theorem 3.2 (ioco-substitution for an ambiguous-free interaction). Let 1, 2 be IOTSs and
1, 2 be IOLTSs, with respective input and output labels (1 , 1 ) and (2 , 2 ). Let 2 be
inputenabled for labels 2 ∖ 1 and 1 ‖ 2 contain no ambiguous states.</p>
      <p>(2 ioco 2) ∧ (1 ‖ 2 ioco 1 ‖ 2) ⇒ 1 ‖ 2 ioco 1 ‖ 2
Note that this requires input-enabledness only for 2 ∖ 1 , which weakens the requirements
needed to get compositionality for ioco in general. Now 2 only needs to be input-enabled for
actions that are not part of the communication with 1. In practice, this is a useful requirement:
if we can restrict 2 such that it only describes the interface-behaviour needed to communicate
with 1, it does not have any other inputs. This is, e.g., typically the case in a client-server or
module-submodule context.</p>
    </sec>
    <sec id="sec-4">
      <title>4. Model-Based Mocking</title>
      <p>Traditionally, in MBT we test whether an implementation conforms to its specification by
generating inputs to the SUT based on the specification, and observing the outputs of the
SUT and checking these are allowed by the specification. This requires an adapter to translate
between actions in the specification and calls in the implementation.</p>
      <p>We use the results from the previous section to obtain a testing setup using model-based
mocking (MBM). The idea is efectively to replace the systems we are not testing with correct
implementations, so called mocks, that are inferred from the specifications. However, we want
to avoid manually developing the mocks. Instead, we use the specifications and existing adapters
of the mocked components to allow the testing platform to act as mock. For this, AMP listens
to the communication between the SUT and the mocked services, uses the adapter to intercept
the calls from the SUT to the mocked service, translates the call to an action in the specification
of the mocked service, generates a response based on the specification, and translates it back
to a call that can be forwarded to the SUT. The approach is sketched in Figure 1b. This way,
assuming the services that the SUT depends on are correct, MBM allows us to isolate the SUT,
and focus the testing efort on it.</p>
      <p>Note that our theory requires that 1 ‖ 2 does not contain ambiguous states. In our
implementation, we handle this during testing. In practice, 1 will not wait for 2 to be ready
to receive the message. If 2 receives an unexpected message, this is reported to the testing
platform, and the test fails: either 2 is incomplete or we have detected a bug in the SUT.
(a)
(b)</p>
      <p>The existing approach to isolated SUT testing in AMP is shown in Figure 1a. The tester
considers transitions in the specification of the SUT. If the tester triggers an an input in some
service, AMP sends the corresponding action label to an adapter, that translates it into either an
HTTP or AMQP message for the relevant component. Messages that are received in return,
such as an HTTP response, are received, and translated by the adapter into an action in the
specification. The tester than takes the corresponding transition in the specification. If the
response does not match the specification, the test fails, otherwise testing can continue. Internal
communication is not listened to or interacted with.</p>
      <p>MBM allows for a diferent setup shown in Figure 1b. The services that are used by the
SUT are modelled in AMP. Calls that are made to these services from SUT are intercepted, and
the existing adapter is used to translate messages into actions. These actions are matched to
the specification of the service, and an appropriate response is selected based on the service
specification. The response is again translated into a message using the adapter, and sent back
to the SUT. When a synchronizing transition happens between a mocked service and the SUT,
the transition is handled as if it is a external transition from the perspective of the SUT. Internal
transitions between mocked services are considered hidden if the original transition was hidden,
otherwise it is a regular mocked output. We do not require a priori checking of ambiguous
states. Instead, ambiguous states between the SUT and the mock can be detected at runtime.</p>
    </sec>
    <sec id="sec-5">
      <title>5. Experimental Evaluation</title>
      <p>To study the efect of mocking on testing performance, we compare three testing methods. In
naive parallel composition we first compute the parallel composition of all specifications, and
use this specification to test all implementations together. To fully compare the testing methods,
the specification for this method is precomputed, and added to AMP. Simultaneous testing is
AMP’s default testing approach. Here all implementations are tested together, however, the
parallel composition of the specifications is not precomputed. Instead, the current state of all
the specifications is tracked on-the-fly. This should have the same testing efectiveness as naive
composition. Model-based mocking is our new approach. It tests a single service; the remaining
services are mocked.</p>
      <p>
        As system under test (SUT) we use the eShopOnContainers project3. This is an open source
web shop built using .NET microservices. We model four services of the project: the basket
service, the catalog service, the ordering service and the payment service. When a user checks
out in the web shop, all services will be part of the processing of the checkout. The specification
model was derived from van den Brink’s model [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ] and the .NET implementation.
      </p>
      <p>
        The basket API is the service the end user interacts with the most. The user triggers the
checkout from it, after which the rest of the services interact to finish the checkout. The basket
API is the service we want to test. For MBM, we mock all services, except the basket. To
compare the diferent testing methods, we consider 20 diferent mutants of the basket service,
and compare the time it takes for each testing method to find the bug in the mutant. The mutants
are those originally generated by van den Brink [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ]. These mutants for instance change an
equals sign to a not equals sign, or return a diferent status code. For naive parallel composition,
the measured time does not include the time needed to build the composition.
      </p>
      <p>All tests have been run on a HP ZBook Studio G4 laptop with Intel Core i7-7700HQ CPU,
16GB of RAM and an NVIDIA Quadro M1200. All implementations of services were run on this
same machine. To introduce latency, we use the tc tool to simulate a fixed round-trip latency
of 100ms. We used a timeout of 500 steps. Each of the test runs is repeated 10 times.</p>
      <sec id="sec-5-1">
        <title>5.1. Results</title>
        <p>
          Each of the testing approaches was able to find 19 out of 20 mutants. Mutant 11 was not detected
by any of the approaches. This is consistent with the findings from [
          <xref ref-type="bibr" rid="ref5">5</xref>
          ]. Closer inspection of
the implementation shows that the mutant is likely to be unreachable. We therefore do not
consider it further in the results, and we only report on 19 mutants.
        </p>
        <p>The models we use are complex, and we cannot assume a particular distribution of the data.
Also, the data for diferent experiments are not independent. To statistically compare the testing
methods, we therefore used the Kolmogorov-Smirnov test. The test compares the cumulative
distribution function (cdf) of two distributions to see if one is significantly bigger or smaller at
diferent points in the distribution. The cdf of our tests is calculated using the percentage of
tests that has completed at a specific time, for instance after 30 seconds. If the cdf is significantly
greater at any point in time than the other cdf, the testing method is a faster testing method.</p>
        <p>The results are summarized in Table 1. The table shows in how many instances the test on the
left was significantly faster than the test on the right, for  &lt; 0.05 and  &lt; 0.10. For example,
the last row in the table shows that mocking was significantly faster than simultaneous testing
in 6 out of 19 cases ( &lt; 0.05), or 8 out of 19 cases (when  &lt; 0.10). The last column shows
that mocking was never significantly slower than parallel or simultaneous testing.</p>
        <p>If we look at the diferences between the methods for individual mutants, we observe that
the tests using mocking often has fewer extreme outliers in the test. This can for instance
be seen in the results for mutant 1 in Figure 2a. For mutant 13, whose detection requires
interaction with the mocked services, mocking is significantly faster than simultaneous testing
(both  = 1.082 × 10− 4), see Figure 2b.</p>
        <p>3https://github.com/dotnet-architecture/eShopOnContainers</p>
      </sec>
      <sec id="sec-5-2">
        <title>5.2. Discussion</title>
        <p>(b) Mutant 13
From the results we observe that mocking is significantly faster than naive parallel testing most
of the time, and it is significantly faster than simultaneous testing in about one third of the
cases. Simultaneous testing is sometimes faster than naive parallel composition.</p>
        <p>We have two reasons to think simultaneous testing was sometimes faster than naive parallel
composition. First, higher memory consumption required by explicitly building the parallel
composition can cause a performance decrease during testing. This is because garbage collection
has to occur more often for the .NET applications, interrupting the regular flow of the program.
Second, testing using parallel composition might require visiting diferent interleavings that
represent equivalent paths. Simultaneous testing does not visit these diferent interleavings.</p>
        <p>Regarding mocking, we should note that the mutants were not chosen specifically to require
that they are on a path that includes mocked services. In fact, only mutant 13 requires interacting
with mocked services to find the bug. Our results show that in particular in case of mutant 13,
mocking is much faster than simultaneous testing. We expect that this is mainly due to lower
communication and processing delays in the mock compared to the original simulation. We
expect a similar performance improvement for other test cases that require mocked services.</p>
        <p>All mutants except mutant 13 can be detected by the model following only transitions from
the basket service. However, even in those cases, mocking is often faster. We expect that this
is again due to the mocked services having lower communication delays. Even though the
services are not critical in finding the bug, during testing they might still be used.
We have developed model-based mocking (MBM). This is a strategy to test microservice
architectures in AMP using on ioco-testing. We show that if the parallel composition of a mock
and implementation does not have ambiguous states, the implementations of services can be
replaced by a mock based on their specification. The approach was implemented in AMP. Our
experiments show that MBM can speed up ioco-testing when targeting individual services,
even in cases where the bug could be detected without making use of the mocked services. Thus,
MBM provides a faster way to test individual components, guaranteeing that the composition
is conformant given that its components are.</p>
        <p>
          For future work, we want to test mocking on additional SUTs to see if our results generalize
to diferent systems. As a consequence of the limitations of composability on input labels of
parallel components, our approach does not allow for broadcast messaging. Alternative notions
of composability, allowing for the same input labels, and mutual acceptance were defined in the
setting for uioco [
          <xref ref-type="bibr" rid="ref9">9</xref>
          ]. It would be interesting to see if our approach also works in that context.
        </p>
      </sec>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>J.</given-names>
            <surname>Tretmans</surname>
          </string-name>
          ,
          <article-title>Test generation with inputs, outputs, and quiescence, in: Tools and Algorithms for the Construction and Analysis of Systems</article-title>
          , volume
          <volume>1055</volume>
          , Springer, Berlin, Heidelberg,
          <year>1996</year>
          , pp.
          <fpage>127</fpage>
          -
          <lpage>146</lpage>
          . doi:
          <volume>10</volume>
          .1007/3-540-61042-1_
          <fpage>42</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>A.</given-names>
            <surname>Belinfante</surname>
          </string-name>
          , JTorX: Exploring
          <string-name>
            <surname>Model-Based Testing</surname>
          </string-name>
          (
          <year>2014</year>
          ).
          <source>doi:10.3990/1</source>
          . 9789036537070.
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>T.</given-names>
            <surname>Bachmann</surname>
          </string-name>
          , D. van der Wal, M. van der Bijl, D. van der Meij, A. Oprescu,
          <article-title>Translating EULYNX SysML Models into Symbolic Transition Systems for Model-Based Testing of Railway Signaling Systems</article-title>
          , in:
          <source>2022 IEEE Conference on Software Testing, Verification and Validation (ICST)</source>
          ,
          <year>2022</year>
          , pp.
          <fpage>355</fpage>
          -
          <lpage>364</lpage>
          . doi:
          <volume>10</volume>
          .1109/ICST53961.
          <year>2022</year>
          .
          <volume>00044</volume>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <given-names>X. M. van Dommelen</given-names>
            ,
            <surname>M. van der Bijl</surname>
          </string-name>
          , A. Pimentel,
          <article-title>Model-Based Testing of Internet of Things Protocols, in: Formal Methods for Industrial Critical Systems</article-title>
          , LNCS, Springer International Publishing, Cham,
          <year>2022</year>
          , pp.
          <fpage>172</fpage>
          -
          <lpage>189</lpage>
          . doi:
          <volume>10</volume>
          .1007/978-3-
          <fpage>031</fpage>
          -15008-1_
          <fpage>12</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <surname>B. van den Brink</surname>
          </string-name>
          ,
          <article-title>Towards Model-Based Testing for Microservices, Master's thesis</article-title>
          , University of Amsterdam,
          <year>2023</year>
          . URL: https://scripties.uba.uva.nl/search?id=record_
          <fpage>53331</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <surname>H. M. van der Bijl</surname>
          </string-name>
          ,
          <source>On Changing Models in Model-Based Testing, Ph.D. thesis</source>
          , University of Twente, Enschede, The Netherlands,
          <year>2011</year>
          . doi:
          <volume>10</volume>
          .3990/1.9789036531955.
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <given-names>L.</given-names>
            <surname>Frantzen</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Tretmans</surname>
          </string-name>
          ,
          <article-title>Model-based testing of environmental conformance of components, in: Formal Methods for Components and Objects</article-title>
          , volume
          <volume>4709</volume>
          , Springer, Berlin, Heidelberg,
          <year>2007</year>
          , pp.
          <fpage>1</fpage>
          -
          <lpage>25</lpage>
          . doi:
          <volume>10</volume>
          .1007/978-3-
          <fpage>540</fpage>
          -74792-
          <issue>5</issue>
          _
          <fpage>1</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>P.</given-names>
            <surname>Daca</surname>
          </string-name>
          ,
          <string-name>
            <given-names>T. A.</given-names>
            <surname>Henzinger</surname>
          </string-name>
          ,
          <string-name>
            <given-names>W.</given-names>
            <surname>Krenn</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Nickovic</surname>
          </string-name>
          ,
          <article-title>Compositional specifications for ioco testing</article-title>
          ,
          <source>in: 2014 IEEE Seventh International Conference on Software Testing, Verification and Validation</source>
          , IEEE, USA,
          <year>2014</year>
          , pp.
          <fpage>373</fpage>
          -
          <lpage>382</lpage>
          . doi:
          <volume>10</volume>
          .1109/ICST.
          <year>2014</year>
          .
          <volume>50</volume>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <surname>G. van Cuyck</surname>
          </string-name>
          ,
          <string-name>
            <surname>L. van Arragon</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Tretmans</surname>
          </string-name>
          ,
          <article-title>Compositionality in Model-Based Testing</article-title>
          ,
          <source>in: Testing Software and Systems</source>
          , LNCS, Springer, Cham,
          <year>2023</year>
          , pp.
          <fpage>202</fpage>
          -
          <lpage>218</lpage>
          . doi:
          <volume>10</volume>
          .1007/ 978-3-
          <fpage>031</fpage>
          -43240-8_
          <fpage>13</fpage>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>