需求追蹤範例報告
Azure DevOps Services |Azure DevOps Server 2022 |Azure DevOps Server 2020
您可以使用需求追蹤報告來追蹤屬於 [需求] 類別的工作項目品質。 需求類別包括工作專案,例如使用者劇本(敏捷式)、產品待辦專案(Scrum)、問題(基本)和需求(CMMI)。 如需工作項目類別的詳細資訊,請參閱 追蹤使用者劇本、問題、Bug 和其他工作專案。
下圖顯示需求追蹤報表的範例。
此報表會針對列出的每個需求顯示下列資訊:
- 已完成工時百分比:進度列,根據與需求連結之所有工作的完成時數匯總,顯示已完成工時的百分比。
- 通過的測試:根據最新的測試回合所通過的測試案例數目。
- 失敗的測試:根據最近的測試回合執行失敗的測試案例數目。
- 執行測試:執行的測試回合數目。
- 作用中 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查詢代碼段包含擴充數據行和變更數據類型的必要資料轉換。
注意
若要判斷篩選或報表用途的可用屬性,請參閱 Azure Boards 的元數據參考。 您可以使用的 或 NavigationPropertyBinding Path
值EntitySet
底下EntityType
的任何Property
值來篩選查詢或傳回屬性。 每個 EntitySet
對應至 EntityType
。 如需每個值之數據類型的詳細資訊,請檢閱針對對應 EntityType
提供的元數據。
查詢區域和反覆項目路徑
若要將報表的範圍設定為特定的區域和反覆項目路徑,您可以使用AreaSK和IterationSK來篩選查詢。 如需詳細資訊,請參閱 使用 OData Analytics 定義基本查詢。
查詢需求完成的時數百分比
注意
下列查詢適用於 Agile 程式,因為它會定義工作專案中的 Remaining Work
和 Completed 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"
查詢需求的測試執行狀態
注意
若要判斷篩選或報表用途的可用屬性,請參閱 Test Plans Analytics 的元數據參考。 您可以使用的 或 NavigationPropertyBinding Path
值EntitySet
底下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(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"
注意
專案TestSuite/RequirementWorkItem/...
表示工作項目必須透過需求型測試套件連結至測試套件,如必要條件中所述。
查詢連結至需求之 Bug 的狀態
將下列 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」 ,請將 取代 {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}
)`
只傳回選取之反覆專案、區域和待辦項目的數據。
Processes/any(p:p/BacklogType eq 'RequirementBacklog')
以這類方式篩選工作專案,使其應該落在 [需求] 類別中,以取得至少一個與其相關聯的程式。
Processes/all(p:p/IsBugType eq false)
在取得需求時省略 Bug 類型工作專案。 在基本程式範本中,問題工作專案也是 Bug 類型,因此針對基本程式,請從查詢中移除這個子句。
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
在匯總時,類型轉換測試點具有最新的執行結果 「傳遞」到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 )
計算已完成的 wor 百分比。
建立數據表報表
若要建立報表,請執行下列步驟:
- 從 [模型] 索引標籤中,選擇 [管理關聯性],然後依數據行連結三個
WorkItemId
查詢結果。 - 在 [視覺效果] 底下,選擇 [數據表]。
- 從三個 Power BI 查詢新增您感興趣的數據行。
- 針對已通過的測試等附加數據行,選取 [加總] 作為匯總。
您的報表看起來應該類似下圖。