Test d’intégration pour des systèmes à objets

Slides:



Advertisements
Présentations similaires
EPITECH 2009 UML EPITECH 2009
Advertisements

Applications N-Tiers Rappels: architecture et méthodologie
Soutenance du stage de DEA.
Analyse et Programmation Orientées Objets
Test dintégration pour des systèmes à objets Yves Le Traon
Relational Learning as a Search in a Critical Region Lou Fedon 9 Mars 2006.
Efficient Simplification of Point-Sampled Surfaces
UML - Présentation.
Application de réseaux bayésiens à la détection de fumées polluantes
Equipe optimisation TempoSoft
Les démarches de développement
Les démarches de développement
Tests et Validation du logiciel
Tests et Validation du logiciel
Rational Unified Process (RUP)
Plus rapide chemin bicritère : un problème d’aménagement du territoire
Alain Le Guennec Jean-Marc Jézéquel Action Triskell
PARTIE 3 : Le SYSTEME D’INFORMATION FUTUR
MIAGE MASTER 1 Cours de gestion de projet
le profil UML en temps réel MARTE
Heuristiques A. Introduction B. Recherche d ’une branche
Introduction à la conception de Bases de Données Relationnelles
Modèle, Méthode et Conception
Techniques de test Boulanger Jean-Louis.
OIL & UPML DREVET - HUMBERT Introduction OIL : un langage de description dontologies UPML : un langage de description de systèmes à base.
Universté de la Manouba
Recherche Opérationnelle
Projet de Master première année 2007 / 2008
GPA750 – Gestion de Projets
Processus d'un projet F.Pfister
Apérisentation Sur les graphes évolutifs Mardi 22 novembre 16h30.
 Yves Le Traon Plan 1.Problématique du test 2.Rappels test de logiciel 3.Test de composants unitaires OO 4.Test d'intégration 5.Test système 6.Diagnostic.
Institut Supérieur des Sciences Appliquées et de Technologie Sousse
GENIE LOGICIEL
Optimisation de requêtes
Calcul parallèle => partitionner les données en sous-groupes associés aux processeurs. P0 P2 P1.
Un outil d’estimation du temps d’exécution au pire-cas par analyse statique de programmes IRISA - Projet Solidor Antoine COLIN.
1 Emeric ROLLIN 1 Génie Logiciel GENIE LOGICIEL
Le contenu est basé aux transparents du 7 ème édition de «Software Engineering» de Ian Sommerville«Software Engineering» de Ian Sommerville B.Shishedjiev.
UML : un peu d’histoire H. Lounis.
Algorithmes Branch & Bound
© Petko ValtchevUniversité de Montréal Février IFT 2251 Génie Logiciel Conception Hiver 2002 Petko Valtchev.
« Validation Formelle de Systèmes Interactifs »
Introduction au Génie Logiciel
Dyalog.Net Peter Donnelly Managing Director Dyadic Systems Toronto 30/10/2002.
Modèles Mathématiques et représentation discrètes pour la description des images couleur Luc Brun.
ESTIMATION / CHIFFRAGE
VALIDATION VÉRIFICATION & TESTS
Calcul CMS: bilan 2008 C. Charlot / LLR LCG-DIR mars 2009.
IFT 232 Méthodes de Conception Orientées Objets Introduction.
Mustapha Hamidou Vendredi 20 août Stage Contour Matching.
Olivier Leclair, Université Laval Un algorithme de fouille dans une représentation des données par objets: une application médicale SIMON, Arnaud.
Introduction Définir Planning. L’agent Planning. Représentation pour l’agent planning. Idées derrieres l’agent planning.
1 Méthode de “Fast Marching” générique pour “Shape From Shading” E. Prados & S. Soatto RFIA 2006 janvier 2006, Tours.
Année 2006 – 2007 ENSEA © Emeric Rollin
1 Vers la gestion de la cohérence dans les processus multi-modèles métier Wolfgang THEURER Ecole Nationale Supérieure d’Ingénieurs des Etudes et Techniques.
Optimisation pour la Conception de Systèmes Embarqués
Soutenance de Stage DEA / DESS
Les démarches de développement
Réalisé avec le soutien de Pied de page fixe Pied de page 1 Titre Sous titre.
21/02/2003DEA DISIC 1 Grid Computing Programming the grid: Distributed Software Components, P2P and Grid Web Services for Scientific Applications Tarak.
2 Tracks Unified Process
Développement d’un système-Expert. Les bonnes raisons Conserver l’expertise dans l’entreprise roulement vulnérabilité rareté Formation de personnel qualifié.
Les concepts d’UML - Le Processus Unifié -
1 JEE 2010 Architectures n-tiers F.Pfister
Document de spécification d’exigences Normes IEEE et 29148:2011
A propos du “Minimal Controllability Problem” C. Commault Département Automatique Gipsa-Lab Grenoble –FRANCE 1 Séminaire GIPSA-Lab 22 octobre 2015.
Dániel Darvas (CERN BE-ICS-PCS) Spécification formelle pour les API CERN-ESTEREL séminaire 21/01/2016, CERN Travail conjoint avec B. Fernández, E. Blanco,
PRÉSENTATION AGL LES TESTS LOGICIELS LES TEST LOGICIELS 1 Mickael BETTINELLI Brandon OZIOL Gaétan PHILIPPE Simon LUAIRE.
Transcription de la présentation:

