Beispielbericht zum Nachverfolgen von Anforderungen für das Rollup

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

Der Bericht über die Anforderungsnachverfolgung baut auf dem Bericht zur Überwachung von Anforderungen auf und zeigt, wie Metriken für ein Rollup auf einer Ebene aggregiert werden. Wenn Sie beispielsweise Anforderungen mit User Stories nachverfolgen, können Sie Daten für Features mithilfe der in diesem Artikel bereitgestellten Abfragen aggregieren.

In der folgenden Abbildung ist ein Beispiel angegeben.

Screenshot des Power BI Stories Overview Rollup Report.

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.

Abfragebereichs- und Iterationspfade

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

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.

Abfragen des Prozentsatzes des Stundenabschlusses für Anforderungen

Hinweis

Ändern Sie den WorkItemType prozessbasierten Vorgang, den Sie verwenden. Die Scrum-Vorlage unterstützt Feature und die Vorlage "Basic" unterstützt Epic als Rollup-Arbeitsaufgabentyp.

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 WorkItemType eq 'Feature'
)
&$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(iif(TestSuite/RequirementWorkItem/Parent ne null, TestSuite/RequirementWorkItem/Parent/WorkItemId, 0) as ParentWorkItemId, 
	iif(TestSuite/RequirementWorkItem/Parent ne null, TestSuite/RequirementWorkItem/Parent/Title, 'Unparented') as ParentWorkItemTitle
	)/groupby(
	    (ParentWorkItemId, ParentWorkItemTitle), 
	    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

Hinweis

Ändern Sie den WorkItemType prozessbasierten Vorgang, den Sie verwenden. Die Scrum-Vorlage unterstützt Feature und die Vorlage "Basic" unterstützt Epic als Rollup-Arbeitsaufgabentyp.

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 WorkItemType eq 'Feature'
    )
&$expand=Descendants(
    $apply=filter(
        WorkItemType eq 'Bug'
    )
    /groupby(
        (State),
        aggregate($count as Count)
    )
)
&$select=WorkItemId,Title", null, [Implementation="2.0"]),
    #"Expanded Descendants" = Table.ExpandTableColumn(Source, "Descendants", {"State", "Count"}, {"Descendants.State", "Descendants.Count"}),
    #"Filtered Rows" = Table.SelectRows(#"Expanded Descendants", each [Descendants.Count] <> null and [Descendants.Count] <> ""),
    #"Pivoted Column" = Table.Pivot(#"Filtered Rows", List.Distinct(#"Filtered Rows"[Descendants.State]), "Descendants.State", "Descendants.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} und WorkItemType eq 'Feature' )'

Gibt Daten nur für Features unter der angegebenen Iteration und dem angegebenen Bereich zurück.

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 Backloganforderungselemente unter der angegebenen Iteration und dem angegebenen Bereich zurück.

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

Erweitern Sie die untergeordneten Elemente von Features, und geben Sie "Abgeschlossene Arbeit" und "Verbleibende Arbeit" für die Arbeitsaufgaben zurück.

&$expand=Descendants( $apply=filter( WorkItemType eq 'Bug' ) /groupby( (State), aggregate($count as Count) )

Erweitern Sie die untergeordneten Elemente von Features und filtern Sie nach Fehler, gruppieren Sie die Rückgabedaten nach Status, und sonnen Sie die Gesamtanzahl der untergeordneten Elemente.

/aggregate($count as TotalCount,

Aggregiert Daten über die gefilterten Testpunkte mit der Anzahl als 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)

Beim Aggregieren summieren Sie die Werte von Testpunkten basierend auf dem neuesten Ausführungsergebnis von "Bestanden", "Fehlgeschlagen", "Blockiert", "NotApplicable" und "None". Addieren Sie außerdem die Werte der Testpunkte, deren neuestes Ergebnis nicht gleich "None" ist, um die Summe RunCountzu erhalten.

/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

  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.

Hierbei handelt es sich bei Authentifizierungsszenarien um ein übergeordnetes Feature von zwei Benutzergeschichten.

Screenshot des Power BI-Beispielberichts