Exemple de rapport de suivi des exigences
Azure DevOps Services | Azure DevOps Server 2022 | Azure DevOps Server 2020
Le rapport de cumul de suivi des exigences s’appuie sur le rapport de suivi des exigences et montre comment agréger des métriques pour un cumul à un niveau. Par exemple, si vous effectuez le suivi des exigences avec les récits utilisateur, vous pouvez agréger des données pour les fonctionnalités à l’aide des requêtes fournies dans cet article.
L’image suivante en contient un exemple.
Ce rapport affiche les informations suivantes pour chaque exigence qu’elle répertorie :
- Pourcentage de travail terminé : barre de progression qui indique le pourcentage de travail terminé en fonction du cumul des heures terminées pour toutes les tâches liées à l’exigence.
- Tests réussis : nombre de cas de test exécutés en fonction de l’exécution de test la plus récente.
- Échec des tests : nombre de cas de test qui ont échoué en fonction de la dernière série de tests.
- Exécuter des tests : nombre d’exécutions de test exécutées.
- Bogues actifs : nombre de bogues liés dans un état actif.
- Bogues fermés : nombre de bogues liés dans un état Fermé, Terminé ou Terminé.
Remarque
Le suivi des conditions requises est pris en charge uniquement pour les cas de test liés via une suite de tests basée sur les conditions requises. L’association entre un élément de travail d’exigence ( Utilisateur Story (Agile), Product Backlog Item (Scrum), Requirement (CMMI) ou Issue (De base) – et l’exécution manuelle des tests est formée uniquement lorsque le cas de test est lié via une suite de tests basée sur les conditions requises.
Questions sur les réponses du rapport
Les rapports de suivi des exigences sont utiles pour répondre aux types de questions suivants.
Progression du travail
- Est-ce que la quantité de travail qui reste pour chaque exigence correspond à vos attentes ?
- Les exigences les plus classées sont-elles implémentées en premier ?
- Combien de tests sont définis pour chaque exigence ? Combien de tests passent-ils ?
- Quelles sont les exigences en cours d’implémentation qui n’ont pas de cas de test définis pour eux ?
Progression de la qualité
- Combien de cas de test ont été exécutés pour chaque exigence et combien ont réussi ?
- Combien de bogues actifs ont-ils chaque exigence ?
- Les bogues sont-ils détectés pour les exigences en cours de test ?
- Les bogues sont-ils résolus ou sont-ils actifs ?
Évaluation des risques
- Quelles sont les exigences à risque ?
- Quelles exigences ne sont pas suffisamment stables pour la mise en production ?
- Quelles exigences pouvons-nous expédier aujourd’hui ?
Important
L’intégration de Power BI et l’accès au flux OData du service Analytics sont généralement disponibles pour Azure DevOps Services et Azure DevOps Server 2020 et versions ultérieures. Les exemples de requêtes fournis dans cet article sont valides uniquement sur Azure DevOps Server 2020 et versions ultérieures, et dépendent de la version v3.0-preview ou ultérieure. Nous vous encourageons à utiliser ces requêtes et à nous fournir des commentaires.
Prérequis
- Accès : être membre d’un projet avec au moins un accès de base .
- Autorisations : par défaut, les membres du projet ont l’autorisation d’interroger Analytics et de créer des vues.
- Pour plus d’informations sur les autres prérequis concernant l’activation du service et des fonctionnalités et les activités de suivi des données générales, consultez Autorisations et conditions préalables pour accéder à Analytics.
Remarque
Cet article part du principe que vous lisez la vue d’ensemble des exemples de rapports à l’aide de requêtes OData et que vous avez une compréhension de base de Power BI.
Pour que le rapport génère des données utiles, vous devez effectuer les tâches suivantes :
- Vous avez défini les éléments de travail requis et les avez affectés à la zone et aux chemins d’itération d’intérêt. Pour plus d’informations sur la définition des chemins d’accès de zone et d’itération, consultez Définir des chemins d’accès de zone et définir des chemins d’itération.
- Pour obtenir le pourcentage d’heures d’achèvement, vous devez renseigner les champs Travail complet et Travail restant des tâches ou bogues liés aux exigences avec le type de lien Enfant .
- Pour obtenir l’état d’exécution des cas de test, vous aurez créé des suites de tests basées sur des conditions requises dans les plans de test correspondant à ces exigences. Les tests inline que vous ajoutez via la carte répondent à cette condition préalable, mais les exigences que vous liez aux tests ne le font pas. Pour plus d’informations, consultez Créer des plans de test et des suites de tests.
- Pour obtenir l’état des bogues, vous aurez créé et lié des bogues aux exigences avec le type de lien enfant .
Exemples de requêtes
Pour générer le rapport, vous devez ajouter trois requêtes Power BI à Power BI Desktop, puis les lier. Chaque requête exécute l’ensemble d’entités ou le jeu TestPoints
d’entitésWorkItems
.
Remarque
Les extraits de requête Power BI fournis dans les sections suivantes incluent les transformations de données requises pour développer des colonnes et modifier le type de données.
Chemins de zone de requête et d’itération
Pour étendre votre rapport à un chemin d’accès de zone et d’itération particulier, vous pouvez filtrer la requête à l’aide AreaSK
de et IterationSK
. Pour plus d’informations, consultez Définir des requêtes de base à l’aide d’OData Analytics.
Remarque
Pour déterminer les propriétés disponibles à des fins de filtre ou de rapport, consultez Informations de référence sur les métadonnées pour Azure Boards. Vous pouvez filtrer vos requêtes ou renvoyer des propriétés à l’aide de l’une Property
des valeurs sous ou EntityType
des NavigationPropertyBinding Path
valeurs disponibles avec un EntitySet
. Chaque EntitySet
correspond à un EntityType
. Pour plus d’informations sur le type de données de chaque valeur, passez en revue les métadonnées fournies pour le type de données correspondant EntityType
.
Requête pour le pourcentage d’heures d’achèvement pour les exigences
Remarque
Modifiez la WorkItemType
base du processus que vous utilisez. Le modèle Scrum prend en charge les fonctionnalités et le modèle De base prend en charge Epic comme type d’élément de travail cumulatif, respectivement.
Copiez et collez la requête Power BI suivante directement dans la fenêtre Obtenir une requête vide de données>. Pour plus d’informations, consultez Vue d’ensemble des exemples de rapports à l’aide de requêtes 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"
Rechercher l’état d’exécution des tests des exigences
Remarque
Pour déterminer les propriétés disponibles à des fins de filtre ou de rapport, consultez la référence des métadonnées pour Test Plans Analytics. Vous pouvez filtrer vos requêtes ou renvoyer des propriétés à l’aide de l’une Property
des valeurs sous ou EntityType
des NavigationPropertyBinding Path
valeurs disponibles avec un EntitySet
. Chaque EntitySet
correspond à un EntityType
. Pour plus d’informations sur le type de données de chaque valeur, passez en revue les métadonnées fournies pour le type de données correspondant EntityType
.
Copiez et collez la requête Power BI suivante directement dans la fenêtre Obtenir une requête vide de données>. Pour plus d’informations, consultez Vue d’ensemble des exemples de rapports à l’aide de requêtes 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"
Remarque
L’entrée TestSuite/RequirementWorkItem/...
indique que l’élément de travail doit être lié à la suite de tests par le biais d’une suite de tests basée sur des conditions requises, comme indiqué dans les conditions préalables.
Rechercher l’état des bogues liés aux exigences
Remarque
Modifiez la WorkItemType
base du processus que vous utilisez. Le modèle Scrum prend en charge les fonctionnalités et le modèle De base prend en charge Epic comme type d’élément de travail cumulatif, respectivement.
Copiez et collez la requête Power BI suivante directement dans la fenêtre Obtenir une requête vide de données>. Pour plus d’informations, consultez Vue d’ensemble des exemples de rapports à l’aide de requêtes 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"
Chaînes de substitution et répartition des requêtes
Remplacez les chaînes suivantes par vos valeurs. N’incluez pas de crochets {} avec votre substitution. Par exemple, si le nom de votre organisation est « Fabrikam », remplacez par {organization}
Fabrikam
, et non {Fabrikam}
par .
{organization}
- Nom de votre organisation{project}
- Nom de votre projet{iterationSK}
- GUID associé au chemin d’itération d’intérêt. Pour rechercher le GUID, consultez [.. /extend-analytics/wit-analytics.md#itérationsk](Retourner itérationSK pour un chemin d’itération spécifique){areaSK}
- GUID associé au chemin d’accès à la zone d’intérêt. Pour rechercher le GUID, consultez [.. /extend-analytics/wit-analytics.md#areask](Retournez la zoneSK pour un chemin d’accès de zone spécifique).
Répartition des requêtes
Le tableau suivant décrit chaque partie de la requête.
Composant de requête
Description
$filter=( IterationSK eq {iterationSK} and AreaSK eq {areaSK}
et WorkItemType eq 'Feature' )'
Retourne des données uniquement pour les fonctionnalités sous l’itération et la zone spécifiées.
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)))
Renvoyer des données pour les éléments requis de backlog sélectionnés uniquement sous l’itération et la zone spécifiées.
&$expand=Descendants( $apply=filter( CompletedWork ne null or RemainingWork ne null )
Développez les éléments enfants des fonctionnalités et retournez les données Travail terminé et Travail restant pour les éléments de travail.
&$expand=Descendants( $apply=filter( WorkItemType eq 'Bug' ) /groupby( (State), aggregate($count as Count) )
Développez les éléments enfants des fonctionnalités et filtrez pour le bogue, regroupez les données renvoyées par État et soleilz le nombre total d’éléments enfants.
/aggregate($count as TotalCount,
Agréger des données sur les points de test filtrés avec un nombre égal 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)
Lors de l’agrégation, additionnez les valeurs des points de test en fonction de leur dernier résultat d’exécution passé, Failed, Blocked, NotApplicable et None. En outre, additionnez les valeurs des points de test dont le résultat le plus récent n’est pas égal à Aucun pour obtenir le total RunCount
.
/aggregate( iif(CompletedWork ne null, CompletedWork, 0) with sum as SumCompletedWork, iif(RemainingWork ne null, RemainingWork, 0) with sum as SumRemainingWork
Agréger les données Travail terminé et Travail restant sur les éléments de travail filtrés.
)/compute( (SumCompletedWork add SumRemainingWork) as TotalWork, SumCompletedWork as SumCompleted
Calculez le cumul total du travail terminé et du travail restant.
)/compute( iif(TotalWork gt 0,(SumCompleted div cast(TotalWork, Edm.Double) mul 100), 0) as PercCompletedWork )
Calculez le pourcentage de wor terminé.
Créer le rapport de table
- Sous l’onglet Modélisation , choisissez Gérer les relations et liez les trois résultats de la requête par
WorkItemId
colonne. - Sous Visualisations, choisissez Table.
- Ajoutez les colonnes qui vous intéressent à partir des trois requêtes Power BI.
- Sélectionnez Sum en tant qu’agrégation pour les colonnes additives comme Les tests réussis, etc.
Ici, les scénarios d’authentification sont une fonctionnalité parente de deux récits utilisateur.
Articles connexes
- Explorer des exemples de rapports à l’aide de requêtes OData
- Construire des requêtes OData pour Analytics
- Se connecter à Power BI à l’aide de requêtes OData
- Reportez-vous aux métadonnées pour Azure Boards Analytics
- Accéder à des exemples de rapports et à un index de référence rapide
- Ajouter un segment Team à un rapport existant