NUnit contre MbUnit contre MSTest contre xUnit.net [fermé]

390

Il existe un grand nombre de frameworks les plus inutiles pour .NET. J'ai trouvé cette petite comparaison de fonctionnalités: http://xunit.github.io/docs/comparisons.html

Maintenant, je dois choisir le meilleur pour nous. Mais comment? Est-ce que ça importe? Lequel est le plus à l'épreuve du temps et a un élan décent derrière? Dois-je me soucier des fonctionnalités? Alors que xUnit semble être le plus moderne et spécifiquement conçu pour .NET, NUnit semble à nouveau être celui qui est largement accepté. MSTest est à nouveau déjà intégré dans Visual Studio ...

bitbonk
la source
11
Ce tableau de comparaison est obsolète. Par exemple, NUnit a également Assert.Throws, etc., et tout dans la table Assertions est l'ancienne API. La nouvelle syntaxe fluide Assert.That (..., Is ....) est beaucoup plus agréable et existe depuis longtemps.
Jim Cooper,
11
Connaissez-vous un tableau plus à jour?
bitbonk
1
Fin 2013, déplacé de xUnit.net => NUnit. Notez également que xUnit.NET (le projet)! = XUnit (la catégorie, dont NUnit est membre)
DeepSpace101
3
@Sid pourquoi vous avez déménagé de xUnity.net => NUnit?
Alexander Logger
2
Question similaire posée en 2014 Visual Studio 2013 MSTest vs NUnit
Michael Freidgeim

Réponses:

197

Je sais que c'est un vieux fil de discussion, mais j'ai pensé publier un vote pour xUnit.NET . Alors que la plupart des autres cadres de test mentionnés sont tous à peu près les mêmes, xUnit.NET a adopté une approche assez unique, moderne et flexible pour les tests unitaires. Il change la terminologie, donc vous ne définissez plus TestFixtures et Tests ... vous spécifiez des faits et des théories sur votre code, qui s'intègre mieux avec le concept de ce qu'est un test du point de vue TDD / BDD.

xUnit.NET est également EXTRÊMEMENT extensible. Ses classes d'attributs FactAttribute et TraitAttribute ne sont pas scellées et fournissent des méthodes de base remplaçables qui vous donnent beaucoup de contrôle sur la façon dont les méthodes que ces attributs décorent doivent être exécutées. Alors que xUnit.NET dans sa forme par défaut vous permet d'écrire des classes de test qui sont similaires aux montages de test NUnit avec leurs méthodes de test, vous n'êtes pas du tout confiné à cette forme de test unitaire. Vous êtes libre d'étendre le cadre pour prendre en charge les spécifications de préoccupation / contexte / observation de style BDD, comme illustré ici .

xUnit.NET prend également en charge les tests de style d'ajustement directement prêts à l'emploi avec son attribut Théorie et les attributs de données correspondants. Les données d'entrée Fit peuvent être chargées à partir d'Excel, d'une base de données ou même d'une source de données personnalisée telle qu'un document Word (en étendant l'attribut de données de base.) Cela vous permet de capitaliser sur une plate-forme de test unique pour les tests unitaires et les tests d'intégration, qui peut être énorme pour réduire les dépendances des produits et la formation requise.

D'autres approches de test peuvent également être implémentées avec xUnit.NET ... les possibilités sont assez illimitées. Combiné à un autre cadre de simulation très tourné vers l'avenir, Moq , les deux créent une plate-forme très flexible, extensible et puissante pour la mise en œuvre de tests automatisés.

