Freigeben über


Beispielbericht zur Anforderungsnachverfolgung

Azure DevOps Services | Azure DevOps Server 2022 | Azure DevOps Server 2020

Mit dem Bericht zur Nachverfolgung von Anforderungen können Sie die Qualität der Arbeitsaufgaben nachverfolgen, die zur Kategorie "Anforderungen" gehören. Die Kategorie "Anforderungen" enthält Arbeitsaufgaben wie User Stories (Agile), Product Backlog Items (Scrum), Issues (Basic) und Requirements (CMMI). Weitere Informationen zu Arbeitsaufgabenkategorien finden Sie unter Nachverfolgen von Benutzergeschichten, Problemen, Fehlern und anderen Arbeitsaufgaben.

Die folgende Abbildung zeigt ein Beispiel für einen Bericht zur Nachverfolgung von Anforderungen.

Screenshot des Berichts zur Nachverfolgung von Power BI-Anforderungen.

In diesem Bericht werden die folgenden Informationen für jede Anforderung angezeigt, die sie auflistet:

  • Prozentsatz abgeschlossener Arbeit: Statusanzeige, die den Prozentsatz der abgeschlossenen Arbeit basierend auf dem Rollup der abgeschlossenen Stunden für alle Vorgänge anzeigt, die mit der Anforderung verknüpft sind.
  • Bestandene Tests: Die Anzahl der Testfälle, die basierend auf der letzten Testausführung bestanden werden.
  • Fehlgeschlagene Tests: Die Anzahl der Testfälle, die basierend auf der letzten Testausführung fehlgeschlagen sind.
  • Ausführen von Tests: Die Anzahl der ausgeführten Testläufe.
  • Aktive Fehler: Die Anzahl der verknüpften Fehler in einem aktiven Zustand.
  • Geschlossene Fehler: Die Anzahl der verknüpften Fehler in einem Zustand "Geschlossen", "Fertig" oder "Abgeschlossen".

Hinweis

Die Anforderungsnachverfolgung wird nur für Testfälle unterstützt, die über eine anforderungsbasierte Testsuite verknüpft sind. Die Zuordnung zwischen einer Anforderungsarbeitsaufgabe – User Story (Agile), Product Backlog Item (Scrum), Requirement (CMMI) oder Issue (Basic) – und der manuellen Testausführung wird nur gebildet, wenn der Testfall über eine anforderungsbasierte Testsuite verknüpft ist.

Fragen der Antworten auf den Bericht

Anforderungsnachverfolgungsberichte sind nützlich, um die folgenden Arten von Fragen zu beantworten.

Arbeitsfortschritt

  • Entspricht die Arbeitsmenge, die für jede Anforderung verbleibt, Ihren Erwartungen?
  • Werden die höchsten Anforderungen zuerst implementiert?
  • Wie viele Tests sind für jede Anforderung definiert? Wie viele Tests bestehen?
  • Welche Anforderungen werden implementiert, für die keine Testfälle definiert sind?

Qualitätsfortschritt

  • Wie viele Testfälle wurden für jede Anforderung ausgeführt, und wie viele wurden bestanden?
  • Wie viele aktive Fehler hat jede Anforderung?
  • Werden Fehler für Anforderungen gefunden, die getestet werden?
  • Werden Fehler behoben oder bleiben sie aktiv?

Risikobewertung

  • Welche Anforderungen sind gefährdet?
  • Welche Anforderungen sind für die Veröffentlichung nicht ausreichend stabil?
  • Welche Anforderungen können wir heute versenden?

Wichtig

Power BI-Integration und Zugriff auf den OData-Feed des Analytics-Diensts sind in der Regel für Azure DevOps Services und Azure DevOps Server 2020 und höhere Versionen verfügbar. Die in diesem Artikel bereitgestellten Beispielabfragen gelten nur für Azure DevOps Server 2020 und höhere Versionen und hängen von version 3.0-preview oder höher ab. Wir empfehlen Ihnen, diese Abfragen zu verwenden und uns Feedback zu geben.

Voraussetzungen

Hinweis

In diesem Artikel wird davon ausgegangen, dass Sie eine Übersicht über Beispielberichte mit OData-Abfragen lesen und ein grundlegendes Verständnis von Power BI haben.

