MSTestにはNUnitのTestCaseに相当するものがありますか?


107

TestCaseNUnit の機能は、テストごとに個別のメソッドを必要とせずにテストパラメーターをすばやく指定する方法として非常に便利です。MSTestに同様のものはありますか?

 [TestFixture]  
 public class StringFormatUtilsTest  
 {  
     [TestCase("tttt", "")]  
     [TestCase("", "")]  
     [TestCase("t3a4b5", "345")]  
     [TestCase("3&5*", "35")]  
     [TestCase("123", "123")]  
     public void StripNonNumeric(string before, string expected)  
     {  
         string actual = FormatUtils.StripNonNumeric(before);  
         Assert.AreEqual(expected, actual);  
     }  
 }  


NUnitを使用しないのはなぜですか?
Mike de Klerk、2015

1
@MikedeKlerk:Entity Frameworkを使用している場合、Nunitは信じられないほど遅くなります...テストを実行するたびに、生成されたすべてのクラスに反映されるようです。
Robert Harvey、

一般的に言って、NUnitはMSTestよりも多くの機能を備えています。VSTest Explorerでテストを実行できるようにするためだけにMSTestを使用している場合、NuGetを介してNUnit Test Adapter拡張機能をインストールすることで同じことができます
スタック

1
試してみてくださいDataRow()を参照してください:blogs.msdn.microsoft.com/devops/2016/06/17/...
ババク

回答:


62

マイクロソフトは最近「MSTest V2」を発表しました(ブログ記事を参照)。これにより、-デスクトップを一貫して(デスクトップ、UWPなど)使用できますDataRow

 [TestClass]  
 public class StringFormatUtilsTest  
 {  
     [DataTestMethod]  
     [DataRow("tttt", "")]  
     [DataRow("", "")]  
     [DataRow("t3a4b5", "345")]  
     [DataRow("3&5*", "35")]  
     [DataRow("123", "123")]  
     public void StripNonNumeric(string before, string expected)  
     {  
         string actual = FormatUtils.StripNonNumeric(before);  
         Assert.AreEqual(expected, actual);  
     }  
 } 

繰り返しますが、Visual Studio Expressのテストエクスプローラーは、残念ながらこれらのテストを認識しません。しかし、少なくとも「完全」なVSバージョンはその機能をサポートしています。

これを使用するには、NuGetパッケージのMSTest.TestFrameworkMSTest.TestAdapterをインストールするだけです(現在両方ともプレリリース)。

古い答え:

MSTestに固執する必要がなく、テストエクスプローラーを介してテストを実行できるようにするためだけに使用している場合 Visual Studio Expressエディションしかないため、これはあなたのための解決策かもしれません:

テストエクスプローラーを介してNUnitテストを実行できるようにするVsTestAdapter VSIX拡張機能があります。残念ながら、VS Expressユーザーは拡張機能をインストールできません...しかし、幸運なことに、VsTestAdapterにはプレーンなNuGet-Package付属しています。

したがって、VS Expressユーザーの場合は、VsTestAdapter NuGet-Packageをインストールするだけで、テストエクスプローラーを介してNUnitテスト/テストケースを実行できます。


残念ながら、前述の説明は真実ではありません。Expressエディションを介してパッケージをインストールすることは完全に可能ですが、テストエクスプローラーを利用できないため、無意味です。以前のバージョンのTestAdapterには、2.0.0の説明ページから削除されたサイドノートがありました。

VS Expressでは機能しないことに注意してください


4
MSTest "v2"がVS 2017を使用する場合のデフォルトのフレームワークになりました。これは最新バージョンでOOTBをサポートするようになったので、その情報はおそらく回答の先頭にあるはずです。
Marc

34

私はこれが遅い答えであることを知っていますが、うまくいけば他の人を助けるのに役立ちます。

私はどこでもエレガントな解決策を探し、自分で書いてしまいました。数千の単体テストと数十万回の反復を伴う20以上のプロジェクトで使用しています。ビートを逃したことはありません。

https://github.com/Thwaitesy/MSTestHacks

1)NuGetパッケージをインストールします。

2) TestBaseからテストクラスを継承する

public class UnitTest1 : TestBase
{ }

3) IEnumerableを返すプロパティ、フィールド、またはメソッドを作成する

[TestClass]
public class UnitTest1 : TestBase
{
    private IEnumerable<int> Stuff
    {
        get
        {
            //This could do anything, get a dynamic list from anywhere....
            return new List<int> { 1, 2, 3 };
        }
    }
}

4)上記のIEnumerable名を指すように、MSTest DataSource属性をテストメソッドに追加します。これは完全に修飾する必要があります。

[TestMethod]
[DataSource("Namespace.UnitTest1.Stuff")]
public void TestMethod1()
{
    var number = this.TestContext.GetRuntimeDataSourceObject<int>();

    Assert.IsNotNull(number);
}

最終結果:通常のDataSourceと同様に3回の反復:)

using Microsoft.VisualStudio.TestTools.UnitTesting;
using MSTestHacks;

namespace Namespace
{
    [TestClass]
    public class UnitTest1 : TestBase
    {
        private IEnumerable<int> Stuff
        {
            get
            {
                //This could do anything, get a dynamic list from anywhere....
                return new List<int> { 1, 2, 3 };
            }
        }

        [TestMethod]
        [DataSource("Namespace.UnitTest1.Stuff")]
        public void TestMethod1()
        {
            var number = this.TestContext.GetRuntimeDataSourceObject<int>();

            Assert.IsNotNull(number);
        }
    }
}

これは、各ケースの複数のパラメーターでも機能しますか?
Lonefish

基になるライブラリに変更があったため、これはMsTest "v2"では機能しません。これはVS15(VS 2017)のデフォルトです。
マークL.