Test d’intégration pour des systèmes à objets Yves Le Traon yletraon@irisa.fr et Vũ Lê Hạnh

Contexte Réalisation d’une « bonne » stratégie : pour planifier l’intégration des systèmes à objets, le plus tôt possible dans le cycle de vie, en minimisant le coût du test. De quoi s’agit-il mon travail ?

Plan Introduction Intégration pour des systèmes à objets Notre solution Modélisation de la structure de dépendances Décomposition des composantes fortement connexes Parallélisation Comparaison des études de cas Stratégie mixte Conclusion et perspectives

Plan Introduction Intégration pour des systèmes à objets Notre solution Modélisation de la structure de dépendances Décomposition des composantes fortement connexes Parallélisation Comparaison des études de cas Stratégie mixte Conclusion et perspectives

Test d’intégration Objectif Difficultés principales de l’intégration Vérifier l’interaction entre unités (méthode, classe ou package). Difficultés principales de l’intégration Interfaces floues (ex. ordre des paramètres de même type). Implantation non conforme à la spécification (ex. dépendances entre unités non spécifiées). Réutilisation d’unités (ex. risque d’utilisation hors domaine).

Architecture de dépendances Unité à tester Dépendance à tester

Intégration – Approches classiques On obtient une architecture arborescente SADT, SART, SAO (Aérospatiale) Approches Big-Bang : non recommandé De haut en bas (top-down) De bas en haut (bottom-up)

Approche classique : De haut en bas Unité testée Dépendance testée Dépendance sous test Unité sous test Unité à tester Dépendance à tester Bouchon de test (stub) Dépendance simulée

Approche classique : De bas en haut Unité à tester Dépendance à tester Unité sous test Dépendance sous test Unité testée Dépendance testée

Systèmes à objets Forte connectivité Architecture cyclique – Interdépendances

(…) Cycle de vie en « spirale » Intégration Réalisation Conception Analyse détaillée Analyse préliminaire « (de risque) » V1 V2 Validation Synergie avec approche par objets

(…) Composant vs Système? Unit Testing Composant unitaire Intégration Validation Evolution Regression Testing Composant système La vue classique continuité

(…) Composant vs Système? Test d'intégration Component Test de non-régression

(…)Langage UML- plusieurs vues : Operator : Device start( ) stop( ) Class diagram Sequence diagram Statecharts Implementation diagram

UML Unified Modeling Language (…) Langage UML UML Unified Modeling Language Class diagram A B Interfaces Interface Name A B inheritance A B navigability dependency A B Association A B composition A B aggregation A C B Association class

Test unitaire et d’intégration Classiquement Étapes séparées Dans un cycle en spirale Un composant unitaire ne peut pas être testé hors de son contexte d’exécution > conséquence : test unitaire et test d’intégration sont des activités inséparables

Interdépendance Interdépendances Intégration Cycle de dépendances Composantes fortement connexes (CFC) Intégration Big-Bang Décomposer des CFCs – Utilisation de bouchons

Décomposition des CFCs – Bouchon Bouchon : une unité qui simule le comportement d’une unité évite l’utilisation des services d’autres unités de la même CFC. A B C CA CB Bouchon spécifique A B C CFC A B C C’ Bouchon réaliste

