2009-02-27 12 views
13

Je me considère encore comme relativement nouveau sur la scène TDD. Mais je trouve que peu importe la méthode que j'utilise (maquette de cadre ou cognement de mes propres objets), je trouve que je dois écrire beaucoup de code pour créer des données fictives. J'aime l'idée de charger des objets pour créer une base de données en mémoire. Mais ce que je n'aime pas, c'est encombrer mes tests avec une tonne de code dans le seul but de créer des données fictives. C'est particulièrement le cas lorsque les données doivent prendre en compte tous les cas différents.Création de données fictives pour les tests unitaires

Je voudrais des suggestions pour une meilleure façon de le faire.

Il me semble que je devrais être capable de charger les données une fois dans un état connu à partir d'un magasin de données et ensuite je pourrais utiliser un instantané de cet état qui est chargé dans le test/initialiser avant chaque méthode d'essai est exécuté. Cela satisferait aux bonnes pratiques de test tout en apportant de la commodité et me permettrait de me concentrer sur l'écriture de tests au lieu d'écrire du code pour créer des données de test "à la main".

Répondre

6

Vous pourriez essayer la bibliothèque NBuilder. Il fournit une interface très fluide et est facile à utiliser. Vous pouvez l'utiliser pour générer des instances uniques d'une classe avec des valeurs defualt ou générer des listes avec des valeurs par défaut ou remplacées. Vous pouvez jeter un oeil à this un.

+0

Bien, c'est exactement ce que je cherchais. J'avais abandonné depuis que je n'avais rien trouvé que j'aimais vraiment. C'est bien quand les valeurs de données ne sont pas si importantes tant qu'elles correspondent aux valeurs originales générées. –

0

Je sais exactement ce que vous voulez dire. Je pense qu'une bonne approche pour résoudre ce problème est d'avoir un projet MockFramework séparé qui héberge toutes vos données fictives, en dehors du projet de test. De cette façon, vous pouvez générer des données fictives séparément, les stocker en mémoire si vous le souhaitez, ou non, puis référencer la structure fictive du projet de test. Si vous utilisez un framework tiers pour le faire, c'est encore mieux, mais vous pouvez toujours envelopper ce framework tiers dans votre propre framework de simulation pour que vous puissiez obtenir tout ce "glue" qui crée les fausses données de la façon dont vous en avez besoin. vos tests afin que les tests ne puissent vraiment être que ce qu'ils doivent être.

+0

Cela résout le problème de l'encombrement, mais j'ai encore besoin de simuler toutes les données, juste dans un projet distinct. Peut-être, comme vous l'avez suggéré, je pourrais utiliser un framework tiers pour charger les données et les traduire dans mon modèle objet. nDbUnit pourrait fonctionner, comme suggéré par webjedi. –

1

Vous pouvez avoir des classes Builder qui vous aident à construire les instances dont vous avez besoin/dans ce cas, celles que vous utiliseriez en rapport avec le référentiel. Demandez au Builder d'utiliser les valeurs par défaut appropriées, et lors de vos tests, vous pouvez écraser ce dont vous avez besoin. Cela vous évite d'avoir besoin de mettre chaque cas de "données" mélangé pour tous les différents tests (ce qui introduit des problèmes, car généralement il y a des cas qui ne sont pas compatibles pour différents tests).

** Mise à jour 1: ** Jetez un oeil à www.markhneedham.com/blog/2009/01/21/c-builder-pattern-still-useful-for-test-data

+0

Merci pour le lien, qui m'a aidé à mieux voir ce que vous vouliez dire. Cela m'oblige encore à écrire les objets à la main, mais différemment. Cependant, vous faites un bon point de ne pas mettre chaque cas dans les "données". –

+0

Notez que le point d'avoir par défaut, est de vous permettre d'avoir cette config/données partagées, mais pas tout manqué avec des cas spécifiques. – eglasius

1

Si que vous utilisez .Net Essayez NDBUnit

Vous remplissez votre magasin, puis il retourne votre DB à un état connu au moment de l'essai, pour chaque test. La série Autumn of Agile screen cast montre cela en assez bon détail.

Ou vous pouvez le faire manuellement ... construire une procédure stockée ou autre pour tronquer vos tables et copier dans les données de votre méthode de démontage.

+0

Cela ne fonctionnerait que pour les tests d'intégration. – eglasius

+0

Freddy Rios a raison de ton 2ème commentaire. nDbUnit est proche, mais je n'arrive pas à trouver de document. J'ai téléchargé l'exemple de code d'Autumn of Agile et il semble que j'ai besoin d'un xsd et j'utilise déjà Entity Framework, donc je devrais tout copier de xsd à EF. –

+0

Le XSD sert uniquement à cracher les données actuelles dans un fichier XML et à les relire après la fin du test. @Freddy Dunno à ce sujet ... Je le fais depuis la première étape ... ne considérerait pas cela comme un test d'intégration en soi. – Webjedi

0

Merci pour toutes les suggestions, je pense que la solution nécessite un peu de tout. Je ne veux pas que ces tests finissent par être des tests de régression, mais sans une sorte de magasin de données existant, tout se résume à créer les données en construisant "manuellement" les objets. Ce qui serait vraiment bien, ce serait un framework qui me permettrait d'utiliser mon DAL existant soit pour écrire les données à coder pour moi, soit pour récupérer les données en mémoire et y accéder comme une base de données en mémoire.

0

Untils.org couvre de cette façon mieux que je ne pourrais jamais.

Tout leur guide est vraiment très bon. Mais fondamentalement, si vos unités requièrent "beaucoup de données", elles peuvent ne plus être des tests unitaires. Je vous recommande d'essayer de tester les petites pièces individuellement.

+0

Le lien vers Untils.org ne fonctionne pas. – Torleif