NUnitは、単体テストを複数回実行するためのデータ入力のセットを指定できる機能をサポートしています。
[RowTest]
[Row(1001,1,2,3)]
[Row(1,1001,2,3)]
[Row(1,2,1001,3)]
public void SumTests(int x, int y, int z, int expected)
{
...
}
MSTestを使用してこれと同じタイプのことを達成するための最良の方法は何ですか?同様の属性のセットが見つかりません。
NUnitは、単体テストを複数回実行するためのデータ入力のセットを指定できる機能をサポートしています。
[RowTest]
[Row(1001,1,2,3)]
[Row(1,1001,2,3)]
[Row(1,2,1001,3)]
public void SumTests(int x, int y, int z, int expected)
{
...
}
MSTestを使用してこれと同じタイプのことを達成するための最良の方法は何ですか?同様の属性のセットが見つかりません。
これは役に立ちますか?
今週、TFS によって管理されるプロジェクトにいくつかの単体テストを追加していたので、VS2008 で利用可能な「コア」単体テスト フレームワークを使用することにしましたが、残念ながら RowTests をサポートしていません。しかし、Data-Driven Unit Test と呼ばれる同様の機能があります。このアプローチでは、「単純な」RowTest シナリオを実装するのは少し複雑になりますが、より複雑なものを実装することもできます。
ここに示すように、mstest の小さな拡張機能を作成することで、この機能を利用できます。
実際、パラメータ化された単体テスト (PUT) は単体テストの自然な一般化です。また、Microsoft Research には、テスト対象のクラス (CUT) の PUT を自動的に生成する Pex というプロジェクトがあります。Pex は自動テスト入力生成ツールです。自分でテスト データを準備する代わりに、Pex ツールがCUT のパラメーターに必要な入力を見つけ、それに応じて単体テスト ケースを生成します。こちらをご確認ください。
私の答えは @oscar-e-fraxedas-tormo のものと似ています。
内部に 1 ~ 100 個のテスト メソッドを持つ生成されたクラスの 1 つからサブクラス化し、派生クラスですべてのテスト ロジックを提供できます。以下の例では:
[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;
}
}
クラスHa_ha_ha_Test
には、42
生成された行 (メソッド) が含まれます。この行ごとに、GetNextDataRow
必要なテスト データを提供するためにカスタム メソッドが呼び出されます。
テスト メソッドとパラメーターを仮想プロパティとして使用して基本クラスを作成できます。このクラスから継承する場合、必要な値でプロパティをオーバーライドするだけです。サンプル コードを参照してください。
public class Operation
{
public static int Add(int x, int y)
{
return x + y;
}
}
[TestClass]
public class AddTests : WorkItemTest
{
protected virtual int First{get { return 0; }}
protected virtual int Second{get { return 0; }}
[TestInitialize]
public virtual void Init()
{
//Init code
}
[TestCleanup]
public virtual void Clean()
{
//Clean code
}
[TestMethod]
[Description("x+y = y+x")]
public virtual void Test_operation_commutativity()
{
Assert.AreEqual(Operation.Add(Second, First), Operation.Add(First, Second));
}
}
[TestClass]
public class AddPositiveTest : AddTests
{
protected override int First { get { return 1; } }
protected override int Second { get { return 2; } }
}
[TestClass]
public class AddNegativeTest : AddTests
{
protected override int First { get { return -1; } }
protected override int Second { get { return -2; } }
}