Problème de test d’intégration Modéliser la structure de dépendances Décomposer des composantes fortement connexes en minimisant le coût de création des bouchons Planifier le test.

Plan Introduction Intégration pour des systèmes à objets Notre solution Modélisation de la structure de dépendances Décomposition des composantes fortement connexes Parallélisation Comparaison des études de cas Stratégie mixte Conclusion et perspectives

État de l’art David C. Kung et al. – 1995 Kuo Chung Tai et Fonda J. Daniels – 1999 Lionel Briand et al. – 2001 Yvan Labiche et al. – 2000 Yves Le Traon et al. – 2000

D.C. Kung : Modélisation d’ORD B C E D …class A : …class B{ … C g_var_C; …m (…D par_D…){ E l_var_E; }; } Agrégation Héritage Association

D.C. Kung : Exemple d’un ORD A B C F H I E D G Association Agrégation Héritage

D.C. Kung : Décomposition et planification Niveau mineur 1 2 Niveau majeur 2 1 6 3 4 5 A B C F H I E D G Association D Bouchon Agrégation Héritage E F #bouchons specs. : 3 #bouchons réals. : 3

A B C F H I E D G D E F K.C.Tai et F.J. Daniels 2 1 3 Association Héritage Agrégation Association Association 1 2 3 D E Bouchon Agrégation Héritage 2 3 F #bouchons specs. : 4 #bouchons réals. : 3

Résultat Ordre Niveau Nœuds Simulateur Retester 1 1.1 C, A D (A ® D), E (A E) 2 1.2 B 3 2.1 G F (G F) 4 2.2 E ,F 5 E (A ® E), F (G F) 6 2.3 D 7 D (A D) 8 3.1 H 9 3.2 I

L. Briand : Décomposition des CFCs H I E D G Association D Bouchon F Agrégation Héritage 1 4 1 4 #bouchons specs. : 2 #bouchons réals. : 2

Y. Labiche : Traitement dynamique G F FG DA Bouchon Association Agrégation Héritage

Points d’amélioration Kung La modélisation est postérieure à la phase de développement La décomposition n’est pas stable La décomposition ne tient pas compte des étapes de retest L’ordonnancement est utilisé pour un seul testeur Tai-Daniels La décomposition n’est pas efficace Briand La décomposition ne tient pas compte directement de la nature des CFCs Labiche Le traitement dynamique est introduit après la décomposition.

Notre stratégie de planification Modélisation de la structure de dépendances : Dès la phase de conception : à partir d’UML. Traitement statique ainsi que dynamique (comme Labiche). Décomposition des CFCs Tenir compte directement la nature des CFCs : cycle de dépendances. Tenir compte de la nature des relations (comme Kung). Tenir compte des étapes de retest (comme Tai-Daniels). Ordonnancement Répartir le test sur plusieurs testeurs.

Plan Introduction Intégration pour des systèmes à objets Notre solution Modélisation de la structure de dépendances Décomposition des composantes fortement connexes Parallélisation Comparaison des études de cas Stratégie mixte Conclusion et perspectives

Modélisation statique 1/2 B A B A A A Une classe Un nœud A A A A A A A A A A B B B B B B B B B B

Modélisation statique 2/2 B B A A B B B A A B T A AB «bind» A A A <B> B B B B

Modélisation dynamique C A C A C A C B B B B A «abstract» BA A F et E CA F E DA B C D

Éliminer les doublons A A A A B B B B A A A A B B B B

Modélisation- préliminaire 3 types d’arcs class_to_class method_to_class method_to_method A B A est dépendant de B pour le test Sémantique d’un arc orienté …

Modélisation des méthodes Method_to_class A ... +mA1(...v1: B...) … mA2(…v: A…) A B mA1 mA2 refinement Method_to_method A +mA1(...v: B...) {… v.mB1 …} +mA2(...v: A...) v.mA1 A B mA1 mB1 mA2 … an action language (ASL/OCL) code level

Autre exemple : les arcs class-to-method B Graphe classe-à-classe solution 1 Perte d’information mB1 mB2 mB3 Graphe préliminaire A mA1 mA2 B Pas un graphe classique A mA1 mA2 B mB1 mB2 mB3 Graphe classes et méthodes solution 2 Pas de perte homomorphism

