Je peux peut-être vous donner un avant-goût de notre expérience lorsque nous avons commencé à examiner les tests unitaires de notre processus de niveau intermédiaire, qui comprenait une tonne d'opérations SQL de «logique métier».
Nous avons d'abord créé une couche d'abstraction qui nous permettait de «insérer» n'importe quelle connexion de base de données raisonnable (dans notre cas, nous avons simplement pris en charge une seule connexion de type ODBC).
Une fois que cela a été mis en place, nous avons pu faire quelque chose comme ça dans notre code (nous travaillons en C ++, mais je suis sûr que vous avez l'idée):
GetDatabase (). ExecuteSQL ("INSERT INTO foo (blah, blah)")
Au moment de l'exécution normal, GetDatabase () renverrait un objet qui alimentait tous nos sql (y compris les requêtes), via ODBC directement dans la base de données.
Nous avons ensuite commencé à examiner les bases de données en mémoire - la meilleure de loin semble être SQLite. ( http://www.sqlite.org/index.html ). C'est remarquablement simple à configurer et à utiliser, et nous a permis de sous-classer et de surcharger GetDatabase () pour transférer SQL vers une base de données en mémoire qui a été créée et détruite pour chaque test effectué.
Nous en sommes encore aux premiers stades, mais cela semble bon jusqu'à présent, mais nous devons nous assurer de créer toutes les tables nécessaires et de les remplir avec des données de test - cependant nous avons quelque peu réduit la charge de travail ici en créant un ensemble générique de fonctions d'assistance qui peuvent faire beaucoup de tout cela pour nous.
Dans l'ensemble, cela a énormément aidé avec notre processus TDD, car apporter ce qui semble être des modifications assez inoffensives pour corriger certains bogues peut avoir des effets assez étranges sur d'autres zones (difficiles à détecter) de votre système - en raison de la nature même de sql / bases de données.
Évidemment, nos expériences se sont centrées sur un environnement de développement C ++, mais je suis sûr que vous pourriez peut-être obtenir quelque chose de similaire fonctionnant sous PHP / Python.
J'espère que cela t'aides.