Test unitaire, NUnit ou Visual Studio?

114

J'utilise Visual studio (parfois resharper) pour exécuter mon test unitaire.

J'ai entendu parler de NUnit, mais je n'en sais pas grand-chose ...

Dois-je m'en soucier? Peut-il offrir quelque chose de mieux que le studio visuel?

Dois-je utiliser NUnit et pourquoi?

Tim
la source
12
considérez également xunit, mais quoi que vous fassiez, jetez un œil à TestDriven.net
Ian Ringrose
Voir aussi stackoverflow.com/questions/707444/…
David Schmitt
essayez xunit.net. C'est un cadre de test unitaire open source et agréable pour l'application .net.
Mukesh Arora

Réponses:

100

NUnit a peu d'avantages par rapport à MS-Test

  1. Attribut Suite - peut agréger les tests et les exécuter séparément (utile pour les grands projets avec des tests rapides et lents par exemple)
  2. Méthode Assert lisible, par exemple Assert.AreEqual(expected, actual)vsAssert.That(actual, Is.EqualTo(expected))
  3. NUnit a des mises à jour de version fréquentes - MS-Test n'en a qu'une par version VS.
  4. De nombreux coureurs intégrés, y compris Resharper et TestDriven.NET
  5. Assertion de message d'exception attendue - peut être effectuée à l'aide de l'attribut dans NUnit mais doit être effectuée à l'aide de Try-Catch dans MS-Test
  6. [TestCase]! NUnit permet des tests paramétrés.
Élisée
la source
32
L'exception peut également être affirmée par attribut dans MS-Test: ExpectedExceptionAttribute.
Stefan Steinegger
9
J'utiliserais NUnit avec Assert.Throws <> () car cela suit le principe AAA, ce qui n'est pas le cas pour l'attribut.
Oliver Hanappi
25
# 3 n'est pas une fonctionnalité, c'est un problème et # 5 est faux à 100%; MS Test a l'attribut ExpectedException et l'a toujours fait .
Randolpho
4
@Elisha Si je me souviens bien, ils n'ont délibérément pas pris en charge la vérification du texte des messages car le texte n'est pas considéré comme significatif et peut être arbitraire. Autrement dit, cela n'affecte pas le flux d'un programme.
Rob Kent
7
"# 3 n'est pas une fonctionnalité, c'est un problème" - ne semble pas être une façon de penser très agile ...
SamuelKDavis
72

De mon point de vue actuel (après 8 mois de développement avec environ 10 développeurs en moyenne) Je conseillerais contre l' utilisation MSTest pour les raisons suivantes

  • Le cadre en lui-même est assez lent. Je ne parle pas du code de test que vous écrivez - c'est sous votre contrôle. Je veux dire que le cadre exécutant ces tests est lent, qu'il s'agisse d'une suite de tests, de tests uniques, etc.
  • La nécessité de conserver un fichier Test-Metadata qui entraîne toujours des complications lorsque plusieurs développeurs y travaillent (recréation par exemple des métadonnées etc.). Toutes les autres suites de tests n'ont pas besoin d'un fichier de métadonnées. C'est plutôt agréable d'organiser vos tests, mais vous pouvez obtenir la même chose grâce aux espaces de noms, aux classes et aux noms de méthodes.
  • Si vous effectuez une intégration continue, si vous souhaitez exécuter des tests unitaires sur votre machine de génération, vous devrez installer Visual Studio sur cette machine.

En d'autres termes, si je devais me décider à nouveau il y a 8 mois, je prendrais probablement NUnit. Je n'ai peut-être pas le rapport de résultats de test intégré, mais les développeurs auraient une expérience de test plus transparente.

flq
la source
6
+1, évitez MSTest sauf si vous n'avez pas le choix. Les différents frameworks open-source sont meilleurs (xUnit, NUnit, MbUnit, etc.).
Brannon
49