Damit der Bericht nützliche Daten generiert, müssen Sie die folgenden Aufgaben ausführen:

  • Sie haben Anforderungsarbeitselemente definiert und diesen den Bereichen und Iterationspfaden von Interesse zugewiesen. Informationen zum Definieren von Bereichs- und Iterationspfaden finden Sie unter Definieren von Bereichspfaden und Definieren von Iterationspfaden.
  • Um den Prozentsatz der Fertigstellung von Stunden zu erhalten, müssen Sie die Felder "Abgeschlossene Arbeit " und "Verbleibende Arbeit " von Vorgängen oder Fehlern ausfüllen, die mit den Anforderungen mit dem Typ "Untergeordneter Link" verknüpft sind.
  • Um den Ausführungsstatus von Testfällen zu erhalten, haben Sie anforderungsbasierte Testsuiten in Testplänen erstellt, die diesen Anforderungen entsprechen. Inlinetests, die Sie über das Board hinzufügen, erfüllen diese Voraussetzung, jedoch die Anforderungen, die Sie mit Tests verknüpfen, nicht. Weitere Informationen finden Sie unter Erstellen von Testplänen und Testsuiten.
  • Um den Status von Fehlern zu erhalten, haben Sie Fehler erstellt und mit den Anforderungen mit dem Typ " Untergeordneter Link" verknüpft.

Beispielabfragen

Um den Bericht zu generieren, müssen Sie drei Power BI-Abfragen zum Power BI-Desktop hinzufügen und diese dann verknüpfen. Jede Abfrage führt entweder den Satz oder TestPoints den WorkItems Entitätssatz aus.

Hinweis

Die in den folgenden Abschnitten bereitgestellten Power BI-Abfrageausschnitte umfassen die erforderlichen Datentransformationen zum Erweitern von Spalten und Ändern des Datentyps.

Hinweis

Informationen zum Ermitteln verfügbarer Eigenschaften für Filter- oder Berichtszwecke finden Sie unter Metadatenreferenz für Azure Boards. Sie können Ihre Abfragen filtern oder Eigenschaften zurückgeben, indem Sie einen der Werte unter oder NavigationPropertyBinding PathEntityType verwenden, die Property mit einem EntitySetverfügbar sind. Jede EntitySet entspricht einem EntityType. Weitere Informationen zum Datentyp der einzelnen Werte erhalten Sie in den Metadaten, die für den entsprechenden Wert EntityTypebereitgestellt werden.

Abfragebereichs- und Iterationspfade

Um den Bericht auf einen bestimmten Bereichs- und Iterationspfad zu beschränken, können Sie die Abfrage mithilfe von AreaSK und IterationSK filtern. Ausführliche Informationen finden Sie unter Definieren grundlegender Abfragen mit OData Analytics.

Abfragen des Prozentsatzes des Stundenabschlusses für Anforderungen

Hinweis

Die folgende Abfrage funktioniert für den Agile-Prozess, da er definiert und Completed Work Felder in Arbeitsaufgaben definiertRemaining Work.

Kopieren Sie die folgende Power BI-Abfrage, und fügen Sie sie direkt in das Fenster "Leere Datenabfrage> abrufen" ein. Weitere Informationen finden Sie unter Übersicht über Beispielberichte mit OData-Abfragen.

