Поделиться через


Пример отчета об отслеживании требований

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

Отчет об отслеживании требований основан на отчете отслеживания требований и показывает, как агрегировать метрики для одноуровневого свертки. Например, если вы отслеживаете требования с пользовательскими историями, можно агрегировать данные для функций с помощью запросов, указанных в этой статье.

Пример показан на следующем рисунке.

Снимок экрана: сводный отчет об обзоре историй Power BI.

В этом отчете отображаются следующие сведения для каждого требования к списку:

  • Процент завершенных работ: индикатор хода выполнения, показывающий процент завершенной работы на основе свертки завершенных часов для всех задач, связанных с требованием.
  • Пройдены тесты: количество тестовых случаев, передаваемых на основе последнего тестового запуска.
  • Неудачные тесты: количество случаев выполнения тестов, завершающихся сбоем на основе последнего тестового запуска.
  • Выполнение тестов: количество выполняемых тестов.
  • Активные ошибки: количество связанных ошибок в активном состоянии.
  • Закрытые ошибки: количество связанных ошибок в состоянии "Закрыто", "Готово" или "Завершено".

Примечание.

Отслеживание требований поддерживается только для тестовых случаев, связанных с набором тестов на основе требований. Связь между рабочим элементом требования — история пользователя (Гибкая), элемент невыполненной работы продукта (Scrum), требование (CMMI) или проблема (базовый) и выполнение теста вручную формируется только в том случае, если тестовый случай связан с помощью набора тестов на основе требований.

Ответы на вопросы отчета

Отчеты отслеживания требований полезны для ответа на следующие типы вопросов.

Ход работы

  • Соответствует ли объем работы, которая остается для каждого требования, соответствует вашим ожиданиям?
  • Сначала реализуются ли перворанговые требования?
  • Сколько тестов определено для каждого требования? Сколько тестов проходит?
  • Какие требования реализуются без тестовых вариантов?

Ход выполнения качества

  • Сколько тестовых случаев выполнялось для каждого требования и сколько прошло?
  • Сколько активных ошибок имеет каждое требование?
  • Обнаружены ли ошибки для тестируемых требований?
  • Устранены ли ошибки или они остаются активными?

Оценка угроз для безопасности

  • Какие требования подвержены риску?
  • Какие требования недостаточно стабильны для выпуска?
  • Какие требования мы можем отправить сегодня?

Внимание

Интеграция Power BI и доступ к веб-каналу OData службы Аналитики общедоступны для Azure DevOps Services и Azure DevOps Server 2020 и более поздних версий. Примеры запросов, указанные в этой статье, допустимы только для Azure DevOps Server 2020 и более поздних версий, и зависят от версии 3.0-preview или более поздней версии. Мы рекомендуем вам использовать эти запросы и предоставлять нам отзывы.

Необходимые компоненты

Примечание.

В этой статье предполагается, что вы читаете обзор примеров отчетов с помощью запросов OData и имеет базовое представление о Power BI.

Чтобы отчет создавал полезные данные, необходимо выполнить следующие задачи:

  • Вы определили рабочие элементы требования и назначили их области и пути итерации. Сведения о том, как определить области и пути итерации, см. в разделе "Определение путей к областям" и "Определение путей итерации".
  • Чтобы получить процент завершения часов, необходимо заполнить поля "Завершенная работа" и "Оставшиеся трудоемкие" задачи или ошибки, связанные с требованиями типа "Дочерний канал".
  • Чтобы получить состояние выполнения тестовых случаев, вы создайте наборы тестов на основе требований в планах тестирования, соответствующих этим требованиям. Встроенные тесты, добавляемые через доску, удовлетворяют этому условию, однако требования, которые вы связываете с тестами, не соответствуют. Дополнительные сведения см. в разделе "Создание планов тестирования" и наборов тестов.
  • Чтобы получить состояние ошибок, вы создадите и связали ошибки с требованиями к типу дочерней ссылки.

Примеры запросов

Чтобы создать отчет, необходимо добавить три запроса Power BI в Power BI Desktop, а затем связать их. Каждый запрос выполняет WorkItems набор сущностей или TestPoints набор сущностей.

Примечание.

Фрагменты запросов Power BI, указанные в следующих разделах, включают необходимые преобразования данных для расширения столбцов и изменения типа данных.

Области запросов и пути итерации

Чтобы ограничить отчет определенным путем области и итерации, можно отфильтровать запрос с помощью AreaSK и IterationSK. Дополнительные сведения см. в разделе "Определение базовых запросов" с помощью OData Analytics.

Примечание.

Сведения о доступных свойствах для фильтрации или отчета см . в справочнике по метаданным для Azure Boards. Вы можете отфильтровать запросы или возвращать свойства с помощью любого из Property значенийEntityType, доступных в разделе EntitySetили NavigationPropertyBinding Path значениях. Каждое EntitySet соответствует .EntityType Дополнительные сведения о типе данных каждого значения см. в метаданных, предоставленных для соответствующего EntityTypeзначения.

Запрос на процент завершения часов для требований

Примечание.

Измените его WorkItemType на основе используемого процесса. Шаблон Scrum поддерживает функцию , а шаблон Basic поддерживает 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, доступных в разделе EntitySetили NavigationPropertyBinding Path значениях. Каждое 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 на основе используемого процесса. Шаблон Scrum поддерживает функцию , а шаблон Basic поддерживает 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](Return the IterationSK for a specific Iteration Path)
  • {areaSK} — GUID, связанный с интересующим путь области. Сведения о поиске GUID см. в разделе [.. /extend-analytics/wit-analytics.md#areak](Возвращается AreaSK для определенного пути области).

Разбивка запросов

В следующей таблице описана каждая часть запроса.

Часть запроса

Description


$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.

Создание отчета таблицы

  1. На вкладке "Моделирование" выберите Управление связями и свяжите три результата запроса по столбцуWorkItemId.
  2. В разделе "Визуализации" выберите "Таблица".
  3. Добавьте нужные столбцы из трех запросов Power BI.
  4. Выберите Sum в качестве агрегирования для аддитивных столбцов, таких как переданные тесты и т. д.

    Power BI выберите Sum в качестве агрегирования

Здесь сценарии проверки подлинности — это родительская функция двух пользовательских историй.

Снимок экрана: отчет об обзоре примеров историй Power BI.