Spuštění vybraných testů jednotek

dotnet test Pomocí příkazu v .NET Core můžete pomocí výrazu filtru spouštět vybrané testy. Tento článek ukazuje, jak filtrovat testy. Příklady používají dotnet test. Pokud používáte vstest.console.exe, nahraďte --filter ho .--testcasefilter:

Note

Syntaxe --filter popsaná v následujících částech se vztahuje na MSTest, NUnit a xUnit. Funkce TUnit používá jinou syntaxi; Podrobnosti zobrazíte výběrem možnosti TUnit v horní části tohoto článku.

Syntaxe

dotnet test --filter <Expression>
  • Výraz je ve formátu <Property><Operator><Value>[|&<Expression>].

    Výrazy lze spojit s logickými operátory: | pro logickou hodnotu nebo pro & logickou hodnotu a.

    Výrazy mohou být uzavřeny v závorkách. Například: (Name~MyClass) | (Name~MyClass2).

    Výraz bez jakéhokoli operátoru je interpretován jako obsahuje ve FullyQualifiedName vlastnosti. Například trasa dotnet test --filter xyz je stejná jako dotnet test --filter FullyQualifiedName~xyz.

  • Vlastnost je atribut .Test Case Například následující vlastnosti jsou podporovány oblíbenými architekturami testů jednotek.

    Testovací architektura Podporované vlastnosti
    MSTest FullyQualifiedName
    Name
    ClassName
    Priority
    TestCategory
    Id
    NUnit FullyQualifiedName
    Name
    Priority
    TestCategory
    Category
    Property
    xUnit FullyQualifiedName
    DisplayName
    Traits
  • Operátory

    • = přesná shoda
    • !=není přesná shoda
    • ~ obsahuje
    • !~ neobsahuje
  • Hodnota je řetězec. Všechna vyhledávání nerozlišují malá a velká písmena.

Zapouzdření znaků

Pomocí řídicích sekvencí můžete znázorňovat znaky operátoru filtru v hodnotě filtru. Tyto řídicí sekvence jsou oddělené od jakéhokoli úniku, který vyžaduje vaše prostředí.

Úniková sekvence Reprezentuje
\\ \
\( (
\) )
\& &
\| |
\= =
\! !
\~ ~

K programovým filtrům použijte Microsoft.VisualStudio.TestPlatform.ObjectModel.Utilities.FilterHelper.Escape rozhraní API z Microsoft.VisualStudio.TestPlatform.ObjectModel balíčku NuGet.

Pokud chcete ve výrazu filtru použít vykřičník (!), musíte ho uvozit do některých prostředí Linuxu nebo macOS tak, že před něj vložíte zpětné lomítko (\!). Následující filtr například přeskočí všechny testy v oboru názvů, který obsahuje IntegrationTests:

dotnet test --filter FullyQualifiedName\!~IntegrationTests

Pro FullyQualifiedName hodnoty, které obsahují čárku pro parametry obecného typu, uchytáte čárku s %2C. Příklad:

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

Vzhledem k tomu, že vaše prostředí také parsuje výraz filtru, uvozujte celou --filter hodnotu vždy, když obsahuje znaky, které prostředí zpracovává speciálně, například <, nebo >,. V PowerShellu se vyžaduje uvozování, kde čárka je operátor pole.

Pro Name nebo DisplayNamepoužijte kódování adresy URL pro speciální znaky. Pokud chcete například spustit test s názvem MyTestMethod a řetězcovou hodnotou "text", použijte následující filtr:

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

