Exemple de rapport de suivi des exigences
Azure DevOps Services | Azure DevOps Server 2022 | Azure DevOps Server 2020
Vous pouvez suivre la qualité des éléments de travail appartenant à la catégorie Exigences avec le rapport de suivi des exigences. La catégorie Conditions requises inclut des éléments de travail tels que les récits utilisateur (Agile), les éléments du backlog de produit (Scrum), les problèmes (de base) et les exigences (CMMI). Pour plus d’informations sur les catégories d’éléments de travail, consultez Suivre les récits utilisateur, les problèmes, les bogues et d’autres éléments de travail.
L’image suivante montre un exemple de rapport de suivi des exigences.
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.
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
.
Chemins de zone de requête et d’itération
Pour étendre votre rapport à un chemin d’itération et de zone particulier, vous pouvez filtrer la requête à l’aide de AreaSK et itérationSK. Pour plus d’informations, consultez Définir des requêtes de base à l’aide d’OData Analytics.
Requête pour le pourcentage d’heures d’achèvement pour les exigences
Remarque
La requête suivante fonctionne pour le processus Agile, car elle définit Remaining Work
et Completed Work
champs dans les éléments de travail.
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 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"
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(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"
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
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 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"
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}
)`
Retourne des données pour les éléments de travail d’itération, de zone et de backlog sélectionnés uniquement.
Processes/any(p:p/BacklogType eq 'RequirementBacklog')
Filtrez les éléments de travail de telle sorte qu’ils doivent tomber dans la catégorie « exigences » pour au moins un processus associé à ces éléments.
Processes/all(p:p/IsBugType eq false)
Omettez les éléments de travail de type de bogue lors de l’obtention des exigences. Dans le modèle de processus de base, les éléments de travail de problème sont également de type bogue. Par conséquent, pour le processus de base, supprimez cette clause de votre requête.
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 exigences sélectionnées uniquement en fonction de l’itération et de la zone.
/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 Passed
Lors de l’agrégation, les points de test de cast de type ont le résultat d’exécution le plus récent « Passé » à 1 et les additionnez en tant que métrique «Passed
».
&$expand=Descendants( $apply=filter( CompletedWork ne null or RemainingWork ne null )
Retourne les données Travail terminé et Travail restant pour les éléments de travail enfants des éléments parents filtrés.
/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
Pour créer le rapport, procédez comme suit :
- 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.
Votre rapport doit ressembler à l’image suivante.
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