Voici mon expérience avec MS Test

  • Nous exécutons MS Test avec environ 3800 tests.
  • L'exécution des tests prend beaucoup de temps, ce qui est douloureux lors de l'exécution de tests uniques.
  • Il faut environ 1 Go de mémoire pour exécuter les tests. Non, ce n'est pas dû à des fuites de mémoire lors de nos tests. Souvent, nous rencontrons OutOfMemoryExceptions.
  • Parce qu'il utilise autant de ressources, nous commençons à exécuter les tests à partir de fichiers batch. Alors, à quoi sert toute l'intégration?
  • Il est bogué et instable:
    • Par exemple, si vous supprimez l'attribut [Ignorer] d'un test, il ne le reconnaît pas, car il met en cache des informations sur les tests quelque part. Vous devez actualiser la liste de test, ce qui résout parfois le problème, ou redémarrer VS.
    • Il ne copie pas au hasard les assemblys de référence dans le répertoire out.
    • Les éléments de déploiement (fichiers supplémentaires à utiliser) ne fonctionnent tout simplement pas correctement. Ils sont ignorés au hasard.
  • Il y a des informations cachées (non visibles dans le code de test) dans les fichiers vsmdi et testrunconfig. Si vous ne vous en souciez pas, cela pourrait ne pas fonctionner.
  • Sur le plan fonctionnel, cela peut être comparable à NUnit, mais cela coûte très cher si vous envisagez d'utiliser l'édition de testeur VS.

Ajout: Nous avons encore quelques tests maintenant, nous ne pouvons même pas dire combien. Il est impossible de tous les exécuter à partir de Visual Studio, en raison d'OutOfMemoryExceptions et d'autres problèmes d'instabilité. Nous exécutons les tests à partir de scripts. Il serait facile d'afficher les résultats des tests dans Visual Studio, mais lorsque la solution est ouverte, VS plante (à chaque fois). Nous devons donc rechercher les tests qui échouent à l'aide de la recherche de texte. Il n'y a plus d'avantage d'un outil intégré.


Une autre mise à jour : nous utilisons VS 2013 maintenant. Beaucoup de choses ont changé. Ils ont réécrit le lanceur de test MS Test pour la troisième fois depuis que nous avons commencé. Cela a causé beaucoup de changements de rupture, mais aucune des nouvelles versions ne faisait rien de mieux. Nous sommes heureux de ne pas avoir utilisé les fonctionnalités sophistiquées de MS Test, car elles ne sont plus prises en charge. C'est vraiment dommage. Nous utilisons toujours des scripts pour construire et exécuter tous les tests unitaires, car c'est plus pratique. Visual Studio a nécessité quelques minutes pour démarrer l'exécution des tests (temps après compilation jusqu'au démarrage du premier test). Ils le corrigent probablement avec une mise à jour et cela pourrait être un problème spécifique de notre projet. Cependant, Resharper est beaucoup plus rapide lors de l'exécution des mêmes tests.

Conclusion : Au moins en combinaison avec Resharper, MS Test est utile. Et j'espère qu'ils découvriront enfin comment le lanceur de tests doit être écrit et qu'ils ne feront pas ce genre de changements de rupture lorsque nous mettrons à jour Visual Studio la prochaine fois.

Stefan Steinegger
la source
J'ai récemment commencé à les exécuter sans débogage, ce qui le rend beaucoup plus rapide et ressemble beaucoup plus à la façon dont NUnit pourrait être utilisé, mais c'est toujours nul. Il semble que les mauvaises performances soient liées au fait que Visual Studio effectue des tâches géniales lors du débogage. (Autrement dit, utilisez "ctrl + F5" plutôt que simplement "F5" - vous obtenez toujours la belle "intégration" avec VS)
Arafangion
Bonne réponse, j'ai gagné du temps
FindOutIslamNow
18

NUnit peut être utilisé en combinaison avec Visual Studio. C'est un cadre et non un programme séparé. Donc, vous pourriez vous soucier de voir si cela vous convient :).

