web-dev-qa-db-fra.com

Organisation des projets de tests unitaires .NET

Selon vous, quelle est la meilleure façon de gérer les tests unitaires dans une grande application .net? Est-il préférable d'ajouter un projet de test pour chaque projet distinct dans la solution ou un grand projet de tests pour tous les tests dans le reste des projets?

Par exemple, s'il y a 10 projets dans une solution, est-il préférable d'avoir 10 projets de test supplémentaires ou un grand projet de tests suffirait pour l'ensemble de la solution?

Je sais que les assemblages de tests modulaires offrent certains avantages, mais des choses assez similaires peuvent être obtenues en utilisant des catégories de tests. La compilation prend plus de temps avec de nombreux projets, mais vous pouvez exclure les projets dont vous n'avez pas besoin à ce moment, alors que si vous avez un seul projet, vous ne pouvez pas le faire, mais la compilation prend un peu moins de temps.

Veuillez décrire les avantages/inconvénients de chaque choix dans vos réponses.

44
alxbrd

Phil Haack a écrit un article de Nice sur la structuration des tests unitaires. C'est devenu ma meilleure pratique personnelle lors de l'écriture de tests unitaires. Voici le lien vers son article http://haacked.com/archive/2012/01/02/structuring-unit-tests.aspx

Quant à votre question, je créerais toujours un projet distinct pour le test unitaire et le nommer avec .UnitTests en annexe (je le fais afin de faire la distinction entre les tests unitaires et les tests d'intégration). Par exemple, si mon projet principal est Sample.WebUI, le test sera Sample.WebUI.UnitTests.

Il est vrai que les tests unitaires ajoutent du temps à la compilation, mais je considère que c'est un problème mineur. Je travaille sur une solution avec 17 projets (hors tests unitaires) et il faut environ 50-60 secondes pour tout compiler. Il est juste assez de temps pour quitter les yeux du moniteur et regarder autre chose pour changer :-)

En ce qui concerne les catégories, si vous avez des versions quotidiennes qui nécessitent des tests pour se terminer rapidement, utilisez-les et distinguez-les des tests qui prennent plus de temps (comme les tests d'intégration). De plus, si vous utilisez TFS, l'utilisation de catégories peut aider à automatiser et tester vos connexions.

39
Husein Roncevic

Personnellement, je préfère avoir un projet de test dédié par projet réel. Quand il s'agit de construire une nouvelle fonctionnalité/module/projet, je trouve qu'il est beaucoup mieux de pouvoir filtrer rapidement la suite d'autres projets de test non pertinents. Cela rend le cycle TDD beaucoup plus rapide pour pouvoir exécuter rapidement les tests de mon nouveau projet pendant que je le développe.

Plus important encore, il vous aide à maintenir une bonne organisation de vos différentes classes de test/maquette pour vos appareils selon vos besoins sans encombrer une tonne de code non lié ensemble. Cela permet également aux nouveaux développeurs de trouver plus facilement les tests pertinents. Enfin, il garantit que les dépendances de vos tests pour un projet particulier ne dépendent jamais accidentellement d'un autre projet non pertinent.

8
Chris Sinclair

Mon choix personnel est d'avoir un projet de test par projet avec seulement des tests unitaires. La structure des dossiers de ce projet de test est exactement la même que celle du projet testé. En outre, ils réalisent autant de projets de test d'intégration que nécessaire.

Le principal avantage de cette approche est que lorsque vous souhaitez prendre 1 projet et l'utiliser dans une solution différente, vous prenez toujours le projet de test ensemble en veillant à ce que lorsque vous devez faire des chances dans la nouvelle solution, la qualité reste.

Jusqu'à présent, je n'ai découvert aucun désavantage autre que d'avoir à remplacer les références plus que ce que vous devez faire lorsque vous utilisez un projet de test.

3
amaters

regardez cette question: "Best Practice: Organize Unit Tests"

bien que la taille de la solution en question soit différente, les directives qui y sont écrites sont toujours valables.

2
avivr