要件追跡サンプル レポート

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

要件追跡レポートを使用して、要件カテゴリに属する作業項目の品質を追跡できます。 要件カテゴリには、ユーザー ストーリー (アジャイル)、製品バックログ項目 (スクラム)、問題 (基本)、要件 (CMMI) などの作業項目が含まれます。 作業項目カテゴリの詳細については、「ユーザー ストーリー、問題、バグ、その他の作業項目を追跡する」を参照してください

次の図は、要件追跡レポートの例を示しています。

Power BI 要件追跡レポートのスクリーンショット。

このレポートには、一覧表示される要件ごとに次の情報が表示されます。

  • 達成率: 要件にリンクされているすべてのタスクの完了時間のロールアップに基づいて完了した作業時間の割合を示す進行状況バー。
  • 成功したテスト: 最新のテスト実行に基づいて成功したテスト ケースの実行の数。
  • 失敗したテスト: 最新のテスト実行に基づいて失敗したテスト ケースの実行の数。
  • テストの実行: 実行されたテスト実行の数。
  • アクティブなバグ: アクティブ状態のリンクされたバグの数。
  • 終了したバグ: Closed、Done、または Completed 状態のリンクされたバグの数。

Note

要件の追跡は、要件ベースのテスト スイートを介してリンクされたテスト ケースでのみサポートされます。 要件作業項目 (ユーザー ストーリー (アジャイル)、製品バックログ項目 (スクラム)、要件 (CMMI)、または問題 (基本)) と手動テスト実行の関連付けは、テスト ケースが要件ベースのテスト スイートを介してリンクされている場合にのみ形成されます。

レポートの回答に関する質問

要件追跡レポートは、次の種類の質問に回答するのに役立ちます。

作業の進行状況

  • 各要件でメインされる作業の量は、期待値に対応していますか?
  • 上位ランクの要件は最初に実装されていますか?
  • 各要件に対していくつのテストが定義されていますか? 合格しているテストの数はいくつですか?
  • テスト ケースが定義されていない要件は何が実装されていますか?

品質の進行状況

  • 各要件に対して実行されたテスト ケースの数と、合格したテスト ケースの数。
  • 各要件に含まれるアクティブなバグの数はいくつですか?
  • テスト中の要件に関するバグが見つかりましたか?
  • バグは解決されていますか、それともアクティブメインですか?

リスク評価

  • どの要件が危険にさらされていますか?
  • リリースに対して十分に安定していない要件はどれですか?
  • 現在出荷できる要件はどれですか?

重要

Power BI の統合と Analytics サービスの OData フィードへのアクセスは、Azure DevOps Services および Azure DevOps Server 2020 以降のバージョンで一般提供されています。 この記事で提供されるサンプル クエリは、Azure DevOps Server 2020 以降のバージョンに対してのみ有効であり、v3.0-preview 以降のバージョンによって異なります。 これらのクエリを使用し、フィードバックをお寄せください。

前提条件

  • 分析データを表示してサービスにクエリを実行するには、 Basic アクセス以上のプロジェクトのメンバーである必要があります。 既定では、すべてのプロジェクト メンバーには、Analytics のクエリと 分析ビューの定義に対するアクセス許可が付与されます。
  • サービスと機能の有効化と一般的なデータ追跡アクティビティに関するその他の前提条件については、「 Analytics にアクセスするためのアクセス許可と前提条件」を参照してください。

Note

この記事では、「 OData クエリを使用したサンプル レポートの概要」を 読み、Power BI の基本的な理解があることを前提としています。

