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

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

Задний план:

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

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


person MagicAndi    schedule 02.04.2009    source источник


Ответы (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 или свойства решения). Кроме того, вам необходимо заменить все экземпляры атрибута NUnit Test в ваших методах, чтобы использовать атрибут MSTest TestMethod (или наоборот).

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

person MagicAndi    schedule 02.04.2009
comment
Кроме того, существует по крайней мере один метод утверждения, IsInstanceOfType, который несовместим, поскольку порядок аргументов обратный. - person Jamie Ide; 02.04.2009
comment
StringAssert.Contains также несовместим, аргументы также меняются местами. - person Jeff Pearce; 05.04.2014

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

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);
        }
    }
    public class CollectionAssert : NUnit.Framework.CollectionAssert
    {
    }
}

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

person Tim Erickson    schedule 31.07.2015

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

person Jamie Ide    schedule 02.04.2009
comment
Джейми, я бы сам к этому склонился, но в команде есть тенденция стандартизировать MSTest. Тем не менее, в NUnit есть устаревшие тесты, и потребуется несколько месяцев, чтобы остальная часть команды обновила свои ПК DEV для использования VS Team System. Это в основном краткосрочное и среднесрочное решение. Спасибо - person MagicAndi; 02.04.2009
comment
Штучку TestContext можно смело удалять. - person mafu; 16.04.2010