.NET Core で dotnet test コマンドを使用することで、フィルター式を使用して、選択したテストを実行することができます。 この記事では、テストをフィルター処理する方法を示します。 この例では dotnet test を使用します。
vstest.console.exe を使用している場合は、--filter を --testcasefilter: に置き換えます。
Note
以降のセクションで説明する --filter 構文は、MSTest、NUnit、および xUnit に適用されます。 TUnit は別の構文を使用します。詳細については、この記事の上部にある TUnit を選択してください。
構文
dotnet test --filter <Expression>
Expression は
<Property><Operator><Value>[|&<Expression>]形式です。式はブール演算子を使用して結合できます。
|はブール値 or、&はブール値 and に相当します。式はかっこで囲むことができます。 たとえば、
(Name~MyClass) | (Name~MyClass2)のように指定します。プロパティで、operator のない式は
FullyQualifiedNameとして解釈されます。 たとえば、dotnet test --filter xyzはdotnet test --filter FullyQualifiedName~xyzと同じです。Property は
Test Caseの属性です。 たとえば、よく利用される単体テスト フレームワークでは以下のプロパティがサポートされています。テスト フレームワーク サポートされるプロパティ MSTest FullyQualifiedNameNameClassNamePriorityTestCategoryIdNUnit FullyQualifiedNameNamePriorityTestCategoryCategoryPropertyxUnit FullyQualifiedNameDisplayNameTraits演算子
-
=完全一致 -
!=完全一致ではない -
~含む -
!~含まない
-
Value は文字列です。 すべての参照で大文字と小文字が区別されます。
文字のエスケープ
エスケープ シーケンスを使用して、フィルター値のフィルター演算子文字を表します。 これらのエスケープ シーケンスは、シェルで必要なエスケープとは別です。
| エスケープ シーケンス | 表現 |
|---|---|
\\ |
\ |
\( |
( |
\) |
) |
\& |
& |
\| |
| |
\= |
= |
\! |
! |
\~ |
~ |
プログラムでフィルター値をエスケープするには、Microsoft.VisualStudio.TestPlatform.ObjectModel.Utilities.FilterHelper.Escape NuGet パッケージから Microsoft.VisualStudio.TestPlatform.ObjectModel API を使用します。
フィルター式に感嘆符 (!) を使用するには、一部の Linux または macOS シェルでは、その前に円記号を付けてエスケープします (\!)。 たとえば、次のフィルターは、IntegrationTests を含む名前空間のすべてのテストをスキップします。
dotnet test --filter FullyQualifiedName\!~IntegrationTests
ジェネリック型パラメーターで FullyQualifiedName 値にコンマを含める場合は、%2C を指定してコンマをエスケープします。 次に例を示します。
dotnet test --filter "FullyQualifiedName=MyNamespace.MyTestsClass<ParameterType1%2CParameterType2>.MyTestMethod"
シェルはフィルター式も解析するため、シェルが特別に扱う文字 (--filter、<、>など) が含まれるたびに、,値全体を引用符で囲みます。 PowerShell では引用符が必要です。コンマは配列演算子です。
Name または DisplayNameの場合は、特殊文字の URL エンコードを使用します。 たとえば、MyTestMethod という名前と "text"文字列値を使用してテストを実行するには、次のフィルターを使用します。
dotnet test --filter "Name=MyTestMethod \(%22text%22\)"
MSTest の例
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace MSTestNamespace
{
[TestClass]
public class UnitTest1
{
[TestMethod, Priority(1), TestCategory("CategoryA")]
public void TestMethod1()
{
}
[TestMethod, Priority(2)]
public void TestMethod2()
{
}
}
}
| 正規表現 | 結果 |
|---|---|
dotnet test --filter Method |
FullyQualifiedName に Method が含まれるテストを実行します。 |
dotnet test --filter Name~TestMethod1 |
名前に TestMethod1 が含まれるテストを実行します。 |
dotnet test --filter ClassName=MSTestNamespace.UnitTest1 |
クラス MSTestNamespace.UnitTest1 内にあるテストを実行します。注: ClassName 値には名前空間があるため、ClassName=UnitTest1 は機能しません。 |
dotnet test --filter FullyQualifiedName!=MSTestNamespace.UnitTest1.TestMethod1 |
MSTestNamespace.UnitTest1.TestMethod1 以外のテストをすべて実行します。 |
dotnet test --filter TestCategory=CategoryA |
[TestCategory("CategoryA")] の注釈が付けられているテストを実行します。 |
dotnet test --filter Priority=2 |
[Priority(2)] の注釈が付けられているテストを実行します。 |
dotnet test --filter "Id=<guid>" |
検出された TestCase.Id 値が GUID と正確に一致するテスト ケースを実行します。 |
Id フィルター処理には MSTest.TestAdapter 3.6 以降が必要です。 VSTest 検出が TestCase.Idで返すテスト ケースから GUID を取得します。 このフィルターでは、表示名を一致させたりエスケープしたりすることなく、展開されたデータドリブンイテレーションを 1 つ選択できます。 各行は、個々のテスト ケースとして検出する必要があります。フォールド データ ドリブン テストでは、親 ID が 1 つだけ公開されます。
条件演算子 | と & の使用例:
UnitTest1に FullyQualifiedName が含まれるか、または、TestCategoryAttribute が"CategoryA"であるテストを実行するには。dotnet test --filter "FullyQualifiedName~UnitTest1|TestCategory=CategoryA"UnitTest1に FullyQualifiedName が含まれ、かつ、TestCategoryAttribute が"CategoryA"であるテストを実行するには。dotnet test --filter "FullyQualifiedName~UnitTest1&TestCategory=CategoryA"FullyQualifiedName に
UnitTest1が含まれ、かつ、TestCategoryAttribute が"CategoryA"であるか、または、PriorityAttribute の優先順位が1であるテストを実行するには。dotnet test --filter "(FullyQualifiedName~UnitTest1&TestCategory=CategoryA)|Priority=1"
xUnit の例
using Xunit;
namespace XUnitNamespace
{
public class TestClass1
{
[Fact, Trait("Priority", "1"), Trait("Category", "CategoryA")]
public void Test1()
{
}
[Fact, Trait("Priority", "2")]
public void Test2()
{
}
}
}
| 正規表現 | 結果 |
|---|---|
dotnet test --filter DisplayName=XUnitNamespace.TestClass1.Test1 |
XUnitNamespace.TestClass1.Test1 という 1 つのテストのみを実行します。 |
dotnet test --filter FullyQualifiedName!=XUnitNamespace.TestClass1.Test1 |
XUnitNamespace.TestClass1.Test1 以外のテストをすべて実行します。 |
dotnet test --filter DisplayName~TestClass1 |
表示名に TestClass1 が含まれるテストを実行します。 |
コード例では、特性をキー "Category" や "Priority" で定義すると、フィルター処理に使用できます。
| 正規表現 | 結果 |
|---|---|
dotnet test --filter XUnit |
FullyQualifiedName に XUnit が含まれるテストを実行します。 |
dotnet test --filter Category=CategoryA |
[Trait("Category", "CategoryA")] があるテストを実行します。 |
条件演算子 | と & の使用例:
TestClass1に FullyQualifiedName が含まれるか、または、Traitのキーが"Category"で値が"CategoryA"であるテストを実行するには。dotnet test --filter "FullyQualifiedName~TestClass1|Category=CategoryA"TestClass1に FullyQualifiedName が含まれ、かつ、Traitのキーが"Category"で値が"CategoryA"であるテストを実行するには。dotnet test --filter "FullyQualifiedName~TestClass1&Category=CategoryA"FullyQualifiedName に
TestClass1が含まれ、かつ、Traitのキーが"Category"で値が"CategoryA"であるか、または、Traitのキーが"Priority"で値が1であるテストを実行するには。dotnet test --filter "(FullyQualifiedName~TestClass1&Category=CategoryA)|Priority=1"
NUnit の例
NUnit の場合、 TestCategory と Category は交換可能なフィルター プロパティ名です。 どちらの場合も、 Category 属性で割り当てたカテゴリをフィルター処理するため、 --filter Category=MyCategory を使用する既存の NUnit コマンドを変更する必要はありません。
using NUnit.Framework;
namespace NUnitNamespace
{
public class UnitTest1
{
[Test, Property("Priority", 1), Category("CategoryA")]
public void TestMethod1()
{
}
[Test, Property("Priority", 2)]
public void TestMethod2()
{
}
}
}
| 正規表現 | 結果 |
|---|---|
dotnet test --filter Method |
FullyQualifiedName に Method が含まれるテストを実行します。 |
dotnet test --filter Name~TestMethod1 |
名前に TestMethod1 が含まれるテストを実行します。 |
dotnet test --filter FullyQualifiedName~NUnitNamespace.UnitTest1 |
クラス NUnitNamespace.UnitTest1 内にあるテストを実行します。 |
dotnet test --filter FullyQualifiedName!=NUnitNamespace.UnitTest1.TestMethod1 |
NUnitNamespace.UnitTest1.TestMethod1 以外のテストをすべて実行します。 |
dotnet test --filter TestCategory=CategoryA |
[Category("CategoryA")] の注釈が付けられているテストを実行します。 |
dotnet test --filter Category=CategoryA |
TestCategory=CategoryAと同じテストを実行します。 |
dotnet test --filter Priority=2 |
[Priority(2)] の注釈が付けられているテストを実行します。 |
条件演算子 | と & の使用例:
UnitTest1 に FullyQualifiedName が含まれるか、または、Category が "CategoryA" であるテストを実行するには。
dotnet test --filter "FullyQualifiedName~UnitTest1|TestCategory=CategoryA"
UnitTest1 に FullyQualifiedName が含まれ、かつ、Category が "CategoryA" であるテストを実行するには。
dotnet test --filter "FullyQualifiedName~UnitTest1&TestCategory=CategoryA"
FullyQualifiedName に UnitTest1 が含まれ、かつ、Category が "CategoryA" であるか、または、Property の "Priority" が 1 であるテストを実行するには。
dotnet test --filter "(FullyQualifiedName~UnitTest1&TestCategory=CategoryA)|Priority=1"
詳細については、TestCase フィルターに関するページを参照してください。
TUnit の例
TUnit では、この記事で前述した --filter オプションはサポートされていません。 代わりに、MTP --treenode-filter オプションが使用されます。 ツリー ノード フィルターは、 /<Assembly>/<Namespace>/<Class>/<Method>形式のパスであり、次のようになります。
-
*は 1 つのパス セグメント内の任意の値と一致し、*Method*などの他のテキストと組み合わせることができます。 -
**は、任意の数のパス セグメントと一致します。 -
[<Property>=<Value>]パス セグメントの後に、そのプロパティを持つテストが一致します。[Category("CategoryA")]はプロパティCategoryとして公開され、プロパティPriorityとして[Property("Priority", "2")]されます。 -
|(または) と&(および) は、1 つのパス セグメントまたはプロパティ フィルター内で代替候補を結合します。/*/*/(UnitTest1)|(UnitTest2)/*や[(Category=CategoryA)|(Priority=2)]など、各代替候補をかっこで囲みます。
--treenode-filter オプションは MTP オプションであるため、dotnet testは MTP モードで実行する必要があります。 .NET 10 SDK 以降を使用して、ソリューション ルートの global.json ファイルに次の構成を追加します。
{
"test": {
"runner": "Microsoft.Testing.Platform"
}
}
これを使用しない場合、 dotnet test は VSTest モードで実行され、テストを実行する前に MSB1001: Unknown switch で失敗します。 以前の SDK で MTP プロジェクトを実行する方法など、詳細については、 dotnet テストの MTP モードを参照してください。
この例では、次のテスト クラスを使用します。
namespace TUnitNamespace;
public class UnitTest1
{
[Test, Property("Priority", "1"), Category("CategoryA")]
public void TestMethod1()
{
}
[Test, Property("Priority", "2")]
public void TestMethod2()
{
}
}
| 正規表現 | 結果 |
|---|---|
dotnet test --treenode-filter "/*/*/*/*Method*" |
メソッド名に Methodが含まれるテストを実行します。 |
dotnet test --treenode-filter "/*/*/*/TestMethod1" |
名前が TestMethod1のテストを実行します。 |
dotnet test --treenode-filter "/*/TUnitNamespace/UnitTest1/*" |
クラス TUnitNamespace.UnitTest1内のすべてのテストを実行します。 |
dotnet test --treenode-filter "/**[Category=CategoryA]" |
[Category("CategoryA")] の注釈が付けられているテストを実行します。 |
dotnet test --treenode-filter "/**[Priority=2]" |
[Property("Priority", "2")] の注釈が付けられているテストを実行します。 |
条件演算子 | と & の使用例:
クラス UnitTest1に含まれるテストを実行し、"CategoryA"のCategoryを持つ場合:
dotnet test --treenode-filter "/*/*/UnitTest1/*[Category=CategoryA]"
"CategoryA"または"2"のPriorityのCategoryを持つテストを実行するには:
dotnet test --treenode-filter "/**[(Category=CategoryA)|(Priority=2)]"
クラス UnitTest1に含まれるテストを実行するには、"CategoryA"のCategoryまたは"2"のPriorityを使用します。
dotnet test --treenode-filter "/*/*/UnitTest1/*[(Category=CategoryA)|(Priority=2)]"
"CategoryA"のCategoryと"1"のPriorityを持つテストを実行するには:
dotnet test --treenode-filter "/**[(Category=CategoryA)&(Priority=1)]"
関連項目
次の手順
.NET