Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Azure DevOps Services | Azure DevOps Server 2022 | Azure DevOps Server 2020
Отчет об отслеживании требований основан на отчете отслеживания требований и показывает, как агрегировать метрики для одноуровневого свертки. Например, если вы отслеживаете требования с пользовательскими историями, можно агрегировать данные для функций с помощью запросов, указанных в этой статье.
Пример показан на следующем рисунке.
В этом отчете отображаются следующие сведения для каждого перечисленного требования.
- Процент завершенных работ: индикатор хода выполнения, показывающий процент завершенной работы на основе свертки завершенных часов для всех задач, связанных с требованием.
- Пройдены тесты: количество тестовых случаев, успешно пройденных в последнем тестовом запуске.
- Неудачные тесты: количество случаев выполнения тестов, завершающихся сбоем на основе последнего тестового запуска.
- Выполнение тестов: количество выполняемых тестов.
- Активные ошибки: количество связанных ошибок в активном состоянии.
- Закрытые ошибки: количество связанных ошибок в состоянии "Закрыто", "Готово" или "Завершено".
Примечание.
Отслеживание требований поддерживается только для тестовых случаев, связанных с набором тестов на основе требований. Связь между рабочим элементом требования — User Story (Agile), элемент продукта в бэклоге (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
или NavigationPropertyBinding Path
и доступных с EntitySet
. Каждое 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
. Каждое 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 поддерживает Feature, а шаблон 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) )
Разверните дочерние элементы раздела «Функции», отфильтруйте по метке "bug", сгруппируйте возвращенные данные по состоянию и подсчитайте общее количество дочерних элементов.
/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)
При агрегации суммируйте значения точек тестирования на основе последних результатов выполнения Пройдено, Неудачно, Заблокировано, Неприменимо и Нет. Кроме того, суммируйте значения точек тестирования, последние результаты которых не равны 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 )
Вычислите процент завершенной работы.
Создание отчета таблицы
- На вкладке "Моделирование" выберите Управление связями и свяжите три результата запроса по столбцу
WorkItemId
. - В разделе "Визуализации" выберите "Таблица".
- Добавьте нужные столбцы из трех запросов Power BI.
- Выберите Sum в качестве агрегирования для суммируемых столбцов, таких как сданные тесты и т. д.
Здесь сценарии проверки подлинности — это родительская функция двух пользовательских историй.