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


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

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

Вы можете отслеживать качество рабочих элементов, относящихся к категории "Требования" с отчетом по отслеживанию требований. Категория "Требования" включает рабочие элементы, такие как пользовательские истории (Agile), элементы невыполненной работы продукта (scrum), проблемы (базовый) и требования (CMMI). Дополнительные сведения о категориях рабочих элементов см. в разделе "Отслеживание историй пользователей", проблем, ошибок и других рабочих элементов.

На следующем рисунке показан пример отчета по отслеживанию требований.

Снимок экрана: отчет об отслеживании требований 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, указанные в следующих разделах, включают необходимые преобразования данных для расширения столбцов и изменения типа данных.

Примечание.

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

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

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

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

Примечание.

Следующий запрос работает для процесса Agile, так как он определяет Remaining Work и Completed 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, доступных в разделе 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(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](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} )`

Возвращает данные только для выбранных рабочих элементов итерации, области и невыполненной работы.

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

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

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

При получении требований опустите рабочие элементы типа ошибки. В шаблоне "Базовый процесс" рабочие элементы проблемы также относятся к типу ошибок, поэтому для базового процесса удалите это предложение из запроса.

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.

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

Чтобы создать отчет, выполните следующие действия.

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

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

Отчет должен выглядеть примерно так, как показано на следующем рисунке.

Снимок экрана: отчет об отслеживании требований Power BI