2009-04-02 11 views
19

¿Cómo puedo configurar una solución .NET (C#, .NET 2.0) para permitir que otros desarrolladores utilicen las mismas pruebas unitarias para la solución usando NUnit o MSTest?Alternar entre utilizar NUnit y MSTest para pruebas unitarias

Antecedentes:

En este proyecto, algunos desarrolladores usar VS2005 Team Edition, y otros hacen uso de VS2005 Pro, por lo que no todos los desarrolladores son capaces de correr MSTest. Dado que este es un proyecto de Enterprise, el equipo no puede utilizar TestDriven.net o ReSharper. Soy consciente de que usar cualquiera de estos productos con VS resolvería este problema, pero dado el tiempo que llevaría autorizar la compra de licencias, comprar cualquiera de estos productos no es una opción viable.

Gracias de antemano por su ayuda, MagicAndi.

Respuesta

24

La mejor solución que he encontrado es hacer uso de un código simple que encontré en este article. Sólo tiene que utilizar este fragmento de código en la sección de espacio de nombre de cada archivo de prueba .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; 

El NUNIT en el fragmento de código se refiere a una configuración de generación personalizada para la solución. Puede crear esto usando VS Configuration Manager (a través de la barra de herramientas VS o las propiedades de la solución). Además, debe reemplazar todas las instancias del atributo Prueba de NUnit en sus métodos para hacer uso del atributo MSTest TestMethod (o viceversa).

EDITAR: actualicé el fragmento de código anterior para incluir una posible solución para el problema Jamie Ide señalado en los comentarios. Tenga en cuenta que no he podido probar esta solución. El fragmento de código actualizado se toma de un comentario de Simon en este blog post.

+1

Además, hay al menos un método assert, IsInstanceOfType, que es incompatible porque el orden de los argumentos se invierte. –

+0

StringAssert.Contains también es incompatible, los argumentos también se invierten. –

1

¿Tiene una combinación de pruebas existentes? De lo contrario, o no te importa convertir MSTests existentes, estandarizaría en NUnit. Yo prefiero NUnit sobre MSTest; es más rápido y no te obliga a tener las tonterías de TestContext en tus clases de prueba. También es más compatible con los servidores de CI.

+0

Jamie, tendería a esto yo mismo, pero la tendencia en el equipo es estandarizar en MSTest. Sin embargo, existen pruebas heredadas en NUnit, y llevará algunos meses lograr que el resto del equipo actualice sus PC DEV para usar el Sistema de equipo VS. Esto es básicamente una solución a corto y mediano plazo. Gracias – MagicAndi

+1

La cosa 'TestContext' se puede eliminar de forma segura. – mafu

7

Si no desea cambiar ningún código de prueba (es decir, no quieren añadir el aliasing en la parte superior), este suplemento funciona para mí:

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

Esto ha funcionado para mí ejecutar MSTest vía NUnit (al menos en mono con Xamarin Studio). Simplemente incluya el archivo y obtenga las referencias correctas (puede necesitar un archivo de proyecto diferente o conditional references), y estará bien.

+0

Excelentes cosas! – MagicAndi

Cuestiones relacionadas