如何配置.NET解决方案(C#,.NET 2.0)以允许其他开发人员使用NUnit或MSTest对解决方案使用相同的单元测试?
背景:
在这个项目中,一些开发人员使用VS2005 Team Edition,而其他开发人员使用VS2005 Pro,因此并非所有开发人员都能运行MSTest。鉴于这是一个企业项目,团队无法使用TestDriven.net或ReSharper。我知道使用VS中的任何一种产品都可以解决这个问题,但考虑到授权购买许可证所需的时间,购买这些产品中的任何一种都不是一个可行的选择。
先谢谢你的帮助, MagicAndi。
答案 0 :(得分:24)
我找到的最佳解决方案是使用我在article中找到的一段简单代码。只需在每个.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属性(反之亦然)。
编辑:更新了上面的代码段,以包含评论中指出的问题Jamie Ide的可能修复程序。请注意,我还没有设法测试此修复程序。更新的代码段取自Simon对此blog post的评论。
答案 1 :(得分:9)
如果你不想更改任何测试代码(即不想在顶部添加别名),这个垫片对我有用:
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
{
}
}
这对我来说通过NUnit运行MSTest(至少在Xamarin Studio的单声道下运行)。只需包含文件并获取正确的引用(您可能需要一个不同的项目文件或conditional references),并且您很好。
答案 2 :(得分:1)
您是否混合使用现有测试?如果没有,或者您不介意转换现有的MSTests,我会在NUnit上进行标准化。我非常喜欢NUnit而不是MSTest;它更快,并且不会强迫您在测试类中使用TestContext废话。它也与CI服务器更兼容。