let
    Source = OData.Feed("https://analytics.dev.azure.com/{organization}/{project}/_odata/v3.0-preview/WorkItems? 
    $filter=(
        IterationSK eq {iterationSK}
        and AreaSK eq {areaSK}
        and Processes/any(p:p/BacklogType eq 'RequirementBacklog') 
        and Processes/all(p:p/IsBugType eq false)
    )
    &$expand=Descendants(
        $apply=filter(
            CompletedWork ne null 
            or RemainingWork ne null
        )
        /aggregate(
            iif(CompletedWork ne null, CompletedWork, 0) with sum as SumCompletedWork, 
            iif(RemainingWork ne null, RemainingWork, 0) with sum as SumRemainingWork
        )/compute(
            (SumCompletedWork add SumRemainingWork) as TotalWork, 
            SumCompletedWork as SumCompleted
        )/compute(
            iif(TotalWork gt 0,(SumCompleted div cast(TotalWork, Edm.Double) mul 100), 0) as PercCompletedWork
        )
)&$select=WorkItemId, Title", null, [Implementation="2.0"]),
    #"Expanded Descendants" = Table.ExpandTableColumn(Source, "Descendants", {"SumCompletedWork", "SumRemainingWork", "TotalWork", "SumCompleted", "PercCompletedWork"}, {"Descendants.SumCompletedWork", "Descendants.SumRemainingWork", "Descendants.TotalWork", "Descendants.SumCompleted", "Descendants.PercCompletedWork"}),
    #"Changed Type" = Table.TransformColumnTypes(#"Expanded Descendants",{{"Descendants.SumCompletedWork", type number}, {"Descendants.SumRemainingWork", type number}, {"Descendants.TotalWork", type number}, {"Descendants.SumCompleted", type number}, {"Descendants.PercCompletedWork", type number}})
in
    #"Changed Type"

Abfrage zum Testausführungsstatus der Anforderungen

Hinweis

Informationen zum Ermitteln verfügbarer Eigenschaften für Filter- oder Berichtszwecke finden Sie in der Metadatenreferenz für Testpläne Analytics. Sie können Ihre Abfragen filtern oder Eigenschaften zurückgeben, indem Sie einen der Werte unter oder NavigationPropertyBinding PathEntityType verwenden, die Property mit einem EntitySetverfügbar sind. Jede EntitySet entspricht einem EntityType. Weitere Informationen zum Datentyp der einzelnen Werte erhalten Sie in den Metadaten, die für den entsprechenden Wert EntityTypebereitgestellt werden.

Kopieren Sie die folgende Power BI-Abfrage, und fügen Sie sie direkt in das Fenster "Leere Datenabfrage> abrufen" ein. Weitere Informationen finden Sie unter Übersicht über Beispielberichte mit OData-Abfragen.

let 
    Source = OData.Feed ("https://analytics.dev.azure.com/{organization}/{project}/_odata/v3.0-preview/TestPoints? 
    $apply=filter(
        (TestSuite/RequirementWorkItem/IterationSK eq {iterationSK} 
        and TestSuite/RequirementWorkItem/AreaSK eq {areaSK}
        and TestSuite/RequirementWorkItem/Processes/any(p:p/BacklogType eq 'RequirementBacklog') 
        and TestSuite/RequirementWorkItem/Processes/all(p:p/IsBugType eq false)
        )
    )
    /compute(TestSuite/RequirementWorkItem/WorkItemId as WorkItemId, TestSuite/RequirementWorkItem/Title as WorkItemTitle)
    /groupby(
        (WorkItemId, WorkItemTitle),
        aggregate(
            $count as TotalCount, 
            cast(LastResultOutcome eq 'Passed', Edm.Int32) with sum as PassedCount, 
            cast(LastResultOutcome eq 'Failed', Edm.Int32) with sum as FailedCount, 
            cast(LastResultOutcome eq 'Blocked', Edm.Int32) with sum as BlockedCount,
            cast(LastResultOutcome eq 'NotApplicable', Edm.Int32) with sum as NotApplicableCount,
            cast(LastResultOutcome eq 'None', Edm.Int32) with sum as NotRunCount, 
            cast(LastResultOutcome ne 'None', Edm.Int32) with sum as RunCount)
)", null, [Implementation="2.0"]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"TotalCount", type number}, {"PassedCount", type number}, {"FailedCount", type number}, {"BlockedCount",type number}, {"NotApplicableCount", type number}, {"NotRunCount", type number}, {"RunCount", type number}})
in
    #"Changed Type"

Hinweis

Der TestSuite/RequirementWorkItem/... Eintrag gibt an, dass die Arbeitsaufgabe über eine anforderungsbasierte Testsuite mit der Testsuite verknüpft werden muss, wie in den Voraussetzungen beschrieben.

Abfragen des Status von Fehlern, die mit den Anforderungen verknüpft sind

Kopieren Sie die folgende Power BI-Abfrage, und fügen Sie sie direkt in das Fenster "Leere Datenabfrage> abrufen" ein. Weitere Informationen finden Sie unter Übersicht über Beispielberichte mit OData-Abfragen.

let
    Source = OData.Feed("https://analytics.dev.azure.com/{organization}/{project}/_odata/v3.0-preview/WorkItems?
    $filter=(
        IterationSK eq {iterationSK} 
        and AreaSK eq {areaSK}
        and Processes/any(p:p/BacklogType eq 'RequirementBacklog') 
        and Processes/all(p:p/IsBugType eq false)
    )
    &$expand=Links(
        $apply=filter(
            (LinkTypeName eq 'Child' or LinkTypeName eq 'Related')
            and TargetWorkItem/WorkItemType eq 'Bug'
        )
        /groupby(
            (TargetWorkItem/State),
            aggregate($count as Count)
        )
    )&$select=WorkItemId,Title", null, [Implementation="2.0"]),
    #"Expanded Links" = Table.ExpandTableColumn(Source, "Links", {"TargetWorkItem", "Count"}, {"Links.TargetWorkItem", "Links.Count"}),
    #"Expanded Links.TargetWorkItem" = Table.ExpandRecordColumn(#"Expanded Links", "Links.TargetWorkItem", {"State"}, {"Links.TargetWorkItem.State"}),
    #"Filtered Rows" = Table.SelectRows(#"Expanded Links.TargetWorkItem", each [Links.Count] <> null and [Links.Count] <> ""),
    #"Pivoted Column" = Table.Pivot(#"Filtered Rows", List.Distinct(#"Filtered Rows"[Links.TargetWorkItem.State]), "Links.TargetWorkItem.State", "Links.Count", List.Sum),
    #"Changed Type" = Table.TransformColumnTypes(#"Pivoted Column",{{"Active", type number}, {"Closed", type number}})
in
    #"Changed Type"

Ersetzungszeichenfolgen und Abfrageaufschlüsselung

Ersetzen Sie die folgenden Zeichenfolgen durch Ihre Werte. Schließen Sie keine Klammern {} in Ihre Ersetzung ein. Wenn Ihr Organisationsname beispielsweise "Fabrikam" lautet, ersetzen Sie {organization} durch Fabrikam, nicht {Fabrikam}.

  • {organization} - Name Ihrer Organisation
  • {project} - Der Name Ihres Projekts
  • {iterationSK}- Die GUID, die dem Iterationspfad von Interesse zugeordnet ist. Informationen zum Nachschlagen der GUID finden Sie unter [.. /extend-analytics/wit-analytics.md#iterationsk](IterationSK für einen bestimmten Iterationspfad zurückgeben)
  • {areaSK} - Die GUID, die dem Bereichspfad von Interesse zugeordnet ist. Informationen zum Nachschlagen der GUID finden Sie unter [.. /extend-analytics/wit-analytics.md#areask](Return the AreaSK for a specific Area Path).

Abfrageaufschlüsselung

In der folgenden Tabelle werden die einzelnen Teile der Abfrage beschrieben.

Abfrageteil

Beschreibung


$filter=( IterationSK eq {iterationSK} and AreaSK eq {areaSK} )`

Gibt Daten nur für ausgewählte Iterations-, Flächen- und Backlogarbeitselemente zurück.

Processes/any(p:p/BacklogType eq 'RequirementBacklog')

Filtern Sie die Arbeitsaufgaben so, dass sie in die Kategorie "Anforderungen" fallen sollten, für mindestens einen Prozess, der ihnen zugeordnet ist.

Processes/all(p:p/IsBugType eq false)

Lassen Sie die Arbeitsaufgaben des Fehlertyps aus, während Sie Anforderungen erhalten. In der Standardprozessvorlage sind Problemarbeitselemente ebenfalls fehlertyp, daher entfernen Sie diese Klausel für den einfachen Prozess aus Ihrer Abfrage.

filter( (TestSuite/RequirementWorkItem/IterationSK eq {iterationSK} and TestSuite/RequirementWorkItem/AreaSK eq {areaSK} and TestSuite/RequirementWorkItem/Processes/any(p:p/BacklogType eq 'RequirementBacklog') and TestSuite/RequirementWorkItem/Processes/all(p:p/IsBugType eq false) ) )

Gibt Daten nur für ausgewählte Anforderungen basierend auf Iteration und Bereich zurück.

/aggregate($count as TotalCount,

Aggregiert Daten über die gefilterten Testpunkte mit der Anzahl als TotalCount.

cast(LastResultOutcome eq 'Passed', Edm.Int32) with sum as Passed

Beim Aggregieren werden Typ-Cast-Testpunkte mit dem neuesten Ausführungsergebnis "Passed" auf 1 und summieren sie als "Passed" Metrik.

&$expand=Descendants( $apply=filter( CompletedWork ne null or RemainingWork ne null )

Gibt die Daten "Abgeschlossene Arbeit " und "Verbleibende Arbeit " für untergeordnete Arbeitselemente gefilterter übergeordneter Elemente zurück.

/aggregate( iif(CompletedWork ne null, CompletedWork, 0) with sum as SumCompletedWork, iif(RemainingWork ne null, RemainingWork, 0) with sum as SumRemainingWork

Aggregierte Arbeits- und Restarbeitsdaten für die gefilterten Arbeitsaufgaben.

)/compute( (SumCompletedWork add SumRemainingWork) as TotalWork, SumCompletedWork as SumCompleted

Berechnen des Gesamtrollups abgeschlossener Arbeit und verbleibender Arbeit.

)/compute( iif(TotalWork gt 0,(SumCompleted div cast(TotalWork, Edm.Double) mul 100), 0) as PercCompletedWork )

Berechnen Sie den Prozentsatz der abgeschlossenen Wor.

Erstellen des Tabellenberichts

Führen Sie zum Erstellen des Berichts die folgenden Schritte aus:

  1. Wählen Sie auf der Registerkarte "Modellieren" Beziehungen verwalten aus, und verknüpfen Sie die drei Abfrageergebnisse nach WorkItemId Spalte.
  2. Wählen Sie unter "Visualisierungen" die Option "Tabelle" aus.
  3. Fügen Sie die Spalten hinzu, an der Sie interessiert sind, aus den drei Power BI-Abfragen.
  4. Wählen Sie "Summe " als Aggregation für additive Spalten wie bestandene Tests usw. aus.

    Power BI wählt Summe als Aggregation aus.

Ihr Bericht sollte ähnlich wie in der folgenden Abbildung aussehen.

Screenshot des Berichts zur Nachverfolgung von Power BI-Anforderungen