Příklady 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()
        {
        }
    }
}
Výraz Výsledek
dotnet test --filter Method Spouští testy, jejichž FullyQualifiedName obsahuje Method.
dotnet test --filter Name~TestMethod1 Spustí testy, jejichž název obsahuje TestMethod1.
dotnet test --filter ClassName=MSTestNamespace.UnitTest1 Spouští testy, které jsou ve třídě MSTestNamespace.UnitTest1.
Poznámka: Hodnota ClassName by měla mít obor názvů, takže ClassName=UnitTest1 nebude fungovat.
dotnet test --filter FullyQualifiedName!=MSTestNamespace.UnitTest1.TestMethod1 Spustí všechny testy s výjimkou MSTestNamespace.UnitTest1.TestMethod1.
dotnet test --filter TestCategory=CategoryA Spustí testy, které jsou opatřeny poznámkami [TestCategory("CategoryA")].
dotnet test --filter Priority=2 Spustí testy, které jsou opatřeny poznámkami [Priority(2)].
dotnet test --filter "Id=<guid>" Spustí testovací případ, jehož zjištěná TestCase.Id hodnota přesně odpovídá identifikátoru GUID.

Id Filtrování vyžaduje MSTest.TestAdapter 3.6 nebo novější. Získejte identifikátor GUID z testovacího případu, ve které vrátí zjišťování VSTest .TestCase.Id Tento filtr může vybrat jednu rozbalenou iteraci řízenou daty, aniž by se shodovala s zobrazovaným názvem nebo se z něj vyvozovala. Každý řádek musí být zjištěn jako jednotlivý testovací případ; Složený test řízený daty zveřejňuje pouze jednu nadřazenou identitu.

Příklady použití podmíněných operátorů | a &:

  • Spuštění testů, které mají UnitTest1 v jejich FullyQualifiedNameneboTestCategoryAttribute je "CategoryA".

    dotnet test --filter "FullyQualifiedName~UnitTest1|TestCategory=CategoryA"
    
  • Ke spuštění testů, které mají UnitTest1 v jejich FullyQualifiedName

    dotnet test --filter "FullyQualifiedName~UnitTest1&TestCategory=CategoryA"
    
  • Spuštění testů, které obsahují FullyQualifiedNameUnitTest1a mají nebo TestCategoryAttribute"CategoryA" mají prioritu .PriorityAttribute

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

Příklady 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()
        {
        }
    }
}
Výraz Výsledek
dotnet test --filter DisplayName=XUnitNamespace.TestClass1.Test1 Spustí pouze jeden test, XUnitNamespace.TestClass1.Test1.
dotnet test --filter FullyQualifiedName!=XUnitNamespace.TestClass1.Test1 Spustí všechny testy s výjimkou XUnitNamespace.TestClass1.Test1.
dotnet test --filter DisplayName~TestClass1 Spustí testy, jejichž zobrazovaný název obsahuje TestClass1.

V příkladu kódu se definované vlastnosti s klíči "Category""Priority" dají použít k filtrování.

Výraz Výsledek
dotnet test --filter XUnit Spouští testy, jejichž FullyQualifiedName obsahuje XUnit.
dotnet test --filter Category=CategoryA Spustí testy, které mají [Trait("Category", "CategoryA")].

Příklady použití podmíněných operátorů | a &:

  • Ke spuštění testů, které mají TestClass1 v jejich FullyQualifiedNamenebo mají Trait klíč "Category" a hodnotu "CategoryA".

    dotnet test --filter "FullyQualifiedName~TestClass1|Category=CategoryA"
    
  • Ke spuštění testů, které mají TestClass1 v jejich FullyQualifiedNamea mají Trait klíč "Category" a hodnotu "CategoryA".

    dotnet test --filter "FullyQualifiedName~TestClass1&Category=CategoryA"
    
  • Ke spuštění testů, které obsahují FullyQualifiedNameTestClass1 a hodnotu mají Trait klíč "Category" a hodnotu ."CategoryA"

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

Příklady NUnit

Pro NUnit TestCategory a Category jsou zaměnitelné názvy vlastností filtru. Oba filtrují kategorie, které přiřadíte pomocí atributu Category , takže existující příkazy NUnit, které používají --filter Category=MyCategory , není nutné měnit.

