次の方法で共有


要件追跡ロールアップのサンプル レポート

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

要件追跡ロールアップ レポートは、要件追跡レポートに基づいており 1 レベルのロールアップのメトリックを集計する方法を示しています。 たとえば、ユーザー ストーリーを使用して要件を追跡する場合は、この記事に記載されているクエリを使用するとフィーチャーのデータを集計できます。

次の図に例を示します。

Power BI ストーリーの概要ロールアップ レポートのスクリーンショット。

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

  • 完了した作業の割合: 要件にリンクされているすべてのタスクの完了時間のロールアップに基づいて完了した作業の割合を示す進行状況バー。
  • 合格したテスト: 最新のテスト実行に基づいて合格したテスト ケースの実行数。
  • 不合格のテスト: 最新のテスト実行に基づいて不合格だったテスト ケースの実行数。
  • テストの実行: 実行されたテスト実行の数。
  • アクティブなバグ: アクティブ状態のリンクされたバグの数。
  • 終了したバグ: [Cisco]、[終了]、または [完了] 状態のリンクされたバグの数。

Note

要件追跡は、要件ベースのテスト スイート経由でリンクされたテスト ケースのみをサポートします。 要件作業項目間の関連付け - ユーザー ストーリー (Agile)、製品バックログ項目 (Scrum)、要件 (CMMI) または問題 (Basic) - および手動テスト実行は、テスト ケースが、要件ベースのテスト スイート経由でリンクされた場合のみ形成されます。

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

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

作業の進行状況

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

品質の進行状況

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

リスク評価

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

重要

Power BI 統合 Analytics Service の 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 クエリを追加し、それらをリンクする必要があります。 各クエリは、WorkItems または TestPoints エンティティ セットを実行します。

Note

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

エリア パスとイテレーション パスをクエリする

レポートを特定のエリア パスとイテレーション パスにスコーピングするには、AreaSK および IterationSK を使用してクエリをフィルター処理します。 詳細については、「OData Analytics を使用して基本クエリを定義する」を参照してください。

Note

フィルターまたはレポートの目的で使用可能なプロパティを確認するには、Azure Boards の Metadata リファレンスを参照してください。 クエリをフィルター処理したり、EntityType の任意の Property 値や、EntitySet で利用可能な NavigationPropertyBinding Path 値を使用して、プロパティを返したりできます。 各 EntitySet は、EntityType に対応しています。 各値のデータ型については、対応する EntityType で指定されたメタデータを確認してください。

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

Note

使用しているプロセスに基づいて WorkItemType を変更します。 Scrum テンプレートは Feature をサポートし、Basic テンプレートでは、それぞれロールアップ作業項目の種類として Epic をサポートしています。

次の Power BI クエリをコピーして、直接 Get Data>Blank 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"

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

Note

フィルターまたはレポートの目的で使用可能なプロパティを確認するには、Test Plans Analytics の Metadata リファレンスを参照してください。 クエリをフィルター処理したり、EntityType の任意の Property 値や、EntitySet で利用可能な NavigationPropertyBinding Path 値を使用して、プロパティを返したりできます。 各 EntitySet は、EntityType に対応しています。 各値のデータ型については、対応する EntityType で指定されたメタデータを確認してください。

次の Power BI クエリをコピーして、直接 Get Data>Blank 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"

Note

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

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

Note

使用しているプロセスに基づいて WorkItemType を変更します。 Scrum テンプレートは Feature をサポートし、Basic テンプレートでは、それぞれロールアップ作業項目の種類として Epic をサポートしています。

次の Power BI クエリをコピーして、直接 Get Data>Blank 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"

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

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

  • {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} and WorkItemType eq 'Feature' )`

指定したイテレーションとエリアの下にある Feature のみのデータを返します。

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

指定したイテレーションとエリアで、選択したバックログ要件項目のデータのみを返します。

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

Feature の子項目を展開し、作業項目の [完了した作業] および [残作業] データを返します。

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

Feature の子項目を展開し、バグをフィルター処理し、状態別に戻りデータをグループ化し、子項目の合計数の総計を計算します。

/aggregate($count as TotalCount,

カウントを 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)

集計集に、[合格][不合格][ブロック][N/A][なし] の最新の実行成果に基づきテスト ポイントの合計値を計算します。 また、最新の成果が、[なし] と等しくないテスト ポイントの値の合計値を計算して、合計 RunCount を取得します。

/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 は、集計として [合計] を選択します。

ここでは、認証シナリオは、2 つのユーザー ストーリーの親機能です。

Power BI サンプル ストーリーの概要ロールアップ レポートのスクリーンショット。