在使用NUnit和MSTest进行单元测试之间切换

时间:2009-04-02 11:28:16

标签: .net unit-testing nunit mstest

如何配置.NET解决方案(C#,.NET 2.0)以允许其他开发人员使用NUnit或MSTest对解决方案使用相同的单元测试?

背景:

在这个项目中,一些开发人员使用VS2005 Team Edition,而其他开发人员使用VS2005 Pro,因此并非所有开发人员都能运行MSTest。鉴于这是一个企业项目,团队无法使用TestDriven.net或ReSharper。我知道使用VS中的任何一种产品都可以解决这个问题,但考虑到授权购买许可证所需的时间,购买这些产品中的任何一种都不是一个可行的选择。

先谢谢你的帮助, MagicAndi。

3 个答案:

答案 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服务器更兼容。