Je veux créer des tests unitaires qui couvrent le code qui utilise une base de données relationnelle dans le Play framework 2.1.0. Il existe de nombreuses possibilités pour cela et toutes posent des problèmes :
Test sur la base de données H2 en mémoire
La documentation du framework Play propose d'exécuter les tests unitaires sur la base de données en mémoire H2, même si la base de données principale utilisée pour le développement et la production utilise un autre logiciel (par exemple, MySQL) :
app = Helpers.fakeApplication(Helpers.inMemoryDatabase());
Mon application n'utilise pas de fonctionnalités compliquées du SGBDR telles que les procédures stockées et la plupart des cas d'accès à la base de données sont des appels ebean, elle doit donc être compatible à la fois avec MySQL et H2.
Cependant, les instructions de création de table dans les évolutions utilisent des fonctionnalités spécifiques à MySQL, telles que la spécification de l'option ENGINE = InnoDB
, DEFAULT CHARACTER SET = utf8
etc. J'ai peur que si je supprime ces parties exclusives de l'entreprise, je n'aie pas le choix. CREATE TABLE
Pour tester et développer l'application, la configuration principale de MySQL doit donc être modifiée.
Quelqu'un a-t-il utilisé cette approche (rendre les évolutions compatibles à la fois avec MySQL et H2) ?
D'autres idées sur la façon dont cela peut être traité :
- Évolutions séparées pour MySQL et H2 (pas une bonne idée)
- Un moyen de faire en sorte que H2 ignore les éléments supplémentaires de MySQL dans
create table
(Le mode de compatibilité de MySQL ne fonctionne pas, il se plaint toujours même surdefault character set
). Je ne sais pas comment.
Test sur le même pilote de base de données que la base de données principale
Le seul avantage de la base de données H2 en mémoire est sa rapidité, et il est préférable de tester sur le même pilote de base de données que la base de données de développement/production, car il est plus proche de l'environnement réel.
Comment le faire correctement dans le cadre de Play ?
Essayé :
Map<String, String> settings = new HashMap<String, String>();
settings.put("db.default.url", "jdbc:mysql://localhost/sometestdatabase");
settings.put("db.default.jndiName", "DefaultDS");
app = Helpers.fakeApplication(settings);
Il semble que les évolutions fonctionnent ici, mais comment nettoyer au mieux la base de données avant chaque test ? En créant un code personnalisé qui tronque chaque table ? Si les tables sont supprimées, les évolutions seront-elles exécutées à nouveau avant le prochain test, ou seront-elles appliquées une fois par test ? play test
commande ? Ou une fois par Helpers.fakeApplication()
invocation ?
Quelles sont les meilleures pratiques en la matière ? Entendu parler de dbunit est-il possible de l'intégrer sans trop de difficultés et de bizarreries ?