jeudi 6 février 2014

Deux projets prototypes et didactiques

Parmi mes tâches en tant qu'architecte, je dois vérifier le fonctionnement des frameworks utilisés, plus particulièrement de certaines de leurs propriétés, afin de bien les comprendre et d'assister les développeurs. Une autre tâche, parallèle à celle-là, est de coacher les développeurs et leur montrer comment fonctionnent les frameworks.

Pour cela, j'utilise des projets "prototypes", correctement configurés, qui me permettent d'effectuer mes divers tests. Après un peu de nettoyage, j'ai décidé de les pousser sur GitHub, où ils sont accessibles à tous.

L'objectif est surtout didactique: démontrer le fonctionnement des frameworks aux travers de petits tests, complètement indépendants les uns des autres. Et quand je dis "tests", je parle réellement de tests unitaires.

Deux projets sont disponibles:

TestsSpringHibernate (https://github.com/hittepit/TestsSpringHibernate

Ce projet teste le fonctionnement d'Hibernate, en particulier lorsqu'il est intégré avec Spring. Cependant, de nombreux tests ne profitent de Spring que pour créer une SessionFactory.

LazyLoading, mappings d'héritage, cache de second niveau et plusieurs autres fonctionnalités ont été ainsi testées. Il y aura d'autres développements en fonction des besoins rencontrés.

Voici les principales librairies utilisées et leurs versions (le laisse de côté les modules spécifiques de chaque framework, ils sont dans le pom.xml):
  • Hibernate 3.5.6
  • Spring 3.2.3
  • TestNg 6.8.5
  • Mockito 1.9.0
  • H2 1.3

TestSpring (https://github.com/hittepit/TestSpring)

Ce projet teste le fonctionnement de Spring. Il est plus récent que le précédent, donc moins complet. Il contient cependant quelques tests intéressants: l'utilisation de l'annotation @Async, de l'AOP ou des PostProcessors.

Les librairies et leurs versions sont:
  • Spring 3.2.3
  • TestNg 6.8.5

Structure des projets

Les deux projets sont similaires. Tous deux sont "maven". Le code de base se trouve donc dans src/main/java.

Les packages utilisent une base commune (be.fabrice.testspring pour TestSpring, be.fabrice pour TestsSpringHibernate), puis continuent avec un identifiant en rapport avec la fonctionnalité testée. Un sous-division existe parfois.

Par exemple, dans TestsSpringHibernate, le sous-package "inheritance" est sous-divisé en "join", "single" et "table" selon la manière dont l'héritage est fait. Dans TestSpring, le sous-package "postProcessor" est divisé en "bean", "definitionRegistry" et "factory" selon le type de PostProcesor qui est testé.

La division va plus loin dans le projet TestsSpringHibernate, où il y a systématiquement un dernier sous-package "entity" (pour les entités, avec le mapping Hibernate en annotations) ou "dao" (pour les Data Access Objects utilisés pour gérer ces entités).

Les tests, qui démontrent les propriétés, sont évidemment dans src/test/java. Le packaging est exactement pareil à celui de la fonctionnalité testée, à l'exception de TestsSpringHibernate où seule la sous-division "dao" est utilisée.

Les ressources ne sont configurées qu'au niveau des tests, c'est-à-dire dans src/test/resources, avec un découpage en répertoires basé directement sur celui des sous-packages du packaging de base (donc les ressources pour les tests sur l'héritage Hibernate sont en inheritance/join, inheritance/single et inheritance/table).

Chaque test utilise ses propres fichiers ressources, c'est-à-dire un fichier spring (xml) mais aussi un fichier SQL (uniquement pour TestsSpringHibernate) lorsque la base de données de test doit être initialisée.

Ce qu'il manque

Plusieurs fonctionnalités, clairement. Je tiens à jour le fichier README qui contient une liste de TODOs. Avec d'ailleurs un TODO qui manque:  "compléter la liste des TODOs"...

Ca manque aussi de documentation. J'essaye d'expliquer les fonctionnements dans la JavaDoc, mais je manque de discipline :-/ Le nom des méthodes de test est normalement descriptif de ce qu'elles vérifient.
J'aimerais ajouter des pages Wiki sur GitHub, mais ça prend du temps.

Patience...

Aucun commentaire:

Enregistrer un commentaire