Переключение между использованием 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-серверами.