レポートで有用なデータを生成するには、次のタスクを実行する必要があります。

  • 要件作業項目を定義し、対象の領域と反復パスに割り当てた。 エリアパスと反復パスを定義する方法については、「エリアパスの定義」および「反復パス定義」を参照してください。
  • 時間の完了率を取得するには、タスクの [作業の完了] フィールドと [再作業メイン子リンクの種類の要件にリンクされたバグを入力する必要があります。
  • テスト ケースの実行状態を取得するには、それらの要件に対応する要件ベースのテスト スイートをテスト プランに作成します。 かんばんボードを使用して追加するインライン テストは、この前提条件を満たしますが、テストにリンクする要件は満たされません。 詳細については、「テスト 計画とテスト スイートの作成」を参照してください
  • バグの状態を取得するには、子リンクの種類を使用してバグを作成し、要件にリンクします。

サンプル クエリ

レポートを生成するには、Power BI Desktop に 3 つの Power BI クエリを追加し、それらをリンクする必要があります。 各クエリは、またはTestPointsエンティティ セットのいずれかをWorkItems実行します。

Note

次のセクションで提供される Power BI クエリ スニペットには、列を展開してデータ型を変更するために必要なデータ変換が含まれています。

Note

フィルターまたはレポートの目的で使用できるプロパティを確認するには、「Azure Boardsのメタデータ リファレンス」を参照してください。 クエリをフィルター処理したり、 で使用可能な または 値のPropertyEntityTypeNavigationPropertyBinding Pathの値のいずれかを使用してプロパティをEntitySet返したりできます。 各 は EntitySetEntityType対応します。 各値のデータ型の詳細については、対応する EntityTypeに提供されているメタデータを確認してください。

クエリ領域と反復パス

レポートのスコープを特定の Area パスと Iteration パスに設定するには、AreaSK と IterationSK を使用してクエリをフィルター処理できます。 詳細については、「OData Analytics を使用した基本的なクエリの定義」を参照してください

要件に対する時間の完了率のクエリ

Note

次のクエリは、作業項目内のフィールドを定義するため、Remaining WorkCompleted Workアジャイル プロセスに対して機能します。

以下に示す Power BI クエリは、[ データの取得- 空の>クエリ ] ウィンドウに直接貼り付けることができます。 詳細については、「 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"

要件のテスト実行状態のクエリ

Note

フィルターまたはレポートの目的で使用可能なプロパティを決定するには、「Test Plans Analytics のメタデータ リファレンス」を参照してください。 クエリをフィルター処理したり、 で使用可能な または 値のPropertyEntityTypeNavigationPropertyBinding Pathの値のいずれかを使用してプロパティをEntitySet返したりできます。 各 は EntitySetEntityType対応します。 各値のデータ型の詳細については、対応する EntityTypeに提供されているメタデータを確認してください。

以下に示す Power BI クエリは、[ データの取得- 空の>クエリ ] ウィンドウに直接貼り付けることができます。 詳細については、「 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"

Note

このエントリは TestSuite/RequirementWorkItem/... 、前提条件で説明されているように、要件ベースのテスト スイートを 使用して作業項目をテスト スイートリンクする必要があることを示します

要件にリンクされているバグの状態を照会する

以下に示す Power BI クエリは、[ データの取得- 空の>クエリ ] ウィンドウに直接貼り付けることができます。 詳細については、「 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"

置換文字列とクエリの内訳

次の文字列を実際の値に置き換えます。 置換に角かっこを {} 含めないでください。 たとえば、組織名が "Fabrikam" の場合は、 ではなく {Fabrikam}を にFabrikam置き換えます{organization}

  • {organization} - 組織名
  • {project} - プロジェクトの名前
  • {iterationSK}- 対象のイテレーション パス関連付けられている GUID。 GUID を検索するには、[../extend-analytics/wit-analytics.md#iterationsk](特定のイテレーション パスの IterationSK を返します)
  • {areaSK} - 対象のエリア パスに関連付けられている GUID。 GUID を検索するには、[../extend-analytics/wit-analytics.md#areask](特定のエリア パスの AreaSK を返します)。

クエリの内訳

次の表では、クエリの各部分について説明します。

クエリ パーツ

説明


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

選択したイテレーション、領域、バックログの作業項目についてのみデータを返します。

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

少なくとも 1 つのプロセスに対して、作業項目が "要件" カテゴリに分類されるように、作業項目をフィルター処理します。

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

要件を取得するときに、バグの種類の作業項目を省略します。 基本的なプロセス テンプレートでは、問題の作業項目もバグの種類であるため、Basic プロセスの場合は、クエリからこの句を削除します。

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

イテレーションと領域に基づいて、選択した要件のみのデータを返します。

/aggregate($count as TotalCount,

カウントが次の TotalCount値を持つフィルター処理されたテスト ポイント全体のデータを集計します。

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

集計中、型キャストテストは、最新の実行結果 'Passed' を 1 にポイントし、それらを 'Passed' メトリックとして合計します。

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

完成した虫の割合を計算します。

テーブル レポートを作成する

レポートを作成するには、次の手順に従います。

  1. [モデリング] タブでリレーションシップの管理を選択し、3 つのクエリ結果を列ごとにWorkItemIdリンクします。
  2. [視覚化] [テーブル] を選択 します
  3. 3 つの Power BI クエリから関心のある列を追加します。
  4. [成功したテスト] などの加法列の集計として [合計] を選択します。

    Power BI で集計として [合計] を選択する

レポートは次の図のようになります。

Power BI 要件追跡レポートのスクリーンショット