요구 사항 추적 롤업 샘플 보고서

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

이 보고서는 요구 사항 추적 보고서 보고서를 기반으로 하며 집계된 메트릭을 제공하기 위해 한 수준 롤업을 수행합니다. 예를 들어 사용자 스토리로 요구 사항을 추적하는 경우 이 섹션에 제공된 쿼리를 사용하여 한 수준 롤업(기능까지)할 수 있습니다.

중요

Analytics Service의 OData 피드에 대한 Power BI 통합 및 액세스는 일반적으로 Azure DevOps Services 및 Azure DevOps Server 2020 이상 버전에서 사용할 수 있습니다. 이 문서에 제공된 샘플 쿼리는 Azure DevOps Services 대해서만 유효하며 v3.0-preview 이상 버전에 따라 달라집니다. 이러한 쿼리를 사용하고 피드백을 제공하는 것이 좋습니다.

예제가 다음 이미지에 표시됩니다.

샘플 - 스토리 개요 롤업 보고서

참고

요구 사항 추적은 요구 사항 기반 테스트 제품군을 통해 연결된 테스트 사례에 대해서만 지원됩니다. 요구 사항 작업 항목(사용자 스토리(Agile), 제품 백로그 항목(스크럼), CMMI(요구 사항), 문제(기본) 및 수동 테스트 실행 간의 연결은 테스트 사례가 요구 사항 기반 테스트 제품군을 통해 연결된 경우에만 형성됩니다.

이 보고서는 나열된 각 요구 사항에 대해 다음 정보를 표시합니다.

  • 완료율: 요구 사항에 연결된 모든 작업에 대해 완료된 시간의 롤업에 따라 완료된 작업의 백분율을 보여 주는 진행률 표시줄입니다.
  • 통과된 테스트: 가장 최근의 테스트 실행을 기반으로 통과한 테스트 사례 실행 횟수입니다.
  • 실패한 테스트: 가장 최근의 테스트 실행에 따라 실패한 테스트 사례 실행 횟수입니다.
  • 테스트 실행: 실행된 테스트 실행 수입니다.
  • 활성 버그: 활성 상태의 연결된 버그 수입니다.
  • 닫힌 버그: 닫힘, 완료 또는 완료된 상태의 연결된 버그 수입니다.

보고서의 답변에 대한 질문

보고서 추적 요구 사항은 다음과 같은 유형의 질문에 답변하는 데 유용합니다.

작업 진행률

  • 각 요구 사항에 대해 남아 있는 작업의 양이 예상과 일치하나요?
  • 최상위 요구 사항이 먼저 구현되고 있나요?
  • 각 요구 사항에 대해 정의되는 테스트는 몇 개입니까? 통과하는 테스트는 몇 개입니까?
  • 테스트 사례가 정의되지 않은 구현되는 요구 사항은 무엇인가요?

품질 진행률

  • 각 요구 사항에 대해 실행된 테스트 사례 수와 통과한 사례는 몇 건입니까?
  • 각 요구 사항에는 얼마나 많은 활성 버그가 있나요?
  • 테스트 중인 요구 사항에 대한 버그가 발견되나요?
  • 버그가 해결되고 있나요 아니면 활성 상태로 남아 있나요?

위험 평가

  • 위험에 처한 요구 사항은 무엇인가요?
  • 릴리스에 대해 충분히 안정적이지 않은 요구 사항은 무엇인가요?
  • 오늘 배송할 수 있는 요구 사항은 무엇인가요?

사전 요구 사항

보고서가 유용한 데이터를 생성하려면 다음 작업을 수행해야 합니다.

  • 요구 사항 작업 항목을 정의하고 관심 영역 및 반복 경로에 할당했습니다. 영역 및 반복 경로를 정의하는 방법에 대한 자세한 내용은 영역 경로 정의반복 경로 정의를 참조하세요.
  • 완료 시간의 백분율을 얻으려면 자식 링크 형식의 요구 사항에 연결된 작업 또는 버그의 전체 작업 시간 및 남은 작업 시간 필드를 입력해야 합니다.
  • 테스트 사례의 실행 상태를 가져오기 위해 요구 사항에 해당하는 Test Plans 요구 사항 기반 테스트 모음을 만들었습니다. Kanban 보드를 통해 추가하는 인라인 테스트는 이 필수 구성 요소를 충족합니다. 그러나 테스트에 연결하는 요구 사항은 충족되지 않습니다. 자세한 내용은 테스트 계획 및 테스트 도구 모음 만들기를 참조하세요.
  • 버그의 상태를 가져오기 위해 자식 링크 형식의 요구 사항에 버그를 만들고 연결했습니다.

참고

이 문서에서는 OData 쿼리를 사용하여 샘플 보고서 개요를 읽었으며 Power BI에 대한 기본적인 이해를 가지고 있다고 가정합니다.

샘플 쿼리

쿼리 영역 및 반복 경로

보고서의 범위를 특정 영역 및 반복 경로로 지정하려면 OData Analytics를 사용하여 작업 추적 데이터 쿼리 에 설명된 대로 쿼리하고 관심 있는 AreaSK 및 IterationSK 값을 사용하여 이 문서의 뒷부분에 제공된 섹션에 제공된 다른 쿼리에 제공할 수 있습니다.

요구 사항에 대한 시간 완료율 쿼리

참고

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"

요구 사항의 테스트 실행 상태 쿼리

아래에 나열된 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} - 프로젝트 간 쿼리의 경우 팀 프로젝트 이름 또는 "/{project}"를 완전히 생략합니다.
  • {iterationSK} - 관심 있는 반복 경로의 반복 SK
  • {areaSK} - 관심 있는 영역 경로의 영역 SK입니다.

쿼리 분석

다음 표에서는 쿼리의 각 부분에 대해 설명합니다.

쿼리 파트

설명

Processes/any(p:p/BacklogType eq 'RequirementBacklog')

하나 이상의 프로세스에 대해 '요구 사항' 범주에 속해야 하는 방식으로 작업 항목을 필터링합니다.

Processes/all(p:p/IsBugType eq false)

요구 사항을 가져오는 동안 버그 유형 작업 항목을 생략합니다. 기본 프로세스 템플릿에서 문제 작업 항목은 버그 유형이기도 하므로 Basic 프로세스의 경우 쿼리에서 이 절을 제거합니다.

Power BI 변환

Power BI 쿼리에 적용된 변환은 쿼리 코드 조각에 이미 추가되었습니다.

보고서 만들기

Power BI는 보고할 수 있는 필드를 보여줍니다.

참고

다음 예제에서는 열 이름을 바꾼 사람이 없다고 가정합니다.

보고서를 만들려면 다음 단계를 수행합니다.

  1. 모델링 탭에서 관계 관리 선택하고 WorkItemId 열로 세 개의 쿼리 결과를 연결합니다.
  2. Power BI 시각화 테이블을 만듭니다.
  3. 세 가지 Power BI 쿼리에서 관심 있는 열을 추가합니다.
  4. 통과된 테스트 등과 같은 추가 열에 대한 집계로 합계를 선택합니다.

    Power BI에서 합계를 집계로 선택

여기서 인증 시나리오 는 두 사용자 스토리의 부모 기능입니다.

샘플 - 스토리 개요 롤업 보고서