Переключение между использованием NUnit и MSTest для модульного тестирования

Как настроить решение.NET (C#, .NET 2.0), чтобы другие разработчики могли использовать одни и те же модульные тесты для решения, использующего NUnit или MSTest?

Фон:

В этом проекте некоторые разработчики используют VS2005 Team Edition, а другие используют VS2005 Pro, поэтому не все разработчики могут запускать MSTest. Учитывая, что это корпоративный проект, команда не может использовать TestDriven.net или ReSharper. Я знаю, что использование любого из этих продуктов с VS решит эту проблему, но учитывая время, которое потребуется для авторизации покупки лицензий, покупка любого из этих продуктов не является жизнеспособным вариантом.

Заранее спасибо за помощь, MagicAndi.

3 ответа

Решение

Лучшее решение, которое я нашел, - использовать простой кусок кода, который я нашел в этой статье. Просто используйте этот фрагмент кода в разделе пространства имен каждого тестового файла.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;

NUNIT в фрагменте кода относится к пользовательской конфигурации сборки для решения. Вы можете создать это с помощью VS Configuration Manager (через панель инструментов VS или свойства решения). Кроме того, вам нужно заменить все экземпляры атрибута Test NUnit в ваших методах, чтобы использовать атрибут MSTest TestMethod (или наоборот).

РЕДАКТИРОВАТЬ: Обновленный фрагмент кода выше, чтобы включить возможное решение проблемы, на которую указал Jamie Ide в комментариях. Обратите внимание, мне не удалось проверить это исправление. Обновленный фрагмент кода взят из комментария Саймона к этому сообщению в блоге.

Если вы не хотите изменять какой-либо тестовый код (то есть не хотите добавлять псевдонимы вверху), эта подгонка работает для меня:

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

Это сработало для меня, чтобы запустить MSTest через NUnit (по крайней мере, в моно с Xamarin Studio). Просто включите файл и получите правильные ссылки (вам может понадобиться другой файл проекта или условные ссылки), и все хорошо.

У вас есть смесь существующих тестов? Если нет, или вы не против конвертировать существующие MSTests, я бы стандартизировал NUnit. Я настоятельно предпочитаю NUnit, а не MSTest; это быстрее и не заставляет вас иметь глупости TestContext в ваших тестовых классах. Это также более совместимо с CI-серверами.

Другие вопросы по тегам