132

NUnitのTestCase機能は、テストごとに個別のメソッドを必要とせずにテスト パラメーターを指定する簡単な方法として非常に便利です。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);  
     }  
 }  
4

6 に答える 6

14

これも遅い回答であることは承知していますが、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); 
        }); 
    }
}

この手法を使用する場合、Assert に入力データを含む書式設定されたメッセージを使用すると、テストが失敗する原因となった行を特定するのに役立ちます。

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

于 2015-01-10T21:59:12.080 に答える
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 ファイル入力に基づくチュートリアルがあります。

于 2016-03-08T16:26:16.160 に答える