web-dev-qa-db-ja.com

MSTestでRowTestを実行する方法は?

MSTestがRowTestおよび同様のテストをサポートしていないことを私は知っています。

MSTestsユーザーは何をしますか? RowTestのサポートなしで生きることはどのように可能ですか?

DataDrivenのテスト機能を見たことがありますが、オーバーヘッドが大きすぎるようです。RowTestMSTestの同様のテストを実行できるサードパーティのパッチまたはツールはありますか?

42
dr. evil
[TestMethod]
Test1Row1
{
    Test1(1,4,5);
}

[TestMethod]
Test1Row2
{
    Test1(1,7,8);
}

private Test1(int i, int j, int k)
{
   //all code and assertions in here
}
38
Tormod

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

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

https://github.com/Thwaitesy/MSTestHacks

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

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

public class UnitTest1 : TestBase
{ }

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

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)MSTest DataSource属性をテストメソッドに追加し、上記のIEnumerable名をポイントします。これは完全に修飾されている必要があります。

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

    Assert.IsNotNull(number);
}

最終結果:通常のデータソースと同じように3回の反復:)

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

namespace Namespace
{
    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 };
            }
        }

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

            Assert.IsNotNull(number);
        }
    }
}
7
Thwaitesy

VS2012Update1でDataRowのサポートを追加しました。 簡単な紹介についてはこのブログを参照してください

VS2012 Update1では、この機能は現在Windowsストアアプリに限定されています。それ以降のバージョンでは、これに制限はありません。

6
allen

MS Testフレームワークの使用に縛られている私のチームでは、匿名タイプのみに依存してテストデータの配列を保持し、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 で、このソリューションについてより多くの背景と詳細をブログに書いています。

2
Gary.Ray

生成されたテストメソッドの数が異なるテストクラスコードを生成することで、この問題を解決しました。 2つのファイルをダウンロードして、プロジェクトに含めるだけです。
次に、テストコードで必要な行数でクラスをサブクラス化し、2つの抽象メソッドを実装します。

[TestClass]
public class Ha_ha_ha_Test: MsTestRows.Rows.TestRows_42<string>
{
    public override void TestMethod(string dataRow, int rowNumber)
    {
        Console.WriteLine(dataRow);
        Assert.IsFalse(dataRow.Contains("3"));
    }

    public override string GetNextDataRow(int rowNumber)
    {
        return "data" + rowNumber;
    }
}

詳細:

https://github.com/dzhariy/mstest-rows

0
Dmytro Zharii

PostSharpを使用したDaTest(2008年以降更新されていない)ソリューションと同様に、ブログで説明されています http://blog.drorhelper.com/2011/09/enabling-parameterized-tests-in-mstest.html