using NUnit.Framework;

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

        [Test, Property("Priority", 2)]
        public void TestMethod2()
        {
        }
    }
}
Výraz Výsledek
dotnet test --filter Method Spouští testy, jejichž FullyQualifiedName obsahuje Method.
dotnet test --filter Name~TestMethod1 Spustí testy, jejichž název obsahuje TestMethod1.
dotnet test --filter FullyQualifiedName~NUnitNamespace.UnitTest1 Spouští testy, které jsou ve třídě NUnitNamespace.UnitTest1.
dotnet test --filter FullyQualifiedName!=NUnitNamespace.UnitTest1.TestMethod1 Spustí všechny testy s výjimkou NUnitNamespace.UnitTest1.TestMethod1.
dotnet test --filter TestCategory=CategoryA Spustí testy, které jsou opatřeny poznámkami [Category("CategoryA")].
dotnet test --filter Category=CategoryA Spustí stejné testy jako TestCategory=CategoryA.
dotnet test --filter Priority=2 Spustí testy, které jsou opatřeny poznámkami [Priority(2)].

Příklady použití podmíněných operátorů | a &:

Ke spuštění testů, které mají UnitTest1 nebo FullyQualifiedNamemajíCategory"CategoryA"

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

Ke spuštění testů, které mají UnitTest1 v jejich FullyQualifiedName

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

Ke spouštění testů, které mají FullyQualifiedName buď obsahující aUnitTest1mají Category nebo mají "CategoryA"Property"Priority"1

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

Další informace naleznete v tématu TestCase filter.

Příklady TUnit

Funkce TUnit nepodporuje možnost popsanou --filter výše v tomto článku. Místo toho používá možnost MTP --treenode-filter . Filtr uzlu stromu je cesta ve formuláři /<Assembly>/<Namespace>/<Class>/<Method>, kde:

  • * odpovídá libovolné hodnotě v rámci jednoho segmentu cesty a lze jej kombinovat s jiným textem, například *Method*.
  • ** odpovídá libovolnému počtu segmentů cesty.
  • [<Property>=<Value>] po segmentu cesty odpovídá testům, které mají danou vlastnost. [Category("CategoryA")] je vystaven jako vlastnost Categorya [Property("Priority", "2")] jako vlastnost Priority.
  • | (nebo) a & (a) kombinují alternativy v rámci jednoho segmentu cesty nebo filtru vlastností. Uzavřete každou alternativu do závorek, například /*/*/(UnitTest1)|(UnitTest2)/*[(Category=CategoryA)|(Priority=2)].

Tato --treenode-filter možnost je možnost MTP, takže dotnet test musí běžet v režimu MTP. Pomocí sady .NET 10 SDK nebo novější přidejte do souboru global.json v kořenovém adresáři řešení následující konfiguraci:

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

Bez něj se dotnet test spustí v režimu VSTest a selže s před všemi testovacími běhy MSB1001: Unknown switch . Další informace, včetně toho, jak spouštět projekty MTP se staršími sadami SDK, najdete v režimu MTP testu dotnet.

Příklady používají následující testovací třídu:

namespace TUnitNamespace;

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

    [Test, Property("Priority", "2")]
    public void TestMethod2()
    {
    }
}
Výraz Výsledek
dotnet test --treenode-filter "/*/*/*/*Method*" Spustí testy, jejichž název metody obsahuje Method.
dotnet test --treenode-filter "/*/*/*/TestMethod1" Spustí testy, jejichž název je TestMethod1.
dotnet test --treenode-filter "/*/TUnitNamespace/UnitTest1/*" Spustí všechny testy ve třídě TUnitNamespace.UnitTest1.
dotnet test --treenode-filter "/**[Category=CategoryA]" Spustí testy, které jsou opatřeny poznámkami [Category("CategoryA")].
dotnet test --treenode-filter "/**[Priority=2]" Spustí testy, které jsou opatřeny poznámkami [Property("Priority", "2")].

Příklady použití podmíněných operátorů | a &:

Spuštění testů, které jsou ve třídě UnitTest1a mají Category :"CategoryA"

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

Spuštění testů, které mají Category:Priority"CategoryA""2"

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

Spuštění testů, které jsou ve třídě UnitTest1a které mají jednu Categorynebo jednu "2"z těchto možností:"CategoryA"Priority

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

Spuštění testů, které mají Category:Priority"CategoryA""1"

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

Viz také

Další kroky