Condividi tramite


Report di esempio di rollup dei requisiti

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

Il report di rollup di verifica dei requisiti si basa sul report Di rilevamento dei requisiti e mostra come aggregare le metriche per un rollup di un livello. Ad esempio, se si stanno monitorando i requisiti con Le storie utente, è possibile aggregare i dati per le funzionalità usando le query fornite in questo articolo.

Nell'immagine seguente è illustrato un esempio.

Screenshot del report di rollup della panoramica delle storie di Power BI.

Questo report visualizza le informazioni seguenti per ogni requisito elencato:

  • Percentuale di lavoro completata: indicatore di stato che mostra la percentuale di lavoro completato in base al rollup delle ore completate per tutte le attività collegate al requisito.
  • Test superati: numero di test case eseguiti che vengono superati in base all'esecuzione del test più recente.
  • Test non superati: numero di test case eseguiti non riusciti in base all'esecuzione del test più recente.
  • Eseguire test: numero di esecuzioni di test eseguite.
  • Bug attivi: numero di bug collegati in uno stato Attivo.
  • Bug chiusi: numero di bug collegati in uno stato Chiuso, Completato o Completato.

Nota

Il rilevamento dei requisiti è supportato solo per i test case collegati tramite un gruppo di test basato su requisiti. L'associazione tra un elemento di lavoro requisito( User Story (Agile), Product Backlog Item (Scrum), Requirement (CMMI) o Issue (Basic) e l'esecuzione manuale del test viene formata solo quando il test case viene collegato tramite un gruppo di test basato su requisiti.

Domande sulle risposte al report

I report di rilevamento dei requisiti sono utili per rispondere ai tipi di domande seguenti.

Avanzamento del lavoro

  • La quantità di lavoro che rimane per ogni requisito corrisponde alle aspettative?
  • I requisiti di primo livello vengono implementati per primi?
  • Quanti test vengono definiti per ogni requisito? Quanti test vengono superati?
  • Quali requisiti vengono implementati senza test case definiti per loro?

Stato di avanzamento della qualità

  • Quanti test case sono stati eseguiti per ogni requisito e quanti sono stati superati?
  • Quanti bug attivi hanno ogni requisito?
  • Vengono rilevati bug per i requisiti da testare?
  • I bug vengono risolti o rimangono attivi?

Valutazione dei rischi

  • Quali requisiti sono a rischio?
  • Quali requisiti non sono sufficientemente stabili per il rilascio?
  • Quali requisiti possiamo spedire oggi?

Importante

L'integrazione di Power BI e l'accesso al feed OData del servizio di analisi sono disponibili a livello generale per Azure DevOps Services e Azure DevOps Server 2020 e versioni successive. Le query di esempio fornite in questo articolo sono valide solo per Azure DevOps Server 2020 e versioni successive e dipendono dalla versione v3.0-preview o successiva. È consigliabile usare queste query e fornire commenti e suggerimenti.

Prerequisiti

  • Accesso: essere un membro di un progetto con almeno l'accesso Basic .
  • Autorizzazioni: per impostazione predefinita, i membri del progetto dispongono dell'autorizzazione per eseguire query su Analisi e creare viste.
  • Per altre informazioni sugli altri prerequisiti relativi all'abilitazione di servizi e funzionalità e alle attività generali di rilevamento dei dati, vedere Autorizzazioni e prerequisiti per l'accesso ad Analytics.

Nota

Questo articolo presuppone che sia possibile leggere Panoramica dei report di esempio usando query OData e avere una conoscenza di base di Power BI.

Affinché il report generi dati utili, è necessario eseguire le attività seguenti:

  • Sono stati definiti gli elementi di lavoro dei requisiti e sono stati assegnati ai percorsi di area e iterazione di interesse. Per informazioni su come definire percorsi di area e iterazione, vedere Definire percorsi di area e Definire percorsi di iterazione.
  • Per ottenere la percentuale di completamento delle ore, è necessario compilare i campi Completamento lavoro e Lavoro rimanente di attività o bug collegati ai requisiti con il tipo di collegamento Figlio .
  • Per ottenere lo stato di esecuzione dei test case, sono stati creati gruppi di test basati sui requisiti in Piani di test corrispondenti a tali requisiti. I test inline aggiunti tramite la scheda soddisfano questo prerequisito, ma i requisiti che si collegano ai test non sono soddisfatti. Per altre informazioni, vedere Creare piani di test e gruppi di test.
  • Per ottenere lo stato dei bug, sono stati creati e collegati bug ai requisiti con il tipo di collegamento Figlio .

Query di esempio

Per generare il report, è necessario aggiungere tre query di Power BI a Power BI Desktop e quindi collegarle. Ogni query esegue il WorkItems set di entità o TestPoints .

Nota

I frammenti di query di Power BI forniti nelle sezioni seguenti includono le trasformazioni dei dati necessarie per espandere le colonne e modificare il tipo di dati.

Percorsi di iterazione e area di query

Per definire l'ambito del report in un percorso di area e iterazione specifico, è possibile filtrare la query usando AreaSK e IterationSK. Per informazioni dettagliate, vedere Definire query di base con OData Analytics.

Nota

