Testování struktury a metadat v MSTest

MSTest poskytuje atributy pro uspořádání testů, přidávání metadat a propojení testů s systémy sledování práce. Tyto atributy pomáhají efektivně filtrovat, řadit a spravovat testy ve velkých sadách testů.

Přehled

Atributy metadat se zobrazí v okně Vlastnosti sady Visual Studio pro testovací metody. Pomáhají vám:

  • Uspořádání testů: Seskupte testy podle kategorie, priority nebo vlastníka.
  • Spuštění testů filtru: Spustí konkrétní podmnožinu testů na základě metadat.
  • Sledování pokrytí testů: Propojte testy s pracovními položkami a požadavky.
  • Generování sestav: Zahrnout metadata do testovacích sestav a řídicích panelů

Kategorizace testů

TestCategoryAttribute

TestCategoryAttribute seskupuje testy do kategorií pro filtrování a organizaci. Tento atribut můžete použít na úrovni metody, třídy nebo sestavení a kategorie jsou kombinovány při použití na více úrovních.

Kategorie na úrovni metody

Aplikovat kategorie přímo na testovací metody pro jemné řízení:

[TestClass]
public class OrderTests
{
    [TestMethod]
    [TestCategory("Integration")]
    public void CreateOrder_SavesOrderToDatabase()
    {
        // Integration test
    }

    [TestMethod]
    [TestCategory("Unit")]
    public void CalculateTotal_ReturnsSumOfItems()
    {
        // Unit test
    }

    [TestMethod]
    [TestCategory("Integration")]
    [TestCategory("Slow")]
    public void ProcessLargeOrder_CompletesSuccessfully()
    {
        // Multiple categories allowed
    }
}

Kategorie na úrovni třídy

Použijte kategorii pro testovací třídu, aby se tato kategorie přiřadila ke všem testovacím metodám v rámci třídy.

[TestClass]
[TestCategory("Payments")]
public class PaymentServiceTests
{
    [TestMethod]
    public void ProcessPayment_ValidCard_Succeeds()
    {
        // Inherits "Payments" category from class
    }

    [TestMethod]
    [TestCategory("Slow")]
    public void ProcessBatchPayments_LargeVolume_CompletesSuccessfully()
    {
        // Has both "Payments" (from class) and "Slow" (from method) categories
    }
}

Kategorie na úrovni sestavení

Použití kategorie na úrovni sestavení k kategorizaci všech testů v celém testovacím sestavení. Tento přístup je užitečný pro rozlišení typů testů napříč projekty:

// In AssemblyInfo.cs or any file in your test project
using Microsoft.VisualStudio.TestTools.UnitTesting;

[assembly: TestCategory("E2E")]

K uspořádání testovacích projektů podle typu testu použijte kategorie na úrovni sestavení:

Project Kategorie sestavení Účel
MyApp.UnitTests Unit Rychlé, izolované testy jednotek
MyApp.IntegrationTests Integration Testy s externími závislostmi
MyApp.E2ETests E2E Kompletní testy scénářů

Filtrování testů podle kategorie

Spuštění testů podle kategorie pomocí dotnet test příkazu:

# Run only integration tests
dotnet test --filter TestCategory=Integration

# Run tests in multiple categories
dotnet test --filter "TestCategory=Integration|TestCategory=Unit"

# Exclude slow tests
dotnet test --filter TestCategory!=Slow

V Průzkumníku testů sady Visual Studio použijte vyhledávací pole s Trait: předponou:

  • Trait:"TestCategory=Integration" – zobrazuje integrační testy.
  • -Trait:"TestCategory=Slow" - vylučuje pomalé testy.

TestPropertyAttribute

To TestPropertyAttribute přidává vlastní metadata ve formátu klíč-hodnota do testů. Tento atribut použijte, pokud předdefinované atributy nevyhovují vašim potřebám.

[TestClass]
public class CustomMetadataTests
{
    [TestMethod]
    [TestProperty("Feature", "Authentication")]
    [TestProperty("Sprint", "23")]
    [TestProperty("RiskLevel", "High")]
    public void Login_WithValidCredentials_Succeeds()
    {
        // Test with custom properties
    }

    [TestMethod]
    [TestProperty("Feature", "Authorization")]
    [TestProperty("RequirementId", "REQ-AUTH-001")]
    public void AccessAdminPage_RequiresAdminRole()
    {
        // Link to requirements
    }
}

Vlastnosti se zobrazí v okně Vlastnosti sady Visual Studio v části Specifické pro testování.

Filtrování podle vlastních vlastností

# Filter by custom property
dotnet test --filter "Feature=Authentication"

Vlastnictví testu a priorita

OwnerAttribute

Určuje OwnerAttribute , kdo je zodpovědný za test.

[TestClass]
public class PaymentTests
{
    [TestMethod]
    [Owner("jsmith")]
    public void ProcessPayment_ChargesCorrectAmount()
    {
        // John Smith owns this test
    }

    [TestMethod]
    [Owner("team-payments")]
    public void RefundPayment_CreditsCustomerAccount()
    {
        // Team responsibility
    }
}

Filtrování testů podle vlastníka:

dotnet test --filter Owner=jsmith

PriorityAttribute

Označuje PriorityAttribute relativní důležitost testu. Nižší hodnoty označují vyšší prioritu.

[TestClass]
public class CriticalPathTests
{
    [TestMethod]
    [Priority(0)]
    public void Login_IsAlwaysAvailable()
    {
        // Highest priority - core functionality
    }

