=Paper=
{{Paper
|id=None
|storemode=property
|title=Building Test Harness From Service-based Component Models
|pdfUrl=https://ceur-ws.org/Vol-1069/04-paper.pdf
|volume=Vol-1069
|dblpUrl=https://dblp.org/rec/conf/models/AndreMA13
}}
==Building Test Harness From Service-based Component Models==
Building Test Harness from Service-based Component Models Pascal André, Jean-Marie Mottu, and Gilles Ardourel LUNAM Université - LINA CNRS UMR 6241 - University of Nantes 2, rue de la Houssinière, F-44322 Nantes Cedex, France firstname.lastname@univ-nantes.fr Abstract. In model-driven development, the correctness of models is essential. Testing as soon as possible reduces the cost of the verification and validation process. Considering separately PIM and PSM reduces the test complexity and helps the evolution of the system model. In order to test models before their final implementation, we propose an approach to guide the tester through the process of designing tests at the model level. We target model testing for Service-based Component Models. The approach produces test harness and provides information on how to bind the services of the components under test and how to insert the relevant data. The tests are then executed by plunging the harness into a technical platform, only dedicated to running the tests. Keywords: Test Harness, Model Conformance, Test Tool, MDD 1 Introduction Testing as early as possible reduces the cost of Verification and Validation (V&V) [1]. In Model-Driven Development (MDD), V&V is improved by directly testing models for correctness [2]. Testing models helps to focus the effort on the early detection of platform independent errors, which are costly when detected too late. Testing models does not consider implementation specific errors and thus reduces the complexity of testing [3]. Designing the tests on models ease their adaptation when models are refactored. However, building and running tests on models remain a challenge. We target service-based component models with behaviour, including data and communications. The specification detail level is sufficient enough to enable various kinds of test at the model level. While testing such software components, the encapsulation should be preserved. Therefore, finding where and how pro- viding test data is difficult: variables are accessed through services, which are available from the interface of the component but also from other required ser- vices. Designing the test fixture of a service implies a sequence of service calls additionally to the component initialisation. In [4], Gross mentioned issues in Component-Based Software (CBS) testing: testing in a new context (i.e. devel- opment context one, deployment context ones), lack of access to the internal Proceedings of MoDeVVa 2013 11 Building Test Harness from Service-based Component Models working of a component. Ghosh et al. [5]. also identify several problems: the selection of subsets of components to be tested and the creation of testing com- ponents sequences. Our work is concerned with these issues. We consider the building of test harness for unit and integration testing ded- icated to Service-based Component Systems. Test harnesses are used to provide test data, to run the test, to get the verdict (fail or pass). We create test harness from the platform independent model (PIM) of the system under test (SUT) and from test intentions. Those intentions declare which services are tested in which context, with which data. The tester incrementally builds a harness to run the test in an appropriate context, especially without breaking the encapsulation. The tester needs assistance for this task. In this paper, we propose an approach assisting the test of service-based component models. This approach integrates the tests at the model level and is provided with tools. First, we propose operating at the model level, we modelise the tests at the same abstraction level as the component model. We build test harnesses as component systems made of Components Under Test (CUT) and Test Components (TC), which are created to test. As a consequence, the assem- bly of test components and regular components can benefit from the develop- ment tools associated with the component model. Additionally, test components could be transformed into platform specific models, thus capitalising the early testing effort. Second, we propose a guided process to assist the tester to man- age the complexity of the component under test. The test harness is obtained from transformations of the SUT, guided by the test intention, enriched by test components, and assisted by several analyses and heuristics proposing relevant information and ensuring model correctness through verifications. Third, we il- lustrate the approach on a motivating example, a platoon of vehicles. We have developed a set of prototype tools designed to experiment the proposals. It is implemented in COSTO, the tool support of the Kmelia component model [6]. 2 Testing Service-based Component Model This section introduces the testing of service-based component model and the challenges to be tackled. It describes our approach on a motivating example. 2.1 Service-based Component Model A component system is an assembly of components which services are bound by assembly links. The interface of a component defines its provided and required services. The interface of a service defines a contract to be satisfied when calling it. The service may communicate, and the assembly links denote communication channels. The set of all the services needed by a service is called its service dependency. The required services can then be bound to provided services. These needs are either satisfied internally by other services of the same component, or specified as required services in the component’s interface and satisfied by other components. A composite component encapsulates an assembly. Proceedings of MoDeVVa 2013 12 Building Test Harness from Service-based Component Models Fig. 1. Component and service notation In the example of Figure 1, the component c: Client requires a service pro- vided by the component s : Server, through an assembly link. This assembly is illustrated with the SCA notation [7]. We extended the SCA notation (right part of the legend of Figure 1) to make explicit the dependencies and data use- ful for testing: (i) typed data define the component state, (ii) services access these variables, (iii) provided services internally depends on required services. Figure 2 represents a motivating example: a simplified platoon of several ve- hicles. Each vehicle computes its own state (speed and position ) by considering its current state, its predecessor’s state, and also a safety distance between vehi- cles. Each vehicle is a component providing its speed and position and requiring predecessor’s speed and position. Three vehicles are assembled in that example. Each vehicle provides a configuration service conf initiating its state, a service run launching the platoon and requiring the service computeSpeed to calculate new position and speed. The leader is another component controlling its own values according to a position goal. The Figure 2 represents completely only the dependencies of computeSpeed, the service under test later. 2.2 Testing Components at the Modelling Stage Conformance testing aims to control that system under test behave correctly according to their specification. With Service-based Components, we test that the behaviour conforms to the specification of their interfaces. In the context of Fig. 2. Example of a component model of the Platoon system Proceedings of MoDeVVa 2013 13 Building Test Harness from Service-based Component Models Service-Based Component Applications, the test harness is designed by selecting the components under test, replacing their servers and their clients (the first with mocks, the last with test drivers), then providing test data to the test drivers and getting their verdicts [8]. Test harness should preserve component encapsulation. JUnit classes are an example of test harnesses for Java OO programs. In MDD, Service-based Component System is modelised with a PIM, and part of its components (the SUT) is tested depending on a test intention. The test intention defines for each test which part of the system is tested (component(s)), with which entry points (service(s)), in which situation (SUT state), with which request (service call with parameters), expecting which results. At the beginning, the test intention is tester’s knowledge, then she has to concretely prepare and run the test to get a verdict from oracles. Testing such a SUT is not just creating test data and oracles, the difficulty is to consider components in an appropriate context (assembly of components), to run the test data on them, get the output to be checked with the oracles. The building of test harness to fulfil this task is an important work. Moreover, the process of creating a test harness is not trivial for models of components. We consider several characteristics making the test of component models an original process: (i) Early specifications are often too abstract or incomplete to be executable. In order to test service-based component, we have to execute it in a consistent environment: its dependencies have to be satisfied by compatible services and every operation used in the environment has to be concrete enough or bound to a concrete operation. Furthermore, its environment must be able to run test cases. (ii) In strongly encapsulated components, finding where and how to insert data is challenging: variables are usually only accessible through services and some data are required from external services. (iii) At the model level, tests should be designed as models. Describing test artefacts like mocks and drivers in the component modelling language provides several benefits: it is easy to communicate with designers; tests follow the same validity rules as the model for both consistency and execution, allowing the use of the development tools associated with the component model. (iv) Models are subject to frequent refactoring or even evolutions, which can compromise the applicability of existing tests. In this work, we are concerned with the building of test harness for service- based component models. The tester chooses the components and their services she tests (defined with the test intention). She orders the tests. She creates the test data based on existing works considering the specification of component: work of [9] with state machines, work of [10] performing LTS behaviours testing, etc. She creates oracles, for instance, based on the contracts usually available defining a service interface. Our approach assists the tester in building the test harness allowing her to run such test data and to apply such oracles. Proceedings of MoDeVVa 2013 14 Building Test Harness from Service-based Component Models Operational Framework Data sources (PDM) Test Verdict SUT Model execution (PIM) Mappings and Code Harness transformations Test Harness + SUT Construction (TSM) Test Intention test (TI) Fig. 3. Testing process overview 3 Assisting the test harness building The construction process takes as input the System Under Test (SUT) model which is a PIM (Platform Independent Model) and a test intention (Figure 3). It is made of three activities (transformations). The first one builds the test harness as an assembly with the SUT in a Test Specific Model (TSM) at the model level. The second composes the harness with a Platform Description Model (PDM) to get an executable model (code). During the execution, the concrete data providers give the test data needed to run the test, and the concrete assert functions return the verdicts. Designing the oracles and the data sets influences the operational level. This point is out of concern in the rest of the paper. 3.1 Test Harness Construction This section explains how the tester is guided to build a consistent test harness. As noted in [5] (and filed under the issue C3), it is sometimes necessary to consider different subsets of the architecture when testing a component, because of the influence (e.g. race conditions) of the other components on the SUT. The test harness is designed by (i) selecting the relevant subset of original components and services to test, (ii) replacing all or parts of their clients (resp. servers) by test drivers (resp. mocks), (iii) providing data sources. The test intention serves as a guideline during the construction process. As an example, we are intent on testing the conformance of the computeSpeed ( safeDistance : Integer ) : Integer service of the mid component with the following safety property: the distance between two neighbour vehicles is greater than a value safeDistance. The service behaviour depends on (a) the recommended safe distance from the predecessor, (b) the position and speed of the vehicle itself and of its predecessor. Coming back to the example of Figure 2, testing the computeSpeed service of mid implies to give a value to the safeDistance param- eter, to initialise the values of the pos and speed variables, which are used by the computeSpeed service and to find providers for pilotspeed et pilotpos which are required by computeSpeed. Only one component vehicle is under test here because other ones are not necessary to test the computeSpeed service, but a more complex architecture could have been retained. The challenge for the tester is to manage the way these data can be provided. They can be provided by the test driver, by the configuration step, or by other components (original components or mock components). Finding the service to Proceedings of MoDeVVa 2013 15 Building Test Harness from Service-based Component Models be invoked in order to set the component in an acceptable state for the test is not trivial. Our goal is to help the tester to manage this complexity, in order to reduce testing effort. At this stage, assisting the harness building consists in: 1. Detecting missing features between the SUT and the test intention. This detection is achieved by the verification of two properties: (a) Correctness. All the service dependencies are satisfied in the scope of the test harness. No pending or incompatible dependencies remain. (b) Testability. All the formal test data are linked to values in the TSM (variables, parameters, results...). 2. Proposing candidates for the missing features: which service can configure data, can handle the test data or can fulfil missing required services? 3. Generating and linking test components (mocks, drivers as mirror services, bindings, abstract functions...). In the TSM of Figure 4, the vtd test driver is responsible to put the compute Speed service in an adequate context (providing input data and oracle). The ser- vice testcase1 of vtd contains only a computeSpeed call and an oracle evaluation. To fix the computeSpeed requirements, the test designer could (1) ask for mock components (with random values), (2) reuse the first component coming from the SUT (and fulfil the requirements of first ...) or (3) design its own mock. This variability enables several kinds of test and answers to the issue C3 of Ghosh et al. [5]. Note that a double integer mock component im1 is used here because it offers a better control of the delivered speed (intdata1) and position (intdata2), but a harness with two independent integer mocks providing a single intdata service would also be possible. The data of computeSpeed test harness are bound in the following way: (a) the safeDistance parameter is assigned in the call sequence of the test driver, (b) the position and speed (pos and speed variables) of the mid vehicle under test are bound to the conf service of mid, (c) the im1 mock component playing the role of the predecessor is configured to return the position and speed of the predecessor. 3.2 Mappings and Transformations According to the MDD principles, the test will be executed by composing the test harness with the PDM (Figure 3). The test data and test primitives (oracle...) Fig. 4. A TSM : test harness for the mid component’s service computeSpeed (SUT) Proceedings of MoDeVVa 2013 16 Building Test Harness from Service-based Component Models Fig. 5. Test harness Concrete data and Function Mapping are provided by the PDM test support or implemented by the tester. The PIM may include primitive types and functions (numbers, strings, I/O...) that must also be mapped to the code level. These mappings are predefined in standard libraries or user-defined. High-level TSM primitives are connected to low level functions (PDM, code), as illustrated by Figure 5. If the mapping is complete and consistent, then the model is executable. The goal of the Mappings and Transformations activity (Figure 3) is to fix this composition. Each service involved in the test must be executable in a con- sistent environment: its dependencies must be satisfied by compatible services, and every operation used in the environment must be sufficiently concrete or related to a specific operation. Every abstract type should be mapped to a con- crete type. At this stage, assisting the harness building consists in (1) detecting missing mappings between the TSM and PDM (Executability), (2) proposing tracks for the missing mappings based on signatures, pre/post conditions... (all the primitive types and functions are mapped to concrete ones, the test data inputs have concrete entry points), (3) generating standard primitive fragments (idle functions, random functions...). The mappings are stored in libraries in or- der to be reused later and the entries can be duplicated to several PDM. This activity induces an additional cost at model level, but the errors detected are less expensive to solve than those of components and services. Moreover, if the component model is implemented several times targeting several PDM, the tests would be reused and part of the behaviour would have been checked before runtime, as proposed here. 4 Experimentation The test process of Figure 3 has been instrumented using the COSTO/Kmelia tool1 . Kmelia is a wide-spectrum language dedicated to the development of cor- rect components and services [6]. Kmelia includes an abstract language for com- 1 http://www.lina.sciences.univ-nantes.fr/aelos/projects/kmelia/ Proceedings of MoDeVVa 2013 17 Building Test Harness from Service-based Component Models putations, instead of links to the source code as in related languages like SCA, Sofa2, Fractal or SystemC. This layer is useful to check models before trans- forming them to PSM. Kmelia is supported by the COSTO tool, a set of Eclipse plugins including an editor, a type checker and several analysis tools. The test harness construction has been experimented on the platoon exam- ple. The goal was to build a harness to test the conformance of the service computeSpeed as introduced in Section 3. – The test intention is a special Kmelia component, where only the name and description are mandatory. This trick enables to reuse the tool facilities and to consider test design at the model level. TEST_INTENTION P l a t o o n T e s t I n t e n t i o n DESCRIPTION " t h e v e h i c l e w i l l s t o p i f i t i s t o o c l o s e t o t h e p r e v i o u s one " INPUT VARIABLES pos , p r e v i o u s _ p o s , m i n d i s t a n c e : I n t e g e r ; OUTPUT VARIABLES speed : I n t e g e r ORACLE s p e e d=0 – The input data are provided and output data are collected in text files. – During the process, the building tool (1) starts from a test intention, (2) asks the user to select target system and services (or proposes some if the test intention is detailed), (3) displays the board to match the test intention with the SUT (Figure 6), (4) proposes candidates by looking to variable types, (5) checks the correction and testability properties, (6) goes back to step (2) until the TSM is complete, (7) checks the executability properties and proposes candidates (from the libraries) for the missing elements, (8) generates the code. Fig. 6. Test harness assignments: mapping the test intention to the SUT Proceedings of MoDeVVa 2013 18 Building Test Harness from Service-based Component Models A web-appendix2 shows the details of this example. The harness building activities (transformations, decisions, assistance and generation) are implemented and integrated as COSTO functionalities. We de- veloped the PDM framework in Java (7 packages, 50 classes, 540 methods and 3400 LOC). The service instanciation uses Java threads with an ad-hoc com- munication layer based on buffered synchronous channels (monitors). We keep strong traceability links from the code level to the PIM level for a better feed- back on errors and also for animating the specification at the right level (GUI). We add specific support for contract checking (assertions and oracles). Compared with the Junit practice, the tester could focus on the "business" part and did not need to care with Java details of the implementation. While the specification of the components was available, the tester could not modify them to make the test case more easy to write. She discovers the specification elements on-the-fly when mapping them to the test intention. 5 Related Work There are several works interested in generating tests for testing components. In [11], Mariani et al. propose an approach for implementing self-testing com- ponents. They move testing of component from development to deployment time. In [12], Heineman applies Test Driven Development to component-based soft- ware engineering. The component dependencies are managed with mocks, and tests are run once components can be deployed. In contrary, in our proposal we propose to test the components at the modelling phase, before implementation. In [13], Edwards outlines a strategy for automated black-box testing of soft- ware components. Components are considered in terms of object-oriented classes, whereas we consider component as entity providing and requiring services. In [14], Zhang introduces test-driven modeling to apply the XP test-driven paradigm to an MDD process. Their approach designs test before modelling when we design test after modelling. In [9], the authors target robustness testing of components using rCOS. Their CUT approach involves functional contracts and a dynamic contract. However, these approaches apply the tests on the target platform when we design them at the model level and apply them on simulation code. 6 Conclusion In this paper, we described a method to integrate testing early in an MDD process, by designing test artefacts as models. The test designer is assisted in building component test harnesses from the component model under test and test abstract information through a guided process. The COSTO/Kmelia framework enabled to implement the process activities and to run the tests on the target specific execution platform with a feedback at the model level. The approach 2 http://www.lina.sciences.univ-nantes.fr/aelos/download/ModeVVa_app.pdf Proceedings of MoDeVVa 2013 19 Building Test Harness from Service-based Component Models can be ported to any modelling languages supporting rich behavior modelling such as Sofa, rCOS or AADL. The benefits are a shorter test engineering process with early feedback and the tests are reified to be run again. In future work, we will study different kinds of oracle contracts in order to find which logics are best fitted to express them in a testable way as well as ensuring a good traceability of the verdict. References 1. G. Shanks, E. Tansley, and R. Weber, “Using ontology to validate conceptual models,” Commun. ACM, vol. 46, no. 10, pp. 85–89, Oct. 2003. 2. M. Gogolla, J. Bohling, and M. Richters, “Validating uml and ocl models in use by automatic snapshot generation,” Software and Systems Modeling, vol. 4, no. 4, pp. 386–398, 2005. 3. M. Born, I. Schieferdecker, H.-g. Gross, and P. Santos, “Model-driven development and testing - a case study,” in First European Workshop on MDA with Emphasis on Industrial Application. Twente Univ., 2004, pp. 97–104. 4. H.-G. Gross, Component-based Software Testing With Uml. SpringerVerlag, 2004. 5. S. Ghosh and A. P. Mathur, “Issues in testing distributed component-based systems,” in In First International ICSE Workshop on Testing Distributed Component-Based Systems, 1999. 6. P. André, G. Ardourel, C. Attiogbé, and A. Lanoix, “Using assertions to enhance the correctness of kmelia components and their assemblies,” ENTCS, vol. 263, pp. 5 – 30, 2010, proceedings of FACS 2009. 7. OSOA, “Service component architecture (sca): Sca assembly model v1.00 specifi- cations,” Open SOA Collaboration, Specification Version 1.0, March 2007. 8. C. R. Rocha and E. Martins, “A method for model based test harness generation for component testing,” J. Braz. Comp. Soc., vol. 14, no. 1, pp. 7–23, 2008. 9. B. Lei, Z. Liu, C. Morisset, and X. Li, “State based robustness testing for compo- nents,” Electr. Notes Theor. Comput. Sci., vol. 260, pp. 173–188, 2010. 10. B. Schätz and C. Pfaller, “Integrating component tests to system tests,” Electr. Notes Theor. Comput. Sci., vol. 260, pp. 225–241, 2010. 11. L. Mariani, M. Pezzè, and D. Willmor, “Generation of integration tests for self- testing components,” in FORTE Workshops, ser. LNCS, vol. 3236. Springer, 2004, pp. 337–350. 12. G. Heineman, “Unit testing of software components with inter-component depen- dencies,” in Component-Based Software Engineering, ser. LNCS. Springer Berlin / Heidelberg, 2009, vol. 5582, pp. 262–273. 13. S. H. Edwards, “A framework for practical, automated black-box testing of component-based software,” Softw. Test., Verif. Reliab., vol. 11, no. 2, pp. 97–111, 2001. 14. Y. Zhang, “Test-driven modeling for model-driven development,” IEEE Software, vol. 21, no. 5, pp. 80–86, 2004. Proceedings of MoDeVVa 2013 20