2009-04-02 7 views
19

Comment puis-je configurer une solution .NET (C#, .NET 2.0) pour permettre à d'autres développeurs d'utiliser les mêmes tests unitaires pour la solution en utilisant NUnit ou MSTest?Commutation entre NUnit et MSTest pour les tests unitaires

Contexte:

Dans ce projet, certains développeurs utilisent VS2005 Team Edition, et d'autres utilisent de VS2005 Pro, donc pas tous les développeurs sont en mesure d'exécuter MSTest. Étant donné qu'il s'agit d'un projet d'entreprise, l'équipe n'est pas en mesure d'utiliser TestDriven.net ou ReSharper. Je suis conscient que l'utilisation de l'un ou l'autre de ces produits avec VS permettrait de résoudre ce problème, mais étant donné le temps qu'il faudrait pour autoriser l'achat de licences, l'achat de l'un de ces produits n'est pas une option viable. Merci d'avance pour votre aide, MagicAndi.

Répondre

24

La meilleure solution que j'ai trouvé est de faire usage d'un simple morceau de code que j'ai trouvé dans ce article. Il suffit d'utiliser cet extrait de code dans la section d'espace de noms de chaque fichier de test .cs:

#if NUNIT 
using TestClass = NUnit.Framework.TestFixtureAttribute; 
using TestMethod = NUnit.Framework.TestAttribute; 
using TestCleanup = NUnit.Framework.TearDownAttribute; 
using TestInitialize = NUnit.Framework.SetUpAttribute; 
using ClassCleanup = NUnit.Framework.TestFixtureTearDownAttribute; 
using ClassInitialize = NUnit.Framework.TestFixtureSetUpAttribute; 
#else 
using Microsoft.VisualStudio.TestTools.UnitTesting; 
#endif 

using NUnitAssert = NUnit.Framework.Assert; 
using MsAssert = Microsoft.VisualStudio.TestTools.UnitTesting.Assert; 

Le NUNIT dans l'extrait de code fait référence à une configuration de construction personnalisée pour la solution. Vous pouvez créer ceci en utilisant VS Configuration Manager (via la barre d'outils VS ou les propriétés de la solution). En outre, vous devez remplacer toutes les instances de l'attribut Test de NUnit sur vos méthodes pour utiliser l'attribut MSTest TestMethod (ou vice versa).

EDIT: Mise à jour de l'extrait de code ci-dessus pour inclure un correctif possible pour le problème Jamie Ide signalé dans les commentaires. Remarque, je n'ai pas réussi à tester cette correction. L'extrait de code mis à jour provient d'un commentaire de Simon sur ce blog post.

+1

De plus, il existe au moins une méthode assert, IsInstanceOfType, qui est incompatible car l'ordre d'argument est inversé. –

+0

StringAssert.Contains est également incompatible, les arguments sont également inversés. –

1

Avez-vous un mélange de tests existants? Si ce n'est pas le cas, ou si cela ne vous dérange pas de convertir des MSTests existants, je standardiserais NUnit. Je préfère fortement NUnit à MSTest; c'est plus rapide et cela ne vous oblige pas à avoir le non-sens de TestContext dans vos classes de test. C'est aussi plus compatible avec les serveurs CI.

+0

Jamie, j'aurais tendance à le faire moi-même, mais la tendance dans l'équipe est de standardiser MSTest. Cependant, il existe des tests hérités dans NUnit, et il faudra quelques mois pour que le reste de l'équipe puisse mettre à niveau ses PC DEV pour utiliser VS Team System. C'est fondamentalement une solution à court et à moyen terme. Merci – MagicAndi

+1

Le truc 'TestContext' peut être supprimé en toute sécurité. – mafu

7

Si vous ne voulez pas changer tout code de test (ne veux pas ajouter l'aliasing en haut), cette cale fonctionne pour moi:

using System; 
using System.Collections; 

namespace Microsoft.VisualStudio.TestTools.UnitTesting 
{ 
    public class Placeholder{} 
    public class TestClassAttribute : NUnit.Framework.TestFixtureAttribute 
    { 
    } 
    public class TestInitializeAttribute : NUnit.Framework.SetUpAttribute 
    { 
    } 
    public class TestMethodAttribute : NUnit.Framework.TestAttribute 
    { 
    } 
    public class TestCleanupAttribute : NUnit.Framework.TearDownAttribute 
    { 
    } 
    public class IgnoreAttribute : NUnit.Framework.IgnoreAttribute 
    { 
    } 
    public class ExpectedExceptionAttribute : NUnit.Framework.ExpectedExceptionAttribute 
    { 
     public ExpectedExceptionAttribute(Type exceptionType) : this(exceptionType, null) 
     { 
     } 
     public ExpectedExceptionAttribute(Type exceptionType, string message) : base(exceptionType) 
     { 
      UserMessage = message; 
     } 
    } 
    public class TestContext : NUnit.Framework.TestContext 
    { 
     public TestContext(IDictionary dictionary) : base(dictionary) 
     { 
     } 
    } 
    public class Assert : NUnit.Framework.Assert 
    { 
     public static void IsInstanceOfType(object obj, Type type) 
     { 
      NUnit.Framework.Assert.IsInstanceOfType (type, obj, null); 
     } 
     public static void IsInstanceOfType(object obj, Type type, string message) 
     { 
      NUnit.Framework.Assert.IsInstanceOfType (type, obj, message); 
     } 
    } 
} 

Cela a fonctionné pour moi exécuter MSTest via NUnit (au moins sous mono avec Xamarin Studio). Il suffit d'inclure le fichier et d'obtenir des références correctes (vous pouvez avoir besoin d'un fichier de projet différent ou conditional references), et vous êtes bon.

+0

Excellente substance !! – MagicAndi

Questions connexes