私はMSTestを使用しています。各メソッドに TestCategory 属性を個別に設定せずに、テスト クラスのすべてのメソッドに同じテスト カテゴリを一度に設定したいと考えています。これはどのように行うことができますか?
最も便利で明白な方法は、クラスに TestCategory 属性を設定することですが、メソッドにのみ適用できます。
最終的な目標は、TFS チェックインでのテスト実行中に統合テストをスキップすることです。
私はMSTestを使用しています。各メソッドに TestCategory 属性を個別に設定せずに、テスト クラスのすべてのメソッドに同じテスト カテゴリを一度に設定したいと考えています。これはどのように行うことができますか?
最も便利で明白な方法は、クラスに TestCategory 属性を設定することですが、メソッドにのみ適用できます。
最終的な目標は、TFS チェックインでのテスト実行中に統合テストをスキップすることです。
私は似たようなことをしようとしていましたが、私の目的に非常に適したソリューションにたどり着きました。
これは、クラスごとに TestCategory を適用する問題を解決しませんが、コマンド ライン引数 forを使用して、テストの完全修飾メソッド名の任意の部分に一致する検索文字列を指定できます。つまり、一般に、クラス、名前空間、または目的のテストに一致する検索文字列に対して一致させることができます。それでもうまくいかない場合は、引数を複数回使用できます。すなわち:/test:
mstest
/test:
> mstest /testcontainer:My.dll /test:My.FullyQualified.Namespace
/test:My.FullyQualified.OtherNamespace.OtherClass
編集:
TestCategory
以下の NomadeNumeric の回答に記載されているように、クラス レベルでの属性の追加がMSTest V2 で利用できるようになりました。詳細
最終的な目標は、TFS チェックインでのテスト実行中に統合テストをスキップすることです。
これを行う方法は他にもあります。TFS ビルドでは、アセンブリ名に応じて、実行する単体テストを設定できます。
デフォルトの動作として、名前に「test」が含まれるアセンブリですべての単体テストを実行します。簡単な修正は、統合テストの名前を「test」を含まない名前に変更することです。
カテゴリを使用したい場合は、AOP を使用してみてください。たとえば、Postsharp を使用すると、メソッドに属性を配置する統合テスト アセンブリにアスペクトを作成できます。次に、すべてのテストが 1 つの dll または各統合テスト クラスにグループ化されている場合、統合アセンブリ内のすべてのパブリック メソッドに対してアスペクトを有効にします。
この制限を回避する 1 つの方法は、各テスト メソッドの先頭にテスト カテゴリを配置することです。たとえば、単体テストに名前を付けます
public void UnitTestDoSomething_ExpectThis()
そしてあなたの統合テスト
public void IntegrationTestDoSomething_ExpectThis()
次に、TFSクエリを実行して統合テストを取得すると、実行できる
Field[Automated Test Name] with Operator[Contains] and Value[IntegrationTest]
これは完全な解決策ではありませんが、コードと TFS でテストを区別するのに役立ちます。または、エリア パスと反復パスを調べることもできます。
「クラス名」でテスト エクスプローラー パネルにグループ化できます。
テスト TestCategory 属性では、C# の属性がメタデータであり、動的な値として使用できないため、問題を解決できません。
VS 2017 ではこれが可能です ( VS2012 update 1の一部のようです)。
単体テストのクラスに [TestCategory("Integration")] を配置してすべてのテストに適用し、同様に単体テスト クラスに [TestCategory("Unit")] を適用できます。
次に、テスト エクスプローラーの検索バーを使用して、特性名 = 単位でフィルター処理すると、[すべて実行] で検索に一致するテストのみが実行されます。
ビルド サーバーでこれらのテストを実行する場合は、/category:Unit などのスイッチを使用して単体テストのみを実行できます。