Ausführen ausgewählter Komponententests

Mit dem Befehl dotnet test in .NET Core können Sie einen Filterausdruck zum Ausführen ausgewählter Tests verwenden. In diesem Artikel wird veranschaulicht, wie Sie Tests filtern. Die Beispiele verwenden dotnet test. Wenn Sie vstest.console.exe verwenden, ersetzen Sie --filter mit --testcasefilter:.

Note

Die --filter in den folgenden Abschnitten beschriebene Syntax gilt für MSTest, NUnit und xUnit. TUnit verwendet eine andere Syntax; Wählen Sie "TUnit" oben in diesem Artikel aus, um Weitere Informationen zu erhalten.

Syntax

dotnet test --filter <Expression>
  • Der Ausdruck weist das Format <Property><Operator><Value>[|&<Expression>] auf.

    Ausdrücke können mit booleschen Operatoren verknüpft werden: | für boolesches or, & für boolesches and.

    Ausdrücke können in Klammern eingeschlossen werden. Beispiel: (Name~MyClass) | (Name~MyClass2).

    Ein Ausdruck ohne Operator wird als contains für die Eigenschaft FullyQualifiedName interpretiert. dotnet test --filter xyz entspricht beispielsweise dotnet test --filter FullyQualifiedName~xyz.

  • Die Eigenschaft ist ein Attribut von Test Case. Beispielsweise werden die folgenden Eigenschaften von gängigen Komponententestframeworks unterstützt.

    Testframework Unterstützte Eigenschaften
    MSTest FullyQualifiedName
    Name
    ClassName
    Priority
    TestCategory
    Id
    NUnit FullyQualifiedName
    Name
    Priority
    TestCategory
    Category
    Property
    xUnit FullyQualifiedName
    DisplayName
    Traits
  • Operatoren

    • =: genaue Übereinstimmung
    • !=: keine genaue Übereinstimmung
    • ~: enthält
    • !~: enthält nicht
  • Der Wert ist eine Zeichenfolge. Bei allen Suchvorgängen ist die Groß-/Kleinschreibung nicht relevant.

Escapezeichen

Verwenden Sie Escapesequenzen, um Filteroperatorzeichen in einem Filterwert darzustellen. Diese Escapesequenzen sind von allen Escapesequenzen getrennt, die ihre Shell benötigt.

Escape-Sequenz Repräsentiert
\\ \
\( (
\) )
\& &
\| |
\= =
\! !
\~ ~

Um Filterwerte programmgesteuert zu escapen, verwenden Sie die Microsoft.VisualStudio.TestPlatform.ObjectModel.Utilities.FilterHelper.Escape API aus dem Microsoft.VisualStudio.TestPlatform.ObjectModel NuGet-Paket.

Um in einem Filterausdruck ein Ausrufezeichen (!) zu verwenden, müssen Sie dieses in einigen Linux- oder macOS-Shells mit einem Escapezeichen versehen, indem Sie einen umgekehrten Schrägstrich davor setzen (\!). Der folgende Filter überspringt beispielsweise alle Tests in einem Namespace, der IntegrationTests enthält:

dotnet test --filter FullyQualifiedName\!~IntegrationTests

Für FullyQualifiedName-Werte, die ein Komma für generische Typparameter enthalten, versehen Sie das Komma mit dem Escapezeichen %2C. Zum Beispiel:

dotnet test --filter "FullyQualifiedName=MyNamespace.MyTestsClass<ParameterType1%2CParameterType2>.MyTestMethod"

Da die Shell auch den Filterausdruck analysiert, geben Sie den gesamten --filter Wert an, wenn er Zeichen enthält, die ihre Shell speziell behandelt, z <. B. , >oder ,. Quoting ist in PowerShell erforderlich, wobei das Komma der Arrayoperator ist.

Verwenden Sie für Name oder DisplayNamedie URL-Codierung für die Sonderzeichen. Wenn Sie beispielsweise einen Test mit dem Namen MyTestMethod und einem Zeichenfolgenwert "text"ausführen möchten, verwenden Sie den folgenden Filter:

dotnet test --filter "Name=MyTestMethod \(%22text%22\)"

MSTest-Beispiele

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()
        {
        }
    }
}
expression Ergebnis
dotnet test --filter Method Führt Tests aus, dessen FullyQualifiedNameMethod enthält.
dotnet test --filter Name~TestMethod1 Führt Tests aus, dessen Name TestMethod1 enthält.
dotnet test --filter ClassName=MSTestNamespace.UnitTest1 Führt Tests aus, die sich in der Klasse MSTestNamespace.UnitTest1 befinden.
Hinweis: Der Wert ClassName muss einen Namespace besitzen, damit ClassName=UnitTest1 nicht funktioniert.
dotnet test --filter FullyQualifiedName!=MSTestNamespace.UnitTest1.TestMethod1 Führt alle Tests außer MSTestNamespace.UnitTest1.TestMethod1 aus.
dotnet test --filter TestCategory=CategoryA Führt Tests aus, die mit [TestCategory("CategoryA")] annotiert sind.
dotnet test --filter Priority=2 Führt Tests aus, die mit [Priority(2)] annotiert sind.
dotnet test --filter "Id=<guid>" Führt den Testfall aus, dessen ermittelter TestCase.Id Wert exakt der GUID entspricht.

