요구 사항 추적 롤업 샘플 보고서
Azure DevOps Services | Azure DevOps Server 2022 | Azure DevOps Server 2020
요구 사항 추적 롤업 보고서는 요구 사항 추적 보고서를 기반으로 하며 한 수준 롤업에 대한 메트릭을 집계하는 방법을 보여 줍니다. 예를 들어 사용자 스토리로 요구 사항을 추적하는 경우 이 문서에 제공된 쿼리를 사용하여 기능에 대한 데이터를 집계할 수 있습니다.
예제가 다음 이미지에 표시됩니다.
이 보고서는 나열된 각 요구 사항에 대해 다음 정보를 표시합니다.
- 완료율: 요구 사항에 연결된 모든 작업의 완료 시간 롤업에 따라 완료된 작업의 백분율을 보여 주는 진행률 표시줄입니다.
- 통과된 테스트: 가장 최근의 테스트 실행에 따라 통과된 테스트 사례 실행 횟수입니다.
- 실패한 테스트: 가장 최근의 테스트 실행에 따라 실패한 테스트 사례 실행 횟수입니다.
- 테스트 실행: 실행되는 테스트 실행 수입니다.
- 활성 버그: 활성 상태의 연결된 버그 수입니다.
- 닫힌 버그: 닫힘, 완료 또는 완료된 상태의 연결된 버그 수입니다.
참고 항목
요구 사항 추적은 요구 사항 기반 테스트 제품군을 통해 연결된 테스트 사례에 대해서만 지원됩니다. 요구 사항 작업 항목(사용자 스토리(Agile), 제품 백로그 항목(스크럼), CMMI(요구 사항) 또는 문제(기본))와 수동 테스트 실행 간의 연결은 테스트 사례가 요구 사항 기반 테스트 제품군을 통해 연결된 경우에만 형성됩니다.
보고서의 답변에 대한 질문
보고서 추적 요구 사항은 다음과 같은 유형의 질문에 답변하는 데 유용합니다.
작업 진행률
- 각 요구 사항에 대해 남아 있는 작업량이 기대에 부합하나요?
- 최상위 요구 사항이 먼저 구현되나요?
- 각 요구 사항에 대해 정의되는 테스트는 몇 개입니까? 얼마나 많은 테스트를 통과하고 있나요?
- 테스트 사례가 정의되지 않은 어떤 요구 사항이 구현되고 있나요?
품질 진행률
- 각 요구 사항에 대해 실행된 테스트 사례 수와 통과한 사례는 몇 개입니까?
- 각 요구 사항에는 얼마나 많은 활성 버그가 있나요?
- 테스트 중인 요구 사항에 대한 버그가 발견되나요?
- 버그가 해결되고 있나요 아니면 활성 상태로 남아 있나요?
위험 평가
- 위험에 처한 요구 사항은 무엇인가요?
- 릴리스에 대해 충분히 안정적이지 않은 요구 사항은 무엇입니까?
- 오늘 배송할 수 있는 요구 사항은 무엇입니까?
Important
Analytics Service의 OData 피드에 대한 Power BI 통합 및 액세스는 일반적으로 Azure DevOps Services 및 Azure DevOps Server 2020 이상 버전에서 사용할 수 있습니다. 이 문서에서 제공하는 샘플 쿼리는 Azure DevOps Server 2020 이상 버전에 대해서만 유효하며 v3.0 미리 보기 이상 버전에 따라 달라집니다. 이러한 쿼리를 사용하고 피드백을 제공하는 것이 좋습니다.
필수 조건
- 액세스: 최소한 기본 액세스 권한이 있는 프로젝트의 멤버여야 합니다.
- 사용 권한: 기본적으로 프로젝트 멤버는 분석을 쿼리하고 뷰를 만들 수 있는 권한이 있습니다.
- 서비스 및 기능 사용 및 일반 데이터 추적 활동과 관련된 기타 필수 구성 요소에 대한 자세한 내용은 Analytics에 액세스하기 위한 사용 권한 및 필수 구성 요소를 참조 하세요.
참고 항목
이 문서에서는 OData 쿼리를 사용하여 샘플 보고서 개요를 읽고 Power BI에 대한 기본적인 이해를 가지고 있다고 가정합니다 .
보고서가 유용한 데이터를 생성하려면 다음 작업을 수행해야 합니다.
- 요구 사항 작업 항목을 정의하고 관심 영역 및 반복 경로에 할당했습니다. 영역 및 반복 경로를 정의하는 방법에 대한 자세한 내용은 영역 경로 정의 및 반복 경로 정의를 참조하세요.
- 완료 시간 백분율을 얻으려면 자식 링크 형식의 요구 사항에 연결된 작업 또는 버그의 완료 작업 시간 및 남은 작업 시간 필드를 입력해야 합니다.
- 테스트 사례의 실행 상태를 얻으려면 해당 요구 사항에 해당하는 테스트 계획에서 요구 사항 기반 테스트 도구 모음을 만들었습니다. 보드를 통해 추가하는 인라인 테스트는 이 필수 조건을 충족합니다. 그러나 테스트에 연결하는 요구 사항은 충족되지 않습니다. 자세한 내용은 테스트 계획 및 테스트 도구 모음 만들기를 참조 하세요.
- 버그의 상태를 얻으려면 자식 링크 유형을 사용하여 버그를 만들고 요구 사항에 연결합니다.
샘플 쿼리
보고서를 생성하려면 Power BI 데스크톱에 세 개의 Power BI 쿼리를 추가한 다음 연결해야 합니다. 각 쿼리는 엔터티 집합 또는 TestPoints
엔터티 집합을 WorkItems
실행합니다.
참고 항목
다음 섹션에서 제공하는 Power BI 쿼리 코드 조각에는 열을 확장하고 데이터 형식을 변경하기 위한 필수 데이터 변환이 포함됩니다.
쿼리 영역 및 반복 경로
보고서의 범위를 특정 영역 및 반복 경로로 지정하려면 다음을 사용하여 AreaSK
IterationSK
쿼리를 필터링할 수 있습니다. 자세한 내용은 OData Analytics를 사용하여 기본 쿼리 정의를 참조 하세요.
참고 항목
필터 또는 보고서 용도로 사용 가능한 속성을 확인하려면 Azure Boards에 대한 메타데이터 참조를 참조 하세요. 에서 사용할 수 있는 값 또는 아래 값을 Property
사용하여 쿼리를 EntityType
필터링하거나 NavigationPropertyBinding Path
속성을 반환할 수 있습니다 EntitySet
. 각각 EntitySet
은 .에 EntityType
해당합니다. 각 값의 데이터 형식에 대한 자세한 내용은 해당 EntityType
값에 대해 제공된 메타데이터를 검토하세요.
요구 사항에 대한 완료 시간 비율 쿼리
참고 항목
WorkItemType
사용 중인 프로세스에 따라 변경합니다. 스크럼 템플릿은 기능을 지원하며 기본 템플릿은 각각 롤업 작업 항목 유형으로 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"
요구 사항의 테스트 실행 상태 쿼리
참고 항목
필터 또는 보고서 용도로 사용 가능한 속성을 확인하려면 테스트 계획 분석에 대한 메타데이터 참조를 참조 하세요. 에서 사용할 수 있는 값 또는 아래 값을 Property
사용하여 쿼리를 EntityType
필터링하거나 NavigationPropertyBinding Path
속성을 반환할 수 있습니다 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
사용 중인 프로세스에 따라 변경합니다. 스크럼 템플릿은 기능을 지원하며 기본 템플릿은 각각 롤업 작업 항목 유형으로 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](특정 반복 경로에 대한 IterationSK 반환){areaSK}
- 관심 영역 경로와 연결된 GUID입니다. GUID를 조회하려면 [.를 참조하세요. /extend-analytics/wit-analytics.md#areask](특정 영역 경로에 대한 AreaSK 반환).
쿼리 분석
다음 표에서는 쿼리의 각 부분을 설명합니다.
쿼리 파트
설명
$filter=( IterationSK eq {iterationSK} and AreaSK eq {areaSK}
and 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) )
기능의 자식 항목을 확장하고 버그를 필터링하고 반환 데이터를 상태별로 그룹화하고 자식 항목의 총 개수를 표시합니다.
/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)
집계하는 동안 통과됨, 실패, 차단됨, NotApplicable 및 None의 최신 실행 결과에 따라 테스트 지점의 값을 합산합니다. 또한 최신 결과가 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의 백분율을 계산합니다.
테이블 보고서 만들기
- 모델링 탭에서 관계 관리 선택하고 세 개의 쿼리 결과를 열별로
WorkItemId
연결합니다. - 시각화에서 테이블을 선택합니다.
- 세 가지 Power BI 쿼리에서 관심 있는 열을 추가합니다.
- 통과된 테스트 등과 같은 가산 열에 대한 집계로 합계를 선택합니다.
여기서 인증 시나리오는 두 사용자 스토리의 부모 기능입니다.