요구 사항 추적 샘플 보고서
Azure DevOps Services | Azure DevOps Server 2022 | Azure DevOps Server 2020
요구 사항 추적 보고서를 사용하여 요구 사항 범주에 속하는 작업 항목의 품질을 추적할 수 있습니다. 요구 사항 범주에는 사용자 스토리(Agile), 제품 백로그 항목(스크럼), 문제(기본) 및 CMMI(요구 사항)와 같은 작업 항목이 포함됩니다. 작업 항목 범주에 대한 자세한 내용은 사용자 스토리, 문제, 버그 및 기타 작업 항목 추적을 참조 하세요.
다음 이미지는 요구 사항 추적 보고서의 예를 보여 줍니다.
이 보고서는 나열된 각 요구 사항에 대해 다음 정보를 표시합니다.
- 완료율: 요구 사항에 연결된 모든 작업의 완료 시간 롤업에 따라 완료된 작업의 백분율을 보여 주는 진행률 표시줄입니다.
- 통과된 테스트: 가장 최근의 테스트 실행에 따라 통과된 테스트 사례 실행 횟수입니다.
- 실패한 테스트: 가장 최근의 테스트 실행에 따라 실패한 테스트 사례 실행 횟수입니다.
- 테스트 실행: 실행되는 테스트 실행 수입니다.
- 활성 버그: 활성 상태의 연결된 버그 수입니다.
- 닫힌 버그: 닫힘, 완료 또는 완료된 상태의 연결된 버그 수입니다.
참고 항목
요구 사항 추적은 요구 사항 기반 테스트 제품군을 통해 연결된 테스트 사례에 대해서만 지원됩니다. 요구 사항 작업 항목(사용자 스토리(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 쿼리 코드 조각에는 열을 확장하고 데이터 형식을 변경하기 위한 필수 데이터 변환이 포함됩니다.
참고 항목
필터 또는 보고서 용도로 사용 가능한 속성을 확인하려면 Azure Boards에 대한 메타데이터 참조를 참조 하세요. 에서 사용할 수 있는 값 또는 아래 값을 Property
사용하여 쿼리를 EntityType
필터링하거나 NavigationPropertyBinding Path
속성을 반환할 수 있습니다 EntitySet
. 각각 EntitySet
은 .에 EntityType
해당합니다. 각 값의 데이터 형식에 대한 자세한 내용은 해당 EntityType
값에 대해 제공된 메타데이터를 검토하세요.
쿼리 영역 및 반복 경로
보고서의 범위를 특정 영역 및 반복 경로로 지정하려면 AreaSK 및 IterationSK를 사용하여 쿼리를 필터링할 수 있습니다. 자세한 내용은 OData Analytics를 사용하여 기본 쿼리 정의를 참조 하세요.
요구 사항에 대한 완료 시간 비율 쿼리
참고 항목
다음 쿼리는 Agile 프로세스에서 작업 항목의 필드를 정의하고 Completed Work
필드를 정의하기 때문에 작동합니다Remaining 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"
요구 사항의 테스트 실행 상태 쿼리
참고 항목
필터 또는 보고서 용도로 사용 가능한 속성을 확인하려면 테스트 계획 분석에 대한 메타데이터 참조를 참조 하세요. 에서 사용할 수 있는 값 또는 아래 값을 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(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/...
필수 구성 요소에 설명된 대로 요구 사항 기반 테스트 도구 모음을 통해 작업 항목을 테스트 도구 모음에 연결해야 임을 나타냅니다.
요구 사항에 연결된 버그 상태 쿼리
다음 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](특정 반복 경로에 대한 IterationSK 반환){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)
요구 사항을 가져오는 동안 버그 유형 작업 항목을 생략합니다. 기본 프로세스 템플릿에서 문제 작업 항목은 버그 유형이기도 하므로 Basic 프로세스의 경우 쿼리에서 이 절을 제거합니다.
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 쿼리에서 관심 있는 열을 추가합니다.
- 통과된 테스트 등과 같은 가산 열에 대한 집계로 합계를 선택합니다.
보고서는 다음 이미지와 비슷해야 합니다.