2009-10-20 8 views
1

Mon équipe dispose d'un ensemble de bibliothèques de tests unitaires qui s'exécutent sur notre code d'application - malheureusement, elles lancent des exceptions (inattendues). La raison en est que notre code de connexion est appelé et que les objets ne sont pas configurés. Le code de journalisation est exécuté via un attribut de méthode que nous avons configuré à l'aide de PostSharp (qui est appelé avant et après l'exécution du corps de la méthode). L'attribut ne devrait pas être appelé.Symboles du compilateur conditionnel .NET et bibliothèques de tests unitaires

C'est ici que PostSharp nous aide: elle recherche une directive de compilation conditionnelle (SKIPPOSTSHARP) qui lui interdit de s'exécuter. En d'autres termes, si nous définissons la directive pendant que les tests unitaires sont exécutés, nous sommes en mesure de tester le code souhaité indépendamment de l'aspect de journalisation - en évitant avec succès des dépendances inutiles et un code de déroutement compliqué.

C'est génial! Sauf pour une capture ... Une directive de compilateur conditionnel définie pour notre projet de test ne va pas être définie pour le projet qui est en cours de test - ce qui signifie que notre code sous test utilise toujours l'attribut et tous nos tests échouent.

Est-il possible de définir une directive de compilation sur une solution entière uniquement lors de l'exécution de tests unitaires? Même si nous ne l'appliquons pas à l'ensemble de la solution, une directive peut-elle être appliquée à un projet spécifique uniquement lorsque nous exécutons des tests unitaires (cela fonctionnerait également)? J'aimerais aussi connaître les opinions sur cette approche (nous essayons de parvenir à la séparation et à l'évolutivité via le code AOP, mais il semble que nous ayons quelques difficultés supplémentaires à franchir au fur et à mesure que nous progressons). REMARQUE: Je ne parle pas des tests d'intégration ici seulement des tests unitaires. Nous voulons seulement tester l'unité spécifique et nous ne nous soucions pas du fait que le code de journalisation fonctionne ou pas - cela est testé par d'autres tests unitaires (qui fonctionnent bien).

+0

Comment fonctionnent vos tests unitaires? Est-il possible d'utiliser msbuild pour déclencher une cible pour exécuter ces tests unitaires? – Khanzor

+0

Nos tests se déroulent selon deux scénarios. A) Par l'intermédiaire d'un coureur de test de développement local (c'est-à-dire le lanceur d'essai de ReSharper) ou, B) Par l'intermédiaire de CI Factory, exécuter Gallio via Nant sur notre serveur de construction. Votre approche semble intéressante (bien que je ne sache pas encore assez sur MSBuild pour le dire de façon concluante). L'autre considération est de faire fonctionner l'équivalent dans le script Nant automatisé mais j'imagine que si MSBuild peut faire quelque chose, alors Nant n'aura aucun problème. –

Répondre

3

Je suggère de créer une configuration de construction spéciale pour les tests. Il existe peut-être des moyens de détecter si un projet est construit en raison de l'exécution de tests unitaires (éventuellement une propriété MSBuild), mais cela ne serait pas fiable dans les scénarios de construction incrémentielle.

+0

Merci pour la réponse Gael (je suppose que vous regardez les mots-clés PostSharp - toujours agréable d'avoir des nouvelles du créateur d'un produit!). Je n'ai pas une connaissance très approfondie de MSBuild, donc je vais devoir étudier cela et voir de quoi il est capable. Y a-t-il des ressources que vous connaissez et qui pourraient me pointer dans la bonne direction? –

+0

L'astuce consiste à activer la verbosité diagnostique dans Visual Studio Build Options, puis à voir si une propriété intéressante est définie dans les conditions d'intérêt. Par exemple, Visual Studio exécute le projet MSBuild même s'il ne crée pas le projet; dans ce cas, la propriété BuildingProject est définie sur false. Vous ne le trouverez pas dans la documentation. En utilisant la même approche, vous pourriez trouver quelque chose d'intéressant pour vous. Mais je ne m'attends pas à ce qu'il soit robuste; Je voudrais vraiment créer une nouvelle configuration de projet. Comme vous avez "Debug" et "Release", vous aurez "Test". –