Id Für die Filterung ist MSTest.TestAdapter 3.6 oder höher erforderlich. Rufen Sie die GUID aus dem Testfall ab, in dem DIE VSTest-Ermittlung zurückgegeben TestCase.Idwird. Dieser Filter kann eine ausgeklappte datengesteuerte Iteration auswählen, ohne den Anzeigenamen zu übereinstimmen oder zu entfernen. Jede Zeile muss als einzelner Testfall ermittelt werden; Ein gefalteter datengesteuerter Test macht nur eine übergeordnete Identität verfügbar.

Beispiele für die Verwendung der bedingten Operatoren | und &:

xUnit-Beispiele

using Xunit;

namespace XUnitNamespace
{
    public class TestClass1
    {
        [Fact, Trait("Priority", "1"), Trait("Category", "CategoryA")]
        public void Test1()
        {
        }

        [Fact, Trait("Priority", "2")]
        public void Test2()
        {
        }
    }
}
expression Ergebnis
dotnet test --filter DisplayName=XUnitNamespace.TestClass1.Test1 Führt einen Test, XUnitNamespace.TestClass1.Test1, aus.
dotnet test --filter FullyQualifiedName!=XUnitNamespace.TestClass1.Test1 Führt alle Tests außer XUnitNamespace.TestClass1.Test1 aus.
dotnet test --filter DisplayName~TestClass1 Führt Tests aus, dessen Anzeigename TestClass1 enthält.

Im Codebeispiel können die definierten Merkmale mit den Schlüsseln "Category" und "Priority" zum Filtern verwendet werden.

expression Ergebnis
dotnet test --filter XUnit Führt Tests aus, dessen FullyQualifiedNameXUnit enthält.
dotnet test --filter Category=CategoryA Führt Tests aus, die [Trait("Category", "CategoryA")] enthalten.

Beispiele für die Verwendung der bedingten Operatoren | und &:

  • Zum Ausführen von Tests, bei denen TestClass1 ihren FullyQualifiedName enthält oder die über einen Trait mit dem Schlüssel "Category" und dem Wert "CategoryA" verfügen.

    dotnet test --filter "FullyQualifiedName~TestClass1|Category=CategoryA"
    
  • Zum Ausführen von Tests, bei denen TestClass1 ihren FullyQualifiedName enthält und die über einen Trait mit dem Schlüssel "Category" und dem Wert "CategoryA" verfügen.

    dotnet test --filter "FullyQualifiedName~TestClass1&Category=CategoryA"
    
  • Zum Ausführen von Tests, bei denen entweder FullyQualifiedNameTestClass1 enthält und die über einen Trait mit dem Schlüssel "Category" und dem Wert "CategoryA" verfügen oder die über einen Trait mit dem Schlüssel "Priority" und dem Wert 1 verfügen.

    dotnet test --filter "(FullyQualifiedName~TestClass1&Category=CategoryA)|Priority=1"
    

NUnit-Beispiele

Für NUnit TestCategory und Category sind austauschbare Filtereigenschaftennamen. Beide filtern die Kategorien, die Sie mit dem Category Attribut zuweisen, sodass vorhandene NUnit-Befehle, die --filter Category=MyCategory nicht geändert werden müssen, geändert werden müssen.

using NUnit.Framework;

namespace NUnitNamespace
{
    public class UnitTest1
    {
        [Test, Property("Priority", 1), Category("CategoryA")]
        public void TestMethod1()
        {
        }

        [Test, Property("Priority", 2)]
        public void TestMethod2()
        {
        }
    }
}
expression Ergebnis
dotnet test --filter Method Führt Tests aus, dessen FullyQualifiedNameMethod enthält.
dotnet test --filter Name~TestMethod1 Führt Tests aus, dessen Name TestMethod1 enthält.
dotnet test --filter FullyQualifiedName~NUnitNamespace.UnitTest1 Führt Tests aus, die sich in der Klasse NUnitNamespace.UnitTest1 befinden.
dotnet test --filter FullyQualifiedName!=NUnitNamespace.UnitTest1.TestMethod1 Führt alle Tests außer NUnitNamespace.UnitTest1.TestMethod1 aus.
dotnet test --filter TestCategory=CategoryA Führt Tests aus, die mit [Category("CategoryA")] annotiert sind.
dotnet test --filter Category=CategoryA Führt dieselben Tests wie TestCategory=CategoryA.
dotnet test --filter Priority=2 Führt Tests aus, die mit [Priority(2)] annotiert sind.