texte alternatif http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=nunitit&DownloadId=61802

"Après avoir installé le plugin, vous trouverez un nouveau sous-menu dans le menu des outils."

Voir http://nunitit.codeplex.com/ pour plus d'informations sur son importation.

En outre, beaucoup de choses peuvent être trouvées en utilisant la recherche de SO. Cette rubrique répertorie les avantages de NUnit par rapport aux tests standard MS, par exemple.

Bastijn
la source
3

NUnit fonctionne avec l'édition Standard de VS.

Par Erik Stendahl
la source
1
N'oubliez pas les versions express de Visual Studios.
chobo2
Étape de post-construction sur le projet d'assemblage de test unitaire - \ path \ to \ nUnit $ (TargetFileName)
Steve Gilham
1

Je ne suis pas sûr des autres, mais NUnit fournit une interface graphique et une console sympa pour exécuter vos tests unitaires et vous pouvez également générer un rapport sur le résultat de l'exécution du test NUnit qui donnerait le détail de l'endroit où le test a échoué ou réussi et à quelle heure l'a fait prendre pour votre test unitaire

Vinay Pandey
la source
1

NUnit est un framework de test unitaire, également pris en charge par resharper. Je pense que vous utilisez le cadre de test unitaire de Microsoft, donc NUnit n'est qu'une alternative au produit de Microsoft;)

Voici le lien vers la page d'accueil de NUnit: http://nunit.org

Oliver Hanappi
la source
alors vous voulez dire que nunit n'apporte rien d'autre que le cadre de test unitaire de Microsoft?
Tim
C'est le cas, voir mon lien par exemple dans mon post (ci-dessus).
bastijn
J'utilise NUnit et je ne connais pas vraiment le cadre de test unitaire de Microsoft, donc je ne peux pas dire ce qui est mieux. Je pense qu'il y a de bonnes chances que vous trouviez un sujet sur les différences ici sur SO.
Oliver Hanappi
Il fournit des constructions utiles telles que [TestCase] ​​pour exécuter une méthode de test avec différents arguments, [Theory] - pour construire des spécifications plus élaborées et d'autres. Il prend également en charge une très belle syntaxe fluide pour les assertions. Et, dernier mais non le moindre, il est utilisé beaucoup plus largement que MSTest, vous aurez donc de meilleures chances d'obtenir de l'aide / des informations en cas de problème.
Elder_george
0

Dans NUnit , les tests ne sont pas exécutés en parallèle. Au contraire, il semble que tous les tests s'exécutent sur un seul thread. Dans MSTest, chaque test est instancié sur un thread séparé, ce qui entraîne l'entrelacement des exécutions. Par conséquent, si le test A dépend du test B pour son succès, il échouera probablement car le test B commencera probablement à s'exécuter pendant l'exécution du test A.

Mourad Samy
la source
-12

Si vous utilisez Visual Studio, vous devez utiliser NUnit pour effectuer des tests unitaires, et si vous exécutez java (Netbeans), vous devez utiliser JUnit pour les tests unitaires.

Voici un exemple de test unitaire simple de la calculatrice

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SimpleCalculator;
using NUnit.Framework;

namespace CalculatorTest
{
    [TestFixture]
    public class Class1
    {
        public Calculator _calculator;
        [TestFixtureSetUp]
        public void Initialize()
        {
            _calculator = new Calculator();
        }
        [Test]
        public void DivideTest()
        {
            int a = 10;
            int b = 2;
            int expectedValue = a / b;
            int actualvalue = _calculator.Divide(a, b);
            Assert.AreEqual(expectedValue, actualvalue,"Failure");

        }
    }
}
Nipuna Prashan
la source
4
Bien sûr, vous n'êtes pas obligé d'utiliser NUnit, c'est juste un framework, personne ne vous oblige à l'utiliser. Vous pouvez même écrire le vôtre si vous vous ennuyez.
HimBromBeere