Mise en place, apprentissages et limites

Tests d'intégration avec MSWJS

Par

Joris Langlois

Date

04/12/2024

01

Présentation

Parce que c'est notre projet

04

Approche en intégration

Say hello to MSWjs

02

Contexte

Nature du projet et architecture

05

Conséquences

03

Approche unitaire

Rapide, simple, mais pour quelle fiabilité ?

06

Limites

Tests d'intégration avec MSWJS _ Sommaire

There is no silver bullet

Présentation

Présentation _ Qui est KNP ?

Fondé en 2009

30 KNPeers : devs, fafas, UX designers, alternants

2 agences : Nantes, Caen

We Care.

Développement

sur mesure

Expertise technique sur Symfony / React.JS

Méthodologie KNP permettant d'extraire les besoins spécifiques

Accompagnement et aide à la décision technique et fonctionnelle

Présentation _ Savoir-faire

Méthodologie

agile

Méthodologie basée sur les fondements agiles 

Amélioration continue tout au long des projets

2 coachs certifiés Scrum Master accompagnent l'équipe et les clients

Accompagnement

personalisé

Conseil et accompagnement sur l'orchestration des SI

Expertise sur Docker / Cloud / Ansible / Kubernetes / Swarm…

Accompagnement et mise en place de migration d'hébergement

 

Et aussi ...

  • Formations
  • Consulting techniques
  • Audit techniques et process

Apps mobiles

Présentation _ Réalisations

Sites publics à fort

trafic

Outils internes de gestion de production

Défimedoc, Deliver events, ...

Imparfaite Paris, 9e store, ...

Brand & Shop, Packaging, anaka, ...

Contexte

Gestion de la production

400 utilisateurs

Tests d'intégration avec MSWJS _ Contexte

Anakà

Objectif zéro papier

Stack technique

SPA React / Redux / Redux-Saga

API Symfony + mercure pour le temps réel

Tests d'intégration avec MSWJS _ Contexte

Rappels élémentaires

Tests d'intégration avec MSWJS _ Contexte

Problème :

Approche unitaire

Tests unitaires

  • Composants React montés avec un store redux de test sans side effects
  • Reducers & sélecteurs
  • Side effects testés a part (sagas, epics, thunks, ...)

Tests d'intégration avec MSWJS _ Approche unitaire

Ecole fonctionnelle

  • Robustesse garantie par la composition de fonctions pures unitairement testées

Tests de selecteurs

  • Chronophage et verbeux alors que certains sélecteurs ne sont que des accesseurs
  • Répétitifs

Tests de side effects (appels d'API, clipboard, local storage, ...)

  • Quel comportement tester ? Action in -> action out
  • Nécessaire de mocker le comportement des dépendances
  • 90% des side effects sont des appels d'APIs (succès / erreur)
  • Verbeux et répétitifs
  • Peu lisibles / maintenables (marble testing) ...
  • ... voire carrément contreproductifs

Tests d'intégration avec MSWJS _ Approche unitaire

Tests de composants React

  • React testing library
  • Tests en isolation (sans les side effects)
  • Simulation des comportements en dispatchant nous-mêmes des actions (act)
  • Exemple : actions succès / erreur après un appel d'API

Tests d'intégration avec MSWJS _ Approche unitaire

Risques de faux positifs

  • Si on supprime / modifie l'effect qui est normalement responsable de dispatcher ces actions dans l'app, les tests passeront toujours, mais l'app est KO

Risques de faux négatifs

  • Si on arrête de dispatcher ces actions dans les tests, ils sont KO alors que l'app va très bien

Tests d'intégration avec MSWJS _ Approche unitaire

Un bilan mi-figue mi-raisin

  • Les composants fonctionnent tous en isolation mais...
  • Les conditions d'exécution sont éloignées de la réalité
  • On teste l'implémentation plutôt que le comportement
  • Tests chronophages, répétitifs et verbeux
  • Pour un gain de confiance faible

Tests d'intégration avec MSWJS _ Approche unitaire

Approche en intégration

Articles de référence

  • Kent C. Dodds. Write tests. Not too many. Mostly integration. 2019.

https://kentcdodds.com/blog/write-tests

  • Adam Bender. SMURF: Beyond the Test Pyramid. 2024.

https://testing.googleblog.com/2024/10/smurf-beyond-test-pyramid.html

Pourquoi tester l'intégration de nos composants ?

  • Plutôt que de tout tester de la même manière et de façon peu efficace, on déplace l'effort de test pour le centrer sur le comportement de l'utilisateur
  • Plus proche de la philosophie de react-testing-library

Tests d'intégration avec MSWJS _ Approche en intégration

Tests d'intégration avec MSWJS _ Approche en intégration

Tests d'intégration

  • Composants React montés avec le store redux et les side effects
  • Ils sont desormais testés dans les conditions réelles d'exécution de l'app
  • Utilisation de MSWJS pour intercepter les appels réseaux

Tests unitaires

  • Side effects complexes uniquement (i.e. authentification)
  • Reducers
  • Sélecteurs complexes uniquement

Tests d'intégration avec MSWJS _ Approche en intégration

Serveur

Tests d'intégration avec MSWJS _ Approche en intégration

Handlers

Tests d'intégration avec MSWJS _ Approche en intégration

Tests d'intégration avec MSWJS _ Exemple

Scénario nominal

Tests d'intégration avec MSWJS _ Exemple

Scénario d'échec

Fixtures

  • Testées unitairement en utilisant les JSON schémas du backend...
  • ...tout comme les données que l'on envoie à l'API, dans les handlers de MSW

Tests d'intégration avec MSWJS _ Approche en intégration

Quid des tests E2E ?

Conséquences

Les sélecteurs type accesseurs sont testés "indirectement"

  • Plus besoin de les tester unitairement

La plupart des side effects sont aussi testés indirectement à partir du moment où l'interface change en réaction à une action système

  • Plus besoin de les tester unitairement ni même de les exporter (= simplification)

Plus besoin de dispatcher des actions à la main pour simuler un comportement

  • Tests plus lisibles et plus simples à maintenir

Moins de faux positifs

  • Davantage de confiance dans ce qu'on livre
  • Diminution du risque de régression
  • Gain de sérénité

Tests d'intégration avec MSWJS _ Conséquences

Limites

Risque de tests un peu instables lors de certains enchaînements

Prise en main : tout est asynchrone !

  • Résolution des réponses de MSW potentiellement instantanées
  • Besoin d'attendre que les éléments de l'interface soient tous là pour les assertions et passer au test suivant

Plus lents que des tests unitaires

  • (100 suites / 500 tests ~ 50s)

Tests d'intégration avec MSWJS _ Limites

Merci pour votre attention !

Sources

  • Des tests unitaires au tests d'intégration : les changements apportés par MSW à nos stratégies de tests

https://knplabs.com/fr/blog/des-tests-unitaires-aux-tests-dintegration-les-changements-apportes-par-msw-a-nos-strategies-de-tests/

  • From unit testing to integration testing: setup, findings and limits

https://knplabs.com/en/blog/from-unit-testing-to-integration-testing-setup-findings-and-limits/

Meetup ReactNantes - 4 dec 2024

By KNP Labs

Meetup ReactNantes - 4 dec 2024

  • 5