jrista
la source
35
Alors que cela était vrai il y a un an +, NUnit a depuis ajouté la plupart des attributs en question. Dans NUnit, vous pouvez écrire des tests de toute façon.
Mark Levison
8
Ce n'est pas tellement sur les attributs disponibles, mais sur la façon dont ils peuvent être utilisés. xUnit.NET a été conçu dès le départ pour être un cadre hautement flexible et extensible qui ne vous a enfermé dans aucune méthode de test particulière et ne vous oblige pas à mettre à jour régulièrement le cadre principal pour obtenir les dernières fonctionnalités.
jrista
9
1. Des noms visiblement différents sur les attributs ne feront pas grand chose. 2. NUnit était extensible et il continue d'être extensible:? 3. Les paramètres de ligne de données pour les tests sont pris en charge dans nunit. Il y a longtemps, ils étaient pris en charge dans une extension :) 4. Nunit combiné avec Moq crée la même chose. 5. Pour BDD, je dirais que le flux de données s'intègre facilement à de nombreux cadres de tests unitaires.
graffic
8
J'aime le son de xUnit, mais il a une documentation zilch :(
Colonel Panic
10
xUnit n'a aucune documentation! Par exemple: Essayez de trouver ce Traitqui fait vraiment ou si vous pouvez regrouper différents tests dans un test monoparental (par exemple, tous testsdans un testfixture). nUnit crée une excellente vue hiérarchique au lieu de la vue plate des tests de xUnit. De plus, la nomenclature n'a aucun sens - faits et théorie? Être réaliste! Ce sont mieux appelés tests et données.
DeepSpace101
134

NUnit est probablement le plus pris en charge par les outils tiers. Il existe également depuis plus longtemps que les trois autres.

Personnellement, je ne me soucie pas beaucoup des cadres de tests unitaires, les bibliothèques de simulation sont beaucoup plus importantes à mon humble avis (et vous enferment beaucoup plus). Choisissez-en un et respectez-le.

Alexander Kojevnikov
la source
3
quel est votre meilleur choix de bibliothèque fictive?
dplante
31
J'aime Moq, RhinoMocks est également bon.
Alexander Kojevnikov
5
Il peut également être utile de vérifier Pex et Moles, la partie moles en particulier est utile pour se moquer.
Charles Prakash Dasari
4
MSPec avec FakeItEasy ... rend les cas de test plus lisibles
Robie
5
MSpec avec NSubstitute et AutoFixture est mon choix.
Daniel Hilgarth
108

Je n'irais pas avec MSTest. Bien que ce soit probablement la preuve la plus future des frameworks avec Microsoft derrière, ce n'est pas la solution la plus flexible. Il ne fonctionnera pas seul sans quelques hacks. Il est donc difficile de l'exécuter sur un serveur de génération autre que TFS sans installer Visual Studio. Le test-runner de Visual Studio est en fait plus lent que Testdriven.Net + l'un des autres frameworks. Et comme les versions de ce framework sont liées aux versions de Visual Studio, il y a moins de mises à jour et si vous devez travailler avec un VS plus ancien, vous êtes lié à un MSTest plus ancien.

Je ne pense pas que cela importe beaucoup lequel des autres cadres que vous utilisez. Il est vraiment facile de passer de l'un à l'autre.

J'utilise personnellement XUnit.Net ou NUnit selon la préférence de mes collègues. NUnit est le plus standard. XUnit.Net est le framework le plus léger.

Mendelt
la source
36
J'ai été traîné à coups de pied et à crier vers cette même conclusion. Je voulais vraiment utiliser MSTest à cause de son intégration avec Visual Studio, mais c'est aussi sa faiblesse. J'ai besoin d'exécuter des tests sur un serveur de construction non Microsoft et il n'y a aucun moyen que j'installe Visual Studio dessus juste pour l'obtenir. Il est dommage que Microsoft produise d'excellents outils et les rend ensuite presque inaccessibles.
Tim Long
11
+1 pour avoir appelé l'horreur qu'est MSTest. À la fin de la journée, peu importe le cadre de test unitaire que vous utilisez, tant qu'il n'est pas MSTest
Mike Mooney
21

Pensez à compléter, et non à remplacer, MSTest par un autre cadre de test. Vous pouvez conserver l'intégration de Visual Studio MSTest tout en bénéficiant des avantages d'un framework de test plus complet.

Par exemple, j'utilise xUnit avec MSTest. Ajoutez une référence à l'assembly xUnit.dll et faites simplement quelque chose comme ceci. Étonnamment, cela fonctionne!

using Microsoft.VisualStudio.TestTools.UnitTesting;
using Assert = Xunit.Assert;  // <-- Aliasing the Xunit namespace is key

