Je travaille avec beaucoup d'applications Web qui sont pilotées par des bases de données de complexité variable sur le backend. En règle générale, il y a un couche ORM distincte de la logique métier et de la présentation. Cela rend les tests unitaires de la logique métier assez simples; les choses peuvent être implémentées dans des modules discrets et toutes les données nécessaires au test peuvent être truquées par le biais de la simulation d'objets.
Mais tester l'ORM et la base de données elle-même a toujours été semé d'embûches et de compromis.
Au fil des ans, j'ai essayé quelques stratégies, dont aucune ne m'a complètement satisfait.
Chargez une base de données de test avec des données connues. Exécutez des tests par rapport à l'ORM et confirmez que les bonnes données reviennent. L'inconvénient ici est que votre base de données de test doit suivre les modifications de schéma dans la base de données d'application et peut se désynchroniser. Il s'appuie également sur des données artificielles et ne peut pas exposer les bogues qui se produisent en raison d'une entrée utilisateur stupide. Enfin, si la base de données de test est petite, elle ne révélera pas des inefficacités comme un index manquant. (OK, ce dernier n'est pas vraiment pour quoi les tests unitaires devraient être utilisés, mais cela ne fait pas de mal.)
Chargez une copie de la base de données de production et testez-la. Le problème ici est que vous n'avez peut-être aucune idée de ce qui se trouve dans la base de données de production à un moment donné; vos tests devront peut-être être réécrits si les données changent au fil du temps.
Certaines personnes ont souligné que ces deux stratégies reposent sur des données spécifiques et qu'un test unitaire ne devrait tester que la fonctionnalité. À cette fin, j'ai vu suggéré:
- Utilisez un serveur de base de données factice et vérifiez uniquement que l'ORM envoie les requêtes correctes en réponse à un appel de méthode donné.
Quelles stratégies avez-vous utilisées pour tester les applications basées sur une base de données, le cas échéant? Qu'est-ce qui vous a le mieux fonctionné?