Per determinare le proprietà disponibili a scopo di filtro o report, vedere Informazioni di riferimento sui metadati per Azure Boards. È possibile filtrare le query o restituire proprietà usando uno qualsiasi dei Property valori in un EntityType oggetto o NavigationPropertyBinding Path i valori disponibili con un oggetto EntitySet. Ognuno EntitySet corrisponde a un oggetto EntityType. Per altre informazioni sul tipo di dati di ogni valore, esaminare i metadati forniti per l'oggetto corrispondente EntityType.

Query per la percentuale di completamento delle ore per i requisiti

Nota

Modificare l'oggetto WorkItemType in base al processo in uso. Il modello Scrum supporta feature e il modello Basic supporta epica rispettivamente come tipo di elemento di lavoro di rollup.

Copiare e incollare la query di Power BI seguente direttamente nella finestra Recupera dati>query vuota. Per altre informazioni, vedere Panoramica dei report di esempio che usano query OData.

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"

Eseguire una query per verificare lo stato di esecuzione dei requisiti

Nota

Per determinare le proprietà disponibili a scopo di filtro o report, vedere Informazioni di riferimento sui metadati per Analisi dei piani di test. È possibile filtrare le query o restituire proprietà usando uno qualsiasi dei Property valori in un EntityType oggetto o NavigationPropertyBinding Path i valori disponibili con un oggetto EntitySet. Ognuno EntitySet corrisponde a un oggetto EntityType. Per altre informazioni sul tipo di dati di ogni valore, esaminare i metadati forniti per l'oggetto corrispondente EntityType.

Copiare e incollare la query di Power BI seguente direttamente nella finestra Recupera dati>query vuota. Per altre informazioni, vedere Panoramica dei report di esempio che usano query OData.

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"

Nota

La TestSuite/RequirementWorkItem/... voce indica che l'elemento di lavoro deve essere collegato al gruppo di test tramite gruppi di test basati sui requisiti, come descritto nei prerequisiti.

Eseguire una query sullo stato dei bug collegati ai requisiti

Nota

Modificare l'oggetto WorkItemType in base al processo in uso. Il modello Scrum supporta feature e il modello Basic supporta epica rispettivamente come tipo di elemento di lavoro di rollup.

Copiare e incollare la query di Power BI seguente direttamente nella finestra Recupera dati>query vuota. Per altre informazioni, vedere Panoramica dei report di esempio che usano query OData.

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"

Stringhe di sostituzione e scomposizione delle query

Sostituire le stringhe seguenti con i valori. Non includere parentesi quadre {} con la sostituzione. Ad esempio, se il nome dell'organizzazione è "Fabrikam", sostituire {organization} con Fabrikam, non {Fabrikam}.

  • {organization} - Nome dell'organizzazione
  • {project} - Nome del progetto
  • {iterationSK} - GUID associato al percorso di iterazione di interesse. Per cercare il GUID, vedere [.. /extend-analytics/wit-analytics.md#iterationsk](Restituire IterationSK per un percorso di iterazione specifico)
  • {areaSK} - GUID associato al percorso di area di interesse. Per cercare il GUID, vedere [.. /extend-analytics/wit-analytics.md#areask](Restituisce AreaSK per un percorso area specifico).

Suddivisione delle query

La tabella seguente descrive ogni parte della query.

Parte della query

Descrizione


$filter=( IterationSK eq {iterationSK} and AreaSK eq {areaSK} e WorkItemType eq 'Feature' )'

Restituisce i dati solo per Le funzionalità nell'iterazione e nell'area specificati.

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)))

Restituisce i dati solo per gli elementi dei requisiti del backlog selezionati nell'iterazione e nell'area specificati.

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

Espandere gli elementi figlio di Funzionalità e restituire i dati Lavoro completato e Lavoro rimanente per gli elementi di lavoro.

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

Espandere gli elementi figlio di Funzionalità e filtrare i bug, raggruppare i dati restituiti per Stato e visualizzare il conteggio totale degli elementi figlio.

/aggregate($count as TotalCount,

Aggregare i dati nei punti di test filtrati con conteggio come 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)

Durante l'aggregazione, sommare i valori dei punti di test in base al risultato di esecuzione più recente di Superato, Non riuscito, Bloccato, NotApplicable e Nessuno. Sommare anche i valori dei punti di test il cui risultato più recente non è uguale a Nessuno per ottenere il totale RunCount.

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

Aggregare i dati lavoro completato e lavoro rimanente negli elementi di lavoro filtrati.

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

Calcolare il rollup totale del lavoro completato e del lavoro rimanente.

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

Calcolare la percentuale di dati completati.

Creare il report Tabella

  1. Nella scheda Modellazione scegliere Gestisci relazioni e collegare i tre risultati della query in WorkItemId base alla colonna.
  2. In Visualizzazioni scegliere Tabella.
  3. Aggiungere le colonne a cui si è interessati dalle tre query di Power BI.
  4. Selezionare Somma come aggregazione per colonne additivi, ad esempio Test superati e così via.

    Selezionare Somma come aggregazione in Power BI

In questo caso, gli scenari di autenticazione sono una funzionalità padre di due storie utente.

Screenshot del report di rollup della panoramica delle storie di esempio di Power BI.