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