Modélisation au niveau de méthode B A … m1 (…par_b : B…) { …X.m2 (…)… } A.m1 A X.m2 Méthode

Exemple D.mD F E F.mF D A A.mA C B H B.mA B.mB G

Autre exemple: dépendances d’implantation et dépendances contractuelles - pD1(v1:E, v2 : F) pD1 A E +mA1(v1: C) {….} #pA1(…) {…} A F F C pA1 C mA1 B +mB1(v1: C) … -pB1(v: C) -pB2(v: G) …. #redefine pA1 {…} H B pA1 mB1 pB1 G pB2 G H Dépendance d’implantation Dépendance contractuelle de type clientèle Dépendance contractuelle de type héritage

Autre exemple : extraction de la partie publique Graphe dépendant de l’implantation F E B G H pA1 mB1 pB1 pB2 A C D mA1 pD1 C D A mA1 B mB1 Graphe contractuel (spécification) Suppression des parties Non-réutilisables

Plan Introduction Intégration pour des systèmes à objets Notre solution Modélisation de la structure de dépendances Décomposition des composantes fortement connexes Parallélisation Comparaison des études de cas Stratégie mixte Conclusion et perspectives

Minimiser le nombre de bouchons (1/2) Objectif : Minimiser le coût de création des bouchons Minimiser le risque d’utilisation des bouchons Hypothèse Bouchon (Méthode).Coût = const Bouchon (Association).Coût = const Bouchon (Agrégation).Coût = const Bouchon (Association).Coût = Bouchon (Méthode).Coût + 1 Bouchon (Agrégation).Coût = Bouchon (Association).Coût + 2 1  0, 2  0 Bouchon.Coût = const La nature des CFCs : Composer de cycles de dépendances.

Minimiser le nombre de bouchons (2/2) Critère Simuler l’unité qui participe au nombre maximum de cycles Compter le nombre de cycles : Pour un arc : arc d’un des trois types Agrégation/Association/Méthode Pour un nœud : nombre total de tous les arcs entrants

La solution initiale Modélisation depuis UML Sans tenir compte des aspects dynamiques Considère comme unité d’intégration la classe aussi bien que la méthode Décomposition récursive des CFCs avec l’algorithme de Tarjan permettant de déterminer efficacement les CFCs Parallélisation de l’intégration Un premier algorithme

Optimalité ->NP-complet La solution initiale Un graphe de l’architecture (1) a b e k f d c i j g h l Optimalité ->NP-complet complexité = n!

La solution initiale (2) B A C Complexity linear with #nodes a a b e k f d c i j g h l f Tarjan’s algorithm b i g e c j h d k l A C Determination and ordering of connected components [(e) or C] then [A or B] then [(a)] Complexity linear with #nodes

La solution initiale (3) B f 5 f i 4 i g j 3 j g h h 1 2 algorithme de Bourdoncle f i 4 i nœud candidat = # max(fronds) g j 3 j g h h 1 2 B [(e) or C] then [A or B] then [(a)] Briser les SCCs Réappliquer Tarjan [l, k] [c, b, d] [g, h, j, i, f]

La solution initiale Result = a partial ordered tree all possible strategies a g Optimized algorithm d f #specific stubs = 4 b i #realistic stubs = 3 j c Random selection h e k #specific stubs = 9.9 Partial ordered tree #realistic stubs = 5 l

Les études de cas Étude de cas Nombre de classes Nombre de dépendances SMDS 37 72 Pylon 50 133 SmallEiffel 104 140 InterView 146 419 J2SE v1.31 588 1935 Swing de J2EE v1.31 694 3819

