2009-04-02 7 views
19

他の開発者がNUnitまたはMSTestを使用して同じユニットテストをソリューションで使用できるようにするには、.NETソリューション(C#、.NET 2.0)をどのように設定できますか?ユニットテストのためのNUnitとMSTestの切り替え

背景:本プロジェクトで

、一部の開発者は、VS2005チームエディションを使用し、他はプロVS2005を利用して、そうではないすべての開発者のはMSTestを実行することができます。これはエンタープライズプロジェクトであるため、チームはTestDriven.netまたはReSharperを使用できません。これらの製品のいずれかを使用してVSがこの問題を解決することは承知していますが、ライセンスの購入を許可するのにかかる時間を考えれば、これらの製品のいずれかを購入することは実行可能な選択肢ではありません。

ご協力いただきありがとうございます。 MagicAndi。

答えて

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ツールバーまたはソリューションのプロパティを使用して)VS構成マネージャを使用します。また、メソッドのNUnitのTest属性のすべてのインスタンスを置き換えて、MSTest TestMethod属性を使用する必要があります(またはその逆)。

EDIT:上記のコードスニペットを修正して、問題の可能性のある修正をコメントに追加しました。Jamie Ideがコメントに指摘されています。注:この修正プログラムをテストすることはできませんでした。更新されたコードスニペットは、Simonのコメントblog postのコメントから取得されます。

+1

さらに、少なくとも1つのアサートメソッドIsInstanceOfTypeがあります。これは、引数の順序が逆になるため互換性がありません。 –

+0

StringAssert.Containsも互換性がなく、引数も逆になります。 –

1

既存のテストが混在していますか?そうでない場合、または既存のMSTestを変換しても構わない場合は、NUnitで標準化します。私は強くMSTestよりもNUnitを好む。より速く、テストクラスでTestContextをナンセンスにすることを強要しません。 CIサーバーとの互換性も向上しています。

+0

Jamie、私はこのような傾向がありますが、チームの傾向はMSTestで標準化することです。しかし、NUnitには従来のテストがあり、残りのチームにDEV Team PCをVS Team Systemにアップグレードさせるまでに数ヶ月かかるでしょう。これは基本的に短期的なものから中期的なものです。 Thanks – MagicAndi

+1

'TestContext'は安全に削除できます。 – mafu

7

あなたは(つまりは上部にエイリアシングを追加する必要はありません)にどんなテストコードを変更したくない場合は、このシムは、私の作品:

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

これは私のために働いていますNUnit経由でMSTestを実行する(少なくともXamarin Studioでモノラルで)。ファイルをインクルードして参照を取得するだけで(別のプロジェクトファイル(conditional references)が必要な場合があります)、あなたはうまくいきます。

+0

優れたもの! – MagicAndi

関連する問題