L'été dernier, j'ai développé une application CRUD ASP.NET/SQL Server de base, et les tests unitaires étaient l'une des exigences. J'ai rencontré quelques problèmes lorsque j'ai essayé de tester contre la base de données. D'après ce que j'ai compris, les tests unitaires doivent être :
- apatride
- indépendants les uns des autres
- répétable avec les mêmes résultats, c'est-à-dire sans changement persistant.
Ces exigences semblent être contradictoires lors du développement pour une base de données. Par exemple, je ne peux pas tester Insert() sans m'assurer que les lignes à insérer ne sont pas encore là, et je dois donc appeler Delete() en premier. Mais, que se passe-t-il s'ils ne sont pas déjà là ? Dans ce cas, je dois d'abord appeler la fonction Exists().
Ma solution finale impliquait de très grandes fonctions de configuration (beurk !) et un scénario de test vide qui s'exécuterait en premier et indiquerait que la configuration s'est déroulée sans problème. C'est un sacrifice sur l'indépendance des tests tout en maintenant leur absence d'état.
Une autre solution que j'ai trouvée consiste à intégrer les appels de fonctions dans une transaction qui peut être facilement annulée, comme suit XtUnit de Roy Osherove . Cela fonctionne, mais cela implique une autre bibliothèque, une autre dépendance, et cela semble une solution un peu trop lourde pour le problème en question.
Alors, qu'a fait la communauté des OS lorsqu'elle a été confrontée à cette situation ?
a dit tgmdbm :
Vous utilisez généralement votre cadre de test unitaire automatisé préféré pour effectuer des tests d'intégration, ce qui est pourquoi certaines personnes sont confuses, mais ils ne suivent pas les mêmes règles. Vous êtes autorisé à impliquer l'implémentation concrète l'implémentation concrète de plusieurs de vos classes (parce qu'elles ont été testées unitairement). Vous testez comment votre béton classes concrètes interagissent entre elles et avec la base de données .
Donc si je lis correctement, il n'y a pas vraiment de moyen de efficacement Test unitaire d'une couche d'accès aux données. Ou bien, un "test unitaire" d'une couche d'accès aux données consisterait-il à tester, par exemple, le SQL/les commandes générées par les classes, indépendamment de l'interaction réelle avec la base de données ?