Beispiele für die Verwendung der bedingten Operatoren | und &:

Zum Ausführen von Tests, bei denen UnitTest1 in FullyQualifiedName enthalten oderCategory"CategoryA" ist.

dotnet test --filter "FullyQualifiedName~UnitTest1|TestCategory=CategoryA"

Zum Ausführen von Tests, bei denen UnitTest1 in FullyQualifiedName enthalten undCategory"CategoryA" ist.

dotnet test --filter "FullyQualifiedName~UnitTest1&TestCategory=CategoryA"

Zum Ausführen von Tests, bei denen entweder FullyQualifiedNameUnitTest1 enthält undCategory"CategoryA" ist oderProperty die "Priority"1hat.

dotnet test --filter "(FullyQualifiedName~UnitTest1&TestCategory=CategoryA)|Priority=1"

Weitere Informationen finden Sie unter TestCase-Filter.

TUnit-Beispiele

TUnit unterstützt die --filter weiter oben in diesem Artikel beschriebene Option nicht. Stattdessen wird die MTP-Option --treenode-filter verwendet. Ein Strukturknotenfilter ist ein Pfad im Formular /<Assembly>/<Namespace>/<Class>/<Method>, wobei:

  • * entspricht einem beliebigen Wert innerhalb eines einzelnen Pfadsegments und kann mit einem anderen Text kombiniert werden, z *Method*. B. .
  • ** entspricht einer beliebigen Anzahl von Pfadsegmenten.
  • [<Property>=<Value>] nach übereinstimmungen eines Pfadsegments Tests mit dieser Eigenschaft. [Category("CategoryA")] wird als Eigenschaft Categoryund [Property("Priority", "2")] als Eigenschaft Priorityverfügbar gemacht.
  • | (oder) und (und & ) kombinieren Alternativen innerhalb eines einzelnen Pfadsegments oder Eigenschaftenfilters. Schließen Sie jede Alternative in Klammern ein, z. B /*/*/(UnitTest1)|(UnitTest2)/* . oder [(Category=CategoryA)|(Priority=2)].

Die --treenode-filter Option ist eine MTP-Option, muss daher dotnet test im MTP-Modus ausgeführt werden. Fügen Sie mit dem .NET 10 SDK oder höher der global.json Datei im Lösungsstamm die folgende Konfiguration hinzu:

{
    "test": {
        "runner": "Microsoft.Testing.Platform"
    }
}

Ohne diesen dotnet test Modus wird im VSTest-Modus ausgeführt und schlägt vor MSB1001: Unknown switch jeder Testausführung fehl. Weitere Informationen, einschließlich der Ausführung von MTP-Projekten mit früheren SDKs, finden Sie im MTP-Modus des Dotnet-Tests.

In den Beispielen wird die folgende Testklasse verwendet:

namespace TUnitNamespace;

public class UnitTest1
{
    [Test, Property("Priority", "1"), Category("CategoryA")]
    public void TestMethod1()
    {
    }

    [Test, Property("Priority", "2")]
    public void TestMethod2()
    {
    }
}
expression Ergebnis
dotnet test --treenode-filter "/*/*/*/*Method*" Führt Tests aus, deren Methodenname enthält Method.
dotnet test --treenode-filter "/*/*/*/TestMethod1" Führt Tests aus, deren Name lautet TestMethod1.
dotnet test --treenode-filter "/*/TUnitNamespace/UnitTest1/*" Führt alle Tests in der Klasse TUnitNamespace.UnitTest1aus.
dotnet test --treenode-filter "/**[Category=CategoryA]" Führt Tests aus, die mit [Category("CategoryA")] annotiert sind.
dotnet test --treenode-filter "/**[Priority=2]" Führt Tests aus, die mit [Property("Priority", "2")] annotiert sind.

Beispiele für die Verwendung der bedingten Operatoren | und &:

So führen Sie Tests aus, die sich in der Klasse UnitTest1 befinden und über folgendes Category"CategoryA"verfügen:

dotnet test --treenode-filter "/*/*/UnitTest1/*[Category=CategoryA]"

So führen Sie Tests mit einer Category oder "CategoryA"einerPriority von "2":

dotnet test --treenode-filter "/**[(Category=CategoryA)|(Priority=2)]"

So führen Sie Tests aus, die sich in der Klasse UnitTest1 befinden und entweder eine Category von "CategoryA"oder eine Priority von"2":

dotnet test --treenode-filter "/*/*/UnitTest1/*[(Category=CategoryA)|(Priority=2)]"

So führen Sie Tests mit einer Category von "CategoryA"und einer Priority von "1":

dotnet test --treenode-filter "/**[(Category=CategoryA)&(Priority=1)]"

Siehe auch

Nächste Schritte