需求追蹤匯總範例報告

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

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

範例如下圖所示。

Power BI 劇本概觀匯總報表的螢幕快照。

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

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

注意

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

報表回答的問題

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

工作進度

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

質量進度

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

風險評估

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

重要

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

必要條件

  • 若要檢視分析數據和查詢服務,您必須是具有基本存取權或更高許可權的項目成員。 根據預設,所有專案成員都會獲得查詢分析的許可權,並定義分析檢視。
  • 若要瞭解有關服務與功能啟用和一般數據追蹤活動的其他必要條件,請參閱 存取分析的許可權和必要條件。

注意

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

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

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

範例查詢

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

注意

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

查詢區域和反覆項目路徑

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

注意

若要判斷篩選或報表用途的可用屬性,請參閱 Azure Boards 的元數據參考。 您可以使用的 或 NavigationPropertyBinding PathEntitySet底下EntityType的任何Property值來篩選查詢或傳回屬性。 每個 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 的元數據參考。 您可以使用的 或 NavigationPropertyBinding PathEntitySet底下EntityType的任何Property值來篩選查詢或傳回屬性。 每個 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/...表示工作項目必須透過需求型測試套件連結至測試套件,如必要條件中所述

查詢連結至需求之 Bug 的狀態

注意

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 )

計算已完成的 wor 百分比。

建立數據表報表

  1. 從 [模型] 索引標籤中,選擇 [管理關聯性],然後依數據行連結三個WorkItemId查詢結果。
  2. 在 [視覺效果] 底下,選擇 [數據表]。
  3. 從三個 Power BI 查詢新增您感興趣的數據行。
  4. 針對已通過的測試等附加數據,選取 [加總] 作為匯總。

    Power BI 選取 [加總] 作為匯總

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

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