Etudes de cas SMDS Gnu Eiffel Compiler Telecommunication Switching System: Switched Multimegabits Data Service running on top of connected networks such as the Broadband Integrated Service Digital Network (B-ISDN) based on the asynchronous transfer mode (ATM). 22 Kloc Gnu Eiffel Compiler open-source Eiffel compiler 70 Kloc of Eiffel code (http://SmallEiffel.loria.fr)

Case study SMDS UML diagram

Case study SMDS Test Dependency Graph

SMDS realistic stubs

Gnu Eiffel Compiler

A comparison with 4 strategies Efficient Strategies for Integration and Regression Testing of OO Systems A comparison with 4 strategies RC : Random Components selection MC : Most Used Components RT : Random Thread of Dependencies MT : Most Used Components Threads of Dependencies (intuitive integration) 100 000 times for random strategies

Efficient Strategies for Integration and Regression Testing of OO Systems Specific stubs 60 48 47 50 39 36 38 40 34 Min 27 28 #stubs 30 25 26 26 26 Mean 20 20 20 20 Max 10 RC MC RT MT Optim. Strategies

Efficient Strategies for Integration and Regression Testing of OO Systems Realistic stubs 35 30 29 30 27 25 24 25 21 19 19 19 18 19 Min 20 #stubs Mean 15 13 Max 9 9 9 10 5 RC MC RT MT Optim. Strategies

Results summary SMDS case study GNU Eiffel case study 22 25 32 35 28 9 43 46 34 10 20 30 40 50 RC MC RT MT Optim. #stubs 38 27 63 17 87 85 60 80 100 Min Mean Max SMDS case study GNU Eiffel case study Specific stubs counting Realistic stubs counting 36 26 39 48 47 13 18 19 21 24 29

Bouchon Réaliste Spécifique Max #cyclesMéthode Max #cyclesAssociation Max (#cyclesMéthode + #cyclesAssociation + #cyclesAgrégation) Max #cyclesMéthode Max #cyclesAssociation Spécifique Max #cyclesAgrégation

Minimiser le nombre d’utilisations des bouchons Objectif : Minimiser le nombre d’étapes de retest Minimiser le risque d’utilisation des bouchons Hypothèse Bouchon (Méthode).#Appels = const Bouchon (Association).#Appels = const Bouchon (Agrégation).#Appels = const Bouchon (Association).#Appels = Bouchon (Méthode). #Appels + 1 Bouchon (Agrégation).#Appels = Bouchon (Association). #Appels + 2 1  0, 2  0 Bouchon.Coût = const

Minimiser le nombre d’utilisations des bouchons Nombre d’arcs entrants Critère Simuler l’unité qui participe au nombre minimum de arcs entrants

Bouchon Réaliste Spécifique Max #entrantMéthode Min (#entrantMéthode + #entrantAssociation + #entrantAgrégation) Max #entrantMéthode Max #entrantAssociation Spécifique Méthode Association Agrégation

Exemple – bouchon réaliste 4 8 2 D 4 5 6 Bouchon 5 4 6 8 F 2 A B C H I G F E D 8 5 4 6 1 Association Agrégation Héritage

Exemple – bouchon spécifique 4 2 1 A A B C H I G F E D Association 4 1 2 6 4 5 6 2 H Bouchon 1 Agrégation 4 1 2 E Héritage 4 5 6 5 2 1 G 2 1 6

Exemple – comparatif avec Briand sans polymorphisme – notre solution G Association D Bouchon F Agrégation Héritage 1 2 1 2

Exemple – comparatif avec Briand sans polymorphisme – Briand G F E D Association D 1 4 2 3 1 6 Agrégation 1 E 4 2 1 3 H 3 6 2 Bouchon Héritage 2 3 4 1 2 4 1 1 2 4 1 4 1 2 3 1 G 1 6

Plan Introduction Intégration pour des systèmes à objets Notre solution Modélisation de la structure de dépendances Décomposition des composantes fortement connexes Parallélisation Comparaison des études de cas Stratégie mixte Conclusion et perspectives

Répartition des testeurs 1 testeur : Les feuilles d’abord. n testeurs (n > 1) Hypothèse Le temps de test de toutes les unités est identique Exemple n = 2 Un ordre possible : (B, F), (D, G), E, C, A Un ordre optimal : (G, F), (B, E), (C, D), A (B, G), (E, F), (C, D), A A B C D E F G

Répartition des testeurs Property Minimum steps >=max (A, B) A= longest_path B= [nb_nodes/nb_testers] +1 4 testers 37 nodes max length = 8 Minimum steps= 10 10

Répartition des testeurs A Delay Driven example GNU Eiffel 7 Allocate the needed resources to obtain the minimum integration duration : at least (88 div 7 +1 = ) 13 testers Minimum delay : 7 steps 6 1 5 3 4 2

Répartition des testeurs Branches : A-B A-C-E-G A-D-F Chemin critique A- C-E-G Répartition totale #testeurs = #branches temps_de_test = temps_de_test_de_chemin_critique A B C D E F G

Répartition des testeurs Condition : #testeurs < #branches Répartition : Choisir la feuille d’un chemin critique. Exemple avec 2 testeurs : 1er : G E C A 2nd : F B D Avantages : Profiter du temps libre d’un testeur sur les branches non-critiques A B C D E F G

Répartition des testeurs: Ex 1 A Test Resources Driven example SMDS An optimal solution components steps testers 20 33 18 6 1 4 14 22 27 16 2 4 1 25 7 17 3 4 24 12 2 3 4 4 15 13 29 37 5 4 31 10 34 28 6 4 21 19 9 32 7 4 8 30 36 5 8 4 26 35 4 11 9 4 23 10 1 Reaches the optimal 37 nœuds, 4 testeurs => (minimum = 10)

Répartition des testeurs: Ex 2 A Delay Driven example GNU Eiffel 7 steps = Optimum delay

Plan Introduction Intégration pour des systèmes à objets Notre solution Modélisation de la structure de dépendances Décomposition des composantes fortement connexes Parallélisation Comparaison des études de cas Stratégie mixte Conclusion et perspectives

Les études de cas Étude de cas Nombre de classes Nombre de dépendances SMDS 37 72 Pylon 50 133 SmallEiffel 104 140 InterView 146 419 J2SE v1.31 588 1935 Swing de J2EE v1.31 694 3819

Le nombre de bouchons réalistes

Le nombre de bouchons spécifiques

Efficacité relative – bouchon réaliste i {Kung, Tai-Daniels, Briand, Nœud, Arc} E = min {xi}/xi

Efficacité relative – bouchon spécifique

Plan Introduction Intégration pour des systèmes à objets Notre solution Modélisation de la structure de dépendances Décomposition des composantes fortement connexes Parallélisation Comparaison des études de cas Stratégie mixte Conclusion et perspectives

Subsystem that can be integrated in one block (would need at least 1 stub) Remaining part of the system

Stratégie mixte Constat : Objectif Hypothèse Solution Sous-systèmes souvent « très cohérents » Objectif Éviter d’introduire des bouchons dans les sous- systèmes cohérents Hypothèse Un testeur peut maîtriser un ensemble de n unités. Solution Arrête de décomposer quand la taille de CFC est inférieure à n

Mixte Big-Bang/incrémental strict D A E C F B G H I J

Mixte Big-Bang/incrémental strict 3 classes par composante : problème NP-complet … encore ! D A E C F B G H I J

Mixte Big-Bang/incrémental strict 6 classes par composante D A E C F B H J G I

Critère final Min poids_entrée Max (#cyclesMéthode + #cyclesAssociation + #cyclesAgrégation) Max #cyclesMéthode Max #cyclesAssociation Max taille_cycle Min (#entrantMéthode + #entrantAssociation + #entrantAgrégation) Max #entrantMéthode Max #entrantAssociation

F A B C H I G F E D Exemple 4 5 6 Bouchon 5 4 6 8 2 8 5 4 6 1 5 6 Bouchon 5 4 6 8 F 2 A B C H I G F E D 8 5 4 6 1 Association Agrégation Héritage

Changement de taille maîtrisable

Changement de taille maîtrisable

Mixte Big-Bang/incrémental strict Taille max SCC 1 5 SMDS, 37 classes, 72 connects 9 SmallEiffel, 104 classes, 140 connects InterViews, 146 classes, 419 connects 7 3 Pylon, 50 classes, 133 connects Java, 588 classes, 1935 connects Swing, 694 classes, 3819 connects 14

Plan Introduction Intégration pour des systèmes à objets Notre solution Modélisation de la structure de dépendances Décomposition des composantes fortement connexes Parallélisation Comparaison des études de cas Stratégie mixte Conclusion et perspectives

Conclusion Stratégie : Application La modélisation complète de la structure dépendance Une décomposition efficace Une parallélisation Application Le module TestStrategy de l’AGL Objecteering (Softeam)

Perspectives Décomposition Parallélisation Obtenir la complexité et le nombre d’utilisation des unités. Traiter la complexité des relations « doublons ». Estimer le seuil de complexité maîtrisable (nombre et poids d’une CFC). Chercher une heuristique pour équilibrer les CFCs décomposées. Parallélisation Chercher une heuristique pour améliorer la parallélisation