共用方式為


需求追蹤匯總範例報告

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

需求追蹤匯總報告是以需求追蹤報告為基礎,並示範如何匯總單一層級匯總的計量。 例如,如果您要使用 User Storys 追蹤需求,您可以使用本文中提供的查詢來匯總功能的數據。

範例如下圖所示。

Power BI 故事總覽報告的螢幕快照。

此報表會針對列出的每個需求顯示下列資訊:

  • 已完成工時百分比:進度列,根據與需求連結之所有工作的完成時數匯總,顯示已完成工時的百分比。
  • 通過的測試:根據最新的測試回合所通過的測試案例數目。
  • 失敗的測試:根據最近的測試回合執行失敗的測試案例數目。
  • 執行測試:執行的測試回合數目。
  • 活動中的 Bug:處於活動狀態的連結 Bug 數目。
  • 已關閉的錯誤:在已關閉、已完成或完成狀態中的連結錯誤數量。

注意

僅針對透過 需求型測試套件連結的測試案例,才支援需求追蹤。 需求工作專案-使用者故事(Agile)、產品待辦專案(Scrum)、需求(CMMI)或問題(基本)之間的關聯,只有在測試案例透過需求型測試套件連結時,才會形成手動測試執行。

報表回答的問題

需求追蹤報告對於回答下列問題類型很有用。

工作進度

  • 每個需求所保留的工作量是否與您的預期相符?
  • 要先實作排名最高的需求嗎?
  • 針對每個需求定義了多少個測試? 有多少個測試通過?
  • 正在實作哪些需求,但尚未定義任何測試案例?

質量進度

  • 針對每個需求執行了多少個測試案例,以及已通過多少個測試案例?
  • 每個需求有多少活躍的 Bug?
  • 有沒有在測試需求時發現 Bug?
  • Bug 是否正在解決,或它們是否處於作用中狀態?

風險評估

  • 哪些需求有風險?
  • 哪些需求不足以穩定發行?
  • 我們今天可以寄送哪些需求?

重要

Power BI 整合及存取Analytics Service 的 OData 摘要已正式推出,適用於 Azure DevOps Services 和 Azure DevOps Server 2020 及更新版本。 本文中提供的範例查詢僅適用於 Azure DevOps Server 2020 和更新版本,且相依於 v3.0-preview 或更新版本。 我們鼓勵您使用這些查詢並提供意見反應。

類別 要求
存取層級 - 專案成員
- 至少擁有 基本 存取權限。
許可 根據預設,項目成員具有查詢分析及建立檢視的許可權。 如需有關服務與功能啟用和一般數據追蹤活動之其他必要條件的詳細資訊,請參閱 存取分析的許可權和必要條件。

注意

本文假設您已閱讀 使用 OData 查詢 的範例報表概觀,並具備 Power BI 的基本瞭解。

若要讓報表產生有用的數據,您必須執行下列工作:

  • 您已定義需求工作項,並將其指派給相關的區域和迭代路徑。 如需如何定義區域和反覆專案路徑的資訊,請參閱 定義區域路徑定義反覆項目路徑
  • 若要取得完成時數的百分比,您必須填入[完成工時][剩餘工時]字段,或連結到具有[子]鏈接類型之需求的任務或錯誤。
  • 若要取得測試案例的執行狀態,您將已在與這些需求對應的 Test Plans 中建立 以需求為基礎的測試套件 。 您在面板中新增的內嵌測試符合此必要條件,但是將需求連結到測試並不會滿足此條件。 如需詳細資訊,請參閱 建立測試計劃和測試套件
  • 若要取得 Bug 的狀態,您必須先建立並將 Bug 以 連結類型連結到需求。

範例查詢

若要產生報表,您必須將三個 Power BI 查詢新增至 Power BI Desktop,然後鏈接它們。 每個查詢都會執行 WorkItemsTestPoints 其中任一實體集。

注意

下列各節中提供的Power BI查詢代碼段包含擴充數據行和變更數據類型的必要資料轉換。

查詢區域和迭代路徑

若要將報表的範圍設定為特定區域和反覆項目路徑,您可以使用AreaSKIterationSK來篩選查詢。 如需詳細資訊,請參閱 使用 OData Analytics 定義基本查詢。

注意

若要判斷篩選或報表用途的可用屬性,請參閱 Azure Boards 的元數據參考。 您可以使用EntityTypeNavigationPropertyBinding Path中的任何Property值,或使用EntitySet中的值來篩選查詢或返回屬性。 每個 EntitySet 對應至 EntityType。 如需每個值之數據類型的詳細資訊,請檢閱針對對應 EntityType提供的元數據。

查詢需求完成的時數百分比

注意

根據您使用的流程變更WorkItemType。 Scrum 範本支援 功能 ,而基本範本則分別支援 Epic 作為積存工作專案類型。

將下列 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 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"

查詢需求的測試執行狀態

注意

若要判斷篩選或報表用途的可用屬性,請參閱 Test Plans Analytics 的元數據參考。 您可以使用位於 EntityTypeNavigationPropertyBinding Path 下的任何 Property 值來篩選查詢或傳回屬性,或使用 EntitySet 中可用的值。 每個 EntitySet 對應至 EntityType。 如需每個值之數據類型的詳細資訊,請檢閱針對對應 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(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"

注意

TestSuite/RequirementWorkItem/... 項目表示工作項目必須透過 需求型測試套件連結至測試套件,正如在先決條件部分所討論的

查詢與需求相關的錯誤狀態

注意

根據您使用的過程變更WorkItemType。 Scrum 範本支援 功能 ,而基本範本則分別支援 Epic 作為積存工作專案類型。

將下列 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 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」 ,請將 取代 {organization}Fabrikam,而非 {Fabrikam}

  • {organization} - 您的組織名稱
  • {project} - 項目的名稱
  • {iterationSK} - 與 感興趣的迭代路徑 相關聯的 GUID。 若要查閱 GUID,請參閱 [../extend-analytics/wit-analytics.md#iterationsk](傳回特定迭代路徑的迭代SK)
  • {areaSK} - 與感興趣的區域路徑相關聯的 GUID。 若要查閱 GUID,請參閱 [../extend-analytics/wit-analytics.md#areask](傳回特定區域路徑的 AreaSK)。

查詢明細

下表描述查詢的每個部分。

查詢部分

說明


$filter=( IterationSK eq {iterationSK} and AreaSK eq {areaSK} 和 WorkItemType eq '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 )

展開 [功能] 的子項,並傳回 [已完成工時][剩餘工時] 數據。

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

展開 [功能] 的子項目,篩選子項目的 Bug,並依 [狀態] 分組後計算傳回數據,合計子項目的總數。

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

匯總時,根據測試點的最新執行結果,加總測試點的值:PassedFailed、BlockedNotApplicableNone。 此外,加總其最新結果不等於 None 的測試點值,以取得總計 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. 模型標籤中,選擇 管理關聯性,然後依據欄位連結三個查詢結果。
  2. 在 [視覺效果] 底下,選擇 [數據表]。
  3. 從三個 Power BI 查詢中新增您感興趣的欄位。
  4. 選擇 加總 作為需要加總的欄位(如 已通過的測試 等)的匯總方式。

    Power BI 選取 [加總] 作為彙總方式

在這裡, 驗證案例 是兩個用戶劇本的父功能。

Power BI 範例案例概觀匯總報表的螢幕快照。