2009-04-02 14 views
19

Come configurare una soluzione .NET (C#, .NET 2.0) per consentire ad altri sviluppatori di utilizzare gli stessi test di unità per la soluzione utilizzando NUnit o MSTest?Passaggio tra l'utilizzo di NUnit e MSTest per il test dell'unità

Background:

In questo progetto, alcuni sviluppatori utilizzare VS2005 Team Edition, ed altri fanno uso di VS2005 Pro, quindi non tutti gli sviluppatori sono in grado di eseguire MSTest. Dato che si tratta di un progetto Enterprise, il team non è in grado di utilizzare TestDriven.net o ReSharper. Sono consapevole che l'utilizzo di uno di questi prodotti con VS risolverebbe questo problema, ma dato il tempo necessario per autorizzare l'acquisto di licenze, l'acquisto di uno di questi prodotti non è un'opzione praticabile.

Grazie in anticipo per il vostro aiuto, MagicAndi.

risposta

24

La soluzione migliore che ho trovato è quella di utilizzare un semplice pezzo di codice che ho trovato in questo article. Basta usare questo frammento di codice nella sezione di spazio dei nomi di ogni file .cs prova:

#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; 

Il NUNIT nel frammento di codice si riferisce a una configurazione di generazione personalizzata per la soluzione. È possibile crearlo utilizzando VS Configuration Manager (tramite la barra degli strumenti VS o le proprietà della soluzione). Inoltre, è necessario sostituire tutte le istanze dell'attributo NUnit's Test sui propri metodi per utilizzare l'attributo MSTest TestMethod (o viceversa).

MODIFICA: aggiornato lo snippet di codice sopra per includere una possibile correzione per il problema Jamie Ide evidenziato nei commenti. Nota, non sono riuscito a testare questa correzione. Lo snippet di codice aggiornato è tratto da un commento di Simon su questo blog post.

+1

Inoltre, esiste almeno un metodo di asserzione, IsInstanceOfType, che non è compatibile poiché l'ordine degli argomenti è invertito. –

+0

StringAssert.Contains è anche incompatibile, anche gli argomenti sono invertiti. –

1

Hai un mix di test esistenti? In caso contrario, o non ti dispiace convertire gli MSTest esistenti, vorrei standardizzare su NUnit. Preferisco fortemente NUnit over MSTest; è più veloce e non ti costringe ad avere assurdità TestContext nelle tue classi di test. È anche più compatibile con i server CI.

+0

Jamie, mi tenderei a questo, ma la tendenza del team è di standardizzare su MSTest. Tuttavia, ci sono test legacy in NUnit e ci vorranno alcuni mesi per consentire al resto del team di aggiornare i propri PC DEV per utilizzare VS Team System. Questa è fondamentalmente una soluzione a breve e medio termine. Grazie – MagicAndi

+1

Il thingy 'TestContext' può essere cancellato in modo sicuro. – mafu

7

Se non si desidera modificare alcun codice prova (vale a dire non si vuole aggiungere l'aliasing in alto), questo spessore funziona per me:

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); 
     } 
    } 
} 

Questo ha funzionato per me per eseguire MSTest tramite NUnit (almeno sotto mono con Xamarin Studio). Basta includere il file e ottenere i riferimenti giusti (potrebbe essere necessario un file di progetto diverso o conditional references) e tu sei bravo.

+0

Roba eccellente !! – MagicAndi