3
はい、MSTest V2を使用している場合は、NUnitに似た新しいテストケースプロバイダーがあります。👏周りにこの作品のためにこのように必要はありません
Thwaitesy

これはVS 2015では機能していないようで、アプリ構成ファイルが動的に入力されないため、データソースが見つかりません
リード

13

私はこれが別の遅い答えであることを知っていますが、MSテストフレームワークの使用に縛られている私のチームでは、匿名データのみに依存してテストデータの配列を保持し、LINQをループして各行をテストする手法を開発しました。追加のクラスやフレームワークを必要とせず、かなり読みやすく理解しやすい傾向があります。また、外部ファイルや接続されたデータベースを使用するデータ駆動型テストよりも実装がはるかに簡単です。

たとえば、次のような拡張メソッドがあるとします。

public static class Extensions
{
    /// <summary>
    /// Get the Qtr with optional offset to add or subtract quarters
    /// </summary>
    public static int GetQuarterNumber(this DateTime parmDate, int offset = 0)
    {
        return (int)Math.Ceiling(parmDate.AddMonths(offset * 3).Month / 3m);
    }
}

匿名型の配列をLINQに組み合わせて使用​​して、次のようなテストを作成できます。

[TestMethod]
public void MonthReturnsProperQuarterWithOffset()
{
    // Arrange
    var values = new[] {
        new { inputDate = new DateTime(2013, 1, 1), offset = 1, expectedQuarter = 2},
        new { inputDate = new DateTime(2013, 1, 1), offset = -1, expectedQuarter = 4},
        new { inputDate = new DateTime(2013, 4, 1), offset = 1, expectedQuarter = 3},
        new { inputDate = new DateTime(2013, 4, 1), offset = -1, expectedQuarter = 1},
        new { inputDate = new DateTime(2013, 7, 1), offset = 1, expectedQuarter = 4},
        new { inputDate = new DateTime(2013, 7, 1), offset = -1, expectedQuarter = 2},
        new { inputDate = new DateTime(2013, 10, 1), offset = 1, expectedQuarter = 1},
        new { inputDate = new DateTime(2013, 10, 1), offset = -1, expectedQuarter = 3}
        // Could add as many rows as you want, or extract to a private method that
        // builds the array of data
    }; 
    values.ToList().ForEach(val => 
    { 
        // Act 
        int actualQuarter = val.inputDate.GetQuarterNumber(val.offset); 
        // Assert 
        Assert.AreEqual(val.expectedQuarter, actualQuarter, 
            "Failed for inputDate={0}, offset={1} and expectedQuarter={2}.", val.inputDate, val.offset, val.expectedQuarter); 
        }); 
    }
}

この手法を使用する場合、アサートに入力データを含むフォーマットされたメッセージを使用すると、どの行がテストを失敗させるかを特定するのに役立ちます。

AgileCoder.netで、このソリューションの背景と詳細をブログに書いています。


4
これに関する最大の問題は、値の配列からいずれかのケースが失敗した場合-テスト全体が失敗し、それ以上のケースがテストされないことです。
ytoledano

これにより、相互に影響する可能性のあるテストケースが作成されます。
BartoszKP 2016

@BartoszKPテスト中のシステムに副作用がある場合のみ。この場合、これはおそらく最適な手法ではありません。
Gary.Ray 2016

@ Gary.Rayまた、システムにまだ副作用がない場合。また、テストに合格せず、別の開発者がそれを修正しようとした場合、依存関係が重要かどうかを判断するために何時間も費やします。これは、あなたがやるべきではないことです。
BartoszKP 2016

十分だ。+1
トレイマック

7

Khlrが詳細な説明を行い、明らかにこのアプローチがVS2015 Express for Desktopで機能し始めました。私はコメントを残そうとしましたが、私の評判の欠如は私にそうすることを許しませんでした。

ここに解決策をコピーしましょう:

[TestClass]  
 public class StringFormatUtilsTest  
 {  
     [TestMethod]  
     [DataRow("tttt", "")]  
     [DataRow("", "")]  
     [DataRow("t3a4b5", "345")]  
     [DataRow("3&amp;amp;5*", "35")]  
     [DataRow("123", "123")]  
     public void StripNonNumeric(string before, string expected)  
     {  
         string actual = FormatUtils.StripNonNumeric(before);  
         Assert.AreEqual(expected, actual);  
     }  
 } 

これを使用するには、NuGetパッケージMSTest.TestFrameworkおよびMSTest.TestAdapterをインストールするだけです

一つの問題は

エラーCS0433タイプ 'TestClassAttribute'は 'Microsoft.VisualStudio.QualityTools.UnitTestFramework、Version = 10.0.0.0および' Microsoft.VisualStudio.TestPlatform.TestFramework、Version = 14.0.0.0の両方に存在します

そのため、プロジェクトの参照からMicrosoft.VisualStudio.QualityTools.UnitTestFrameworkを削除してください。

元の返信を編集して、この返信を削除してください。


0

MSTestにはDataSource属性があり、データベーステーブル、csv、xmlなどにフィードできます。私はこれを使用してきましたが、うまく機能します。あなたの質問のように真上にデータを属性として配置する方法はわかりませんが、外部データソースをセットアップするのは非常に簡単で、プロジェクトにファイルを含めることができます。開始してから1時間実行しましたが、自動テストのエキスパートではありません。

https://msdn.microsoft.com/en-us/library/ms182527.aspx?f=255&MSPPError=-2147217396は、データベース入力に基づく完全なチュートリアルがあります。

http://www.rhyous.com/2015/05/11/row-tests-or-paramerterized-tests-mstest-xml/には、XMLファイル入力に基づくチュートリアルがあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.