2008-09-19 9 views
3

En tant que débutant de TDD, j'essaie d'écrire un test qui suppose qu'une propriété a été modifiée sur un PropertyGrid (C#, WinForms, .NET 3.5). La modification d'une propriété sur un objet dans une grille de propriétés ne déclenche pas l'événement (assez bien, car il s'agit d'un événement surligné par l'interface utilisateur, donc je peux voir pourquoi la modification de l'objet possédé peut lui être invisible).Activation d'événements de contrôle d'interface utilisateur à partir d'un test unitaire

J'ai également eu le même problème avec obtenir un AfterSelect sur un TreeView pour déclencher lors de la modification de la propriété SelectedNode. Je pourrais avoir une fonction que mon test d'unité peut appeler qui simule le code qu'un événement UI déclencherait, mais qui encombrerait mon code, et à moins que je ne le rende public, je devrais écrire tous mes tests dans le même projet, ou même la classe, des objets que je suis en train de tester (encore une fois, je vois cela comme du fouillis). Cela me semble moche, et souffrirait de problèmes de maintenabilité.

Y at-il une convention pour faire ce genre de tests unitaires à base de l'interface utilisateur

Répondre

5

Pour tester votre code unitaire, vous devrez créer une maquette d'un objet de l'interface utilisateur. Il y a beaucoup d'outils que vous pouvez utiliser pour faire ceci, et je ne peux pas recommander un sur l'autre. Il y a une bonne comparaison entre MoQ et Rhino Mocks ici at Phil Haack's blog que j'ai trouvé utile et qui pourrait vous être utile.

Une chose à considérer si vous utilisez TDD est la création d'une interface à vos vues aidera dans le processus TDD. Il y a un modèle de design pour cela (probablement plus d'un, mais j'en utilise un) appelé Model View Presenter (maintenant divisé en Passive View et Supervisor Controller). Suite à l'un d'entre eux rendra votre code beaucoup plus testable dans le futur. En outre, gardez à l'esprit que le test de l'interface utilisateur elle-même ne peut pas être effectué par le biais de tests unitaires. Un outil d'automatisation de test comme déjà suggéré dans une autre réponse sera approprié pour cela, mais pas pour un test unitaire de votre code.

1

Une option que je recommande pour son simplicty est d'avoir votre interface utilisateur il suffit d'appeler une classe d'aide ou une méthode sur la mise à feu de l'événement et l'unité tester ça. Assurez-vous que (votre gestionnaire d'événements dans l'interface utilisateur) a aussi peu de logique que possible et puis à partir de là, je suis sûr que vous saurez quoi faire.

Il peut être assez difficile d'atteindre une couverture de 100% dans vos tests unitaires. Par difficile, je veux dire bien sûr inefficace. Même une fois que vous avez obtenu quelque chose comme ça, à mon avis, cela ajoutera probablement plus de complexité à votre base de code que votre test unitaire ne le mériterait. Si vous n'êtes pas sûr de la façon dont votre logique est segmentée en une classe ou une méthode distincte, c'est une autre question avec laquelle j'aimerais vous aider.

Je serais intéressé de voir quelles autres techniques les gens doivent travailler avec ce genre de problème.

2

Microsoft a UI Automation intégré au .Net Framework. Vous pouvez peut-être utiliser ceci pour simuler un utilisateur utilisant votre logiciel de la manière normale.

Il existe un article MSDN " Using UI Automation for Automated Testing qui est un bon point de départ.