Chapitre Les tests d'intégration avec JUnit
Comment tester la couche de données ?
Cette leçon aborde la problématique des tests qui intègre une base de données.
Comment tester la couche de données ?
Plusieurs problématiques
- Que faire du serveur de base de données ?
- Comment gérer les données ?
- Isoler les requêtes
Que faire du serveur de base de données ?
En fonction du type d'architecture applicative utilisé, il est possible :
- Remplacer le module de persistance par un stub
- Utiliser un émulateur de base de données compatible avec celle de production (serveur embarqué comme HSQLDB, H2)
- Utiliser un container de tests (TestContainer) qui exécute pour le test, le serveur du même type que la production mais adaptés aux tests.
Exemples de serveurs de base de données embarquées
Les bases de données H2 et HSQLDB permettent de démarrer votre application. Elles supportent divers SGBD bien que partiellement.
Comment gérer les données ?
Une autre problématique importante est la création d'un jeu de données de test et sa maintenance et son chargement.
La plupart des données de tests viennent de production après anonymisation.
Problème 1 : On ne sait pas vraiment ce qu'il y a dans un extrait de la production
Problème 2 : Il faut extraire des scénarios de tests (des données) pertinentes
Problème 3 : Les données sont parfois trop importantes pour être utilisées dans les tests (lenteur, espace disque etc)
DBUnit est un framework Java qui permet de charger des données fragmentaires dans une base de données
JDBT est un framework Java qui tester des applications avec base de données. Le framework prend en charge particulièrement le démarrage du test et des ses données.
Isoler les requêtes
L'API JDBC est complexe et difficile à mocker. La recommandation générale est d'avoir une abstraction au-dessus de JDBC pour simplifier le test.
JOOQ
JOOQ est un framework qui génère une API au-dessus de votre base de données afin d'en faciliter la manipulation. Par conséquent, il est facile de réaliser des tests en mockant / stubbant la couche DAO.
Hibernate/JPA
Il est assez aisé de mocker les interfaces EntityManager
, SessionManager
, Session
pour couvrir les appels bas-niveaux. Les mocks peuvent être faits avec Mockito ou en simple Java.
MyBatis
L'interface Mapper et ses sous-interfaces est simple à mocker.
Patrons de conception
Il existe plusieurs patrons de conceptions utiles pour tester la couche de données.
- La mise en place du patron Repository en DDD ou du pattern DAO lien
- Le patron de conception ActiveRecord