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);
}
}
Microsoftは最近発表した "MSTest V2"( blog-article を参照)。これにより、一貫して(デスクトップ、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.TestFramework および MSTest.TestAdapter (両方とも現在のプレリリース)をインストールするだけです。
MSTestに固執する必要がなく、テストエクスプローラーを介してテストを実行できるようにするためだけに使用している場合 visual Studio Expressエディションしかないため、これはあなたのための解決策かもしれません:
VsTestAdapter VSIX extension があり、テストエクスプローラーを介してNUnitテストを実行できます。残念ながら、VS Expressユーザーは拡張機能をインストールできません...しかし幸いなことに VsTestAdapterにはプレーンなNuGet-Packageが付属しています もあります!
したがって、VS Expressユーザーの場合は、VsTestAdapter NuGet-Packageをインストールするだけで、テストエクスプローラーでNUnitテスト/テストケースを実行できます。
残念ながら、前述の陳述は真実ではありません。 Expressエディションを介してパッケージをインストールすることは完全に可能ですが、テストエクスプローラーを利用できないため、役に立ちません。以前、TestAdapterの 古いバージョン にサイドノートがありました。これは 2.0.0の説明ページ から削除されました。
VS Expressでは機能しないことに注意してください
私はこれが遅い回答であることを知っていますが、うまくいけば他の人の助けになることを願っています。
私はどこでもエレガントな解決策を探して、自分でそれを書いてしまいました。数千のユニットテストと数十万の反復を伴う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)テストメソッドにMSTest DataSource属性を追加し、上記のIEnumerable名を参照します。これは完全に修飾する必要があります。
[TestMethod]
[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
{
[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);
}
}
}
私はこれが別の遅い答えであることを知っていますが、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 で、より多くの背景と詳細を使用してこのソリューションについてブログに書いています。
Khlrが詳細な説明を行い、明らかにこのアプローチはVS2015 Express for Desktopで機能し始めたようです。私はコメントを残そうとしましたが、私の評判の欠如はそうすることを許しませんでした。
ここにソリューションをコピーします:
[TestClass]
public class StringFormatUtilsTest
{
[TestMethod]
[DataRow("tttt", "")]
[DataRow("", "")]
[DataRow("t3a4b5", "345")]
[DataRow("3&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を削除してください。
元の返信を編集して、この返信を削除してください。
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ファイル入力に基づくチュートリアルがあります。