namespace TestSample
{
    [TestClass]
    public class XunitTestIntegrationSample
    {
        [TestMethod]
        public void TrueTest()
        {
            Assert.True(true);  // <-- this is the Xunit.Assert class
        }

        [TestMethod]
        public void FalseTest()
        {
            Assert.False(true);
        }
    }
}
Matt Crouch
la source
Cette technique peut également fonctionner pour NUnit, MBUnit ou d'autres cadres de test mentionnés dans d'autres réponses, mais je ne les ai pas essayés.
Matt Crouch
1
pensez-vous que je pourrais obtenir des tests paramétrés pour travailler avec MSTest avec cette approche, Matt?
DevDave
@DevDave Non. Dans son exemple, il vient d'utiliser une classe d'une autre assemblée. Si vous voulez des tests paramétrés, vous aurez besoin d'un autre framework de test spécialement conçu pour étendre MSTest.
zoran404
3
Suprisingly, it just works!Vous venez d'appeler une fonction statique d'un autre assembly. Pourquoi êtes-vous surpris que cela fonctionne? Aussi, si vous avez juste besoin d'affirmations que pourquoi ne pas utiliser un assemblage spécialement conçu pour cela?
zoran404
9

Nunit ne fonctionne pas bien avec les projets en mode mixte en C ++, j'ai donc dû le laisser tomber

Eric
la source
3
Je ne suis pas fier de cette réponse mais j'ai abandonné les tests unitaires pour ce projet. J'ai eu recours à de nombreuses procédures de validation pour la détection des erreurs lors de l'exécution
Eric
2
J'avais espéré utiliser NUnit en mode mixte, mais je l'ai également trouvé inadéquat.En fin de compte, j'ai opté pour googletest, qui est un excellent cadre de test unitaire C ++ et très simple à configurer.
chillitom
8

Ce n'est pas une grosse affaire à petite échelle / personnelle, mais cela peut devenir une grosse affaire rapidement à plus grande échelle. Mon employeur est un grand magasin Microsoft, mais ne veut pas / ne peut pas acheter Team System / TFS pour un certain nombre de raisons. Nous utilisons actuellement Subversion + Orcas + MBUnit + TestDriven.NET et cela fonctionne bien, mais obtenir TD.NET était un énorme problème. La sensibilité de la version de MBUnit + TestDriven.NET est également un gros problème, et avoir une chose commerciale supplémentaire (TD.NET) pour les aspects juridiques à examiner et l'approvisionnement à gérer et à gérer, n'est pas anodin. Mon entreprise, comme beaucoup d'entreprises, est grosse et satisfaite d'un modèle d'abonnement MSDN, et il n'est tout simplement pas habitué à gérer des achats uniques pour des centaines de développeurs. En d'autres termes, l'offre MS entièrement intégrée, bien qu'elle ne soit certainement pas toujours la meilleure du pain, est à mon avis une valeur ajoutée significative.

Je pense que nous allons rester avec notre étape actuelle car cela fonctionne et nous avons déjà surmonté la bosse sur le plan organisationnel, mais je souhaite vraiment que MS ait une offre convaincante dans cet espace afin que nous puissions consolider et simplifier un peu notre pile de développement.

user8133
la source
2
ReSharper a une offre convaincante dans cet espace!
Squirrel
7
Votre réponse est curieuse et semble contradictoire. Vous dites que vous êtes une grande boutique Microsoft, mais que vous n'utiliserez pas TFS (ce qui est le point - vous ne bénéficierez pas de l'intégration verticale sans cela) et utilisez un modèle d'abonnement MSDN, mais utilisez un non -Approche MS. Pour être honnête, je suis perdu. Réponse bien dépassée, malheureusement.
nicodemus13
6

Ce n'est pas un gros problème, il est assez facile de basculer entre eux. MSTest étant intégré n'est pas un gros problème non plus, il suffit de saisir testdriven.net.

Comme la personne précédente a dit choisir un cadre moqueur, mon préféré en ce moment est Moq.


la source