    [TestMethod]
    [Priority(1)]
    public void CreateAccount_WorksCorrectly()
    {
        // High priority
    }

    [TestMethod]
    [Priority(2)]
    public void CustomizeProfile_SavesPreferences()
    {
        // Medium priority
    }
}

Filtrování testů podle priority:

# Run only highest priority tests
dotnet test --filter Priority=0

# Run high priority or higher
dotnet test --filter "Priority=0|Priority=1"

DescriptionAttribute

Poskytuje DescriptionAttribute čitelný popis toho, co test ověřuje.

Výstraha

Použít Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute, ne System.ComponentModel.DescriptionAttribute. Analyzátor MSTEST0031 zjistí nesprávné použití.

[TestClass]
public class DocumentedTests
{
    [TestMethod]
    [Description("Verifies that orders over $100 receive a 10% discount")]
    public void ApplyDiscount_LargeOrder_Gets10PercentOff()
    {
        // Test implementation
    }

    [TestMethod]
    [Description("Ensures email validation rejects malformed addresses")]
    public void ValidateEmail_InvalidFormat_ReturnsFalse()
    {
        // Test implementation
    }
}

Sledování pracovních položek

WorkItemAttribute

Odkazy WorkItemAttribute propojují testy s pracovními položkami ve vašem sledovacím systému (například Azure DevOps).

[TestClass]
public class BugFixTests
{
    [TestMethod]
    [WorkItem(12345)]
    [Description("Regression test for bug #12345")]
    public void DatePicker_LeapYear_HandlesFebruary29()
    {
        // Test that verifies the bug fix
    }

    [TestMethod]
    [WorkItem(67890)]
    [WorkItem(67891)]  // Can link multiple work items
    public void Export_LargeDataset_CompletesWithinTimeout()
    {
        // Test related to multiple work items
    }
}

GitHubWorkItemAttribute

Tyto GitHubWorkItemAttribute odkazy propojují testy s problémy na GitHubu.

Note

Tato GitHubWorkItemAttribute verze byla zavedena v MSTest 3.8.

[TestClass]
public class GitHubLinkedTests
{
    [TestMethod]
    [GitHubWorkItem("https://github.com/myorg/myrepo/issues/42")]
    public void FeatureX_WorksAsExpected()
    {
        // Test linked to GitHub issue #42
    }

    [TestMethod]
    [GitHubWorkItem("https://github.com/myorg/myrepo/issues/100")]
    [Ignore("Waiting for upstream fix")]
    public void DependentFeature_RequiresUpdate()
    {
        // Ignored test linked to tracking issue
    }
}

Atributy pracovních položek jsou zvláště cenné v kombinaci s Ignore:

[TestMethod]
[Ignore("Known issue, tracked in work item")]
[WorkItem(99999)]
public void KnownIssue_AwaitingFix()
{
    // Provides traceability for why the test is ignored
}

Kombinování atributů

Kombinování více atributů metadat pro komplexní testovací organizaci:

[TestClass]
public class FullyDocumentedTests
{
    [TestMethod]
    [TestCategory("Integration")]
    [TestCategory("API")]
    [Owner("payment-team")]
    [Priority(1)]
    [Description("Verifies that the payment API returns correct error codes for invalid requests")]
    [WorkItem(54321)]
    [TestProperty("Sprint", "24")]
    [TestProperty("Feature", "ErrorHandling")]
    public void PaymentAPI_InvalidRequest_ReturnsAppropriateErrorCode()
    {
        // Well-documented test with full traceability
    }
}

Osvědčené postupy

  1. Používejte konzistentní kategorie: Vytvořte konvence vytváření názvů pro testovací kategorie v rámci projektu.

  2. Nastavte priority strategicky: Zarezervujte Priority(0) si testy kritických cest, které musí projít pro realizovatelný build.

  3. Propojení s pracovními položkami: Testy vždy propojte se souvisejícími pracovními položkami pro sledovatelnost, zejména regresní testy chyb.

  4. Účel testu dokumentu: Slouží Description ke složitým testům, ve kterých název metody plně nevysvětluje záměr.

  5. Zachovat metadata aktuální: Aktualizujte metadata při změně rozsahu testu nebo vlastnictví.

  6. Pro filtrování použijte kategorie: Kategorie návrhu pro podporu potřeb kanálu CI/CD (například "Smoke", "Nightly", "Integration").

Filtrování testů

Filtrování příkazového řádku

# Filter by category
dotnet test --filter TestCategory=Unit

# Filter by owner
dotnet test --filter Owner=jsmith

# Filter by priority
dotnet test --filter Priority=0

# Combine filters (AND)
dotnet test --filter "TestCategory=Integration&Priority=0"

# Combine filters (OR)
dotnet test --filter "TestCategory=Smoke|TestCategory=Critical"

# Exclude by filter
dotnet test --filter TestCategory!=Slow

# Filter by custom property
dotnet test --filter "Feature=Payments"

Průzkumník testů Visual Studio

Použijte vyhledávací pole v Průzkumníku testů:

  • Trait:"TestCategory=Integration" - filtrovat podle kategorie
  • Trait:"Owner=jsmith" - filtrovat podle vlastníka
  • Trait:"Priority=0" - filtrovat podle priority

Další informace o filtrování testů naleznete v tématu Spuštění selektivních testů jednotek.

Viz také