Запросы/скрипты, связанные с рабочими элементами, для создания отчетов в Visual Studio Team Services (VSTS)

Я хотел создать отчет о моем командном проекте VSTS, в котором есть подробные сведения об отношениях связывания рабочих элементов в командном проекте. Пример: EpicsFeaturesUserStories. Поскольку между эпиками и функциями, а также между функциями и пользовательскими историями существуют родительско-дочерние отношения, я хотел создать отчет (.csv или .xls), в котором были бы все сведения об этих рабочих элементах и ​​их взаимосвязях.

Может ли кто-нибудь сообщить мне, что является лучшим и простым способом добиться этого?


person Srini33    schedule 30.10.2016    source источник


Ответы (1)


Я предлагаю вам проверить это через проект с надстройкой TFS (входит в состав VS или Team Explorer).

  1. Создайте запрос (Дерево рабочих элементов) введите здесь описание изображения
  2. Открыть проект
  3. Нажмите «Команда» => «Выбрать проект группы».
  4. Нажмите Получить рабочие элементы=>Выберите этот запрос=>Найти=>Выбрать все=>ОК введите здесь описание изображения

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

Вы можете добиться этого программно, используя TFS API с надстройкой Excel.

  1. Создайте проект надстройки Excel на уровне документа
  2. Установите расширенный пакет клиента Microsoft Team Foundation Server
  3. Запустите запрос, используя Query.RunLinkQuery.
  4. Получите тестовые примеры в наборах тестов требований
  5. Проверьте результаты тестирования этих тестовых случаев
  6. Получить связанный рабочий элемент результата теста
  7. Сохраните данные, чтобы преуспеть в соответствии с вашими требованиями к деталям.

Простой код:

var credentials = new NetworkCredential("[user name]", "[password]");
            TfsTeamProjectCollection tfsCollection = new TfsTeamProjectCollection(new Uri("https://XX.visualstudio.com"));
            ITestManagementService tms = tfsCollection.GetService<ITestManagementService>();
            ITestManagementTeamProject teamProject = tms.GetTeamProject("[team project name]");
            WorkItemStore workitemstore = tfsCollection.GetService<WorkItemStore>();
            QueryHierarchy queryRoot = workitemstore.Projects["[team project name]"].QueryHierarchy;
            QueryFolder queryFolder = queryRoot["Shared Queries"] as QueryFolder;
            QueryDefinition qd = queryFolder["[query name]"] as QueryDefinition;
            Dictionary<string, string> variables = new Dictionary<string, string>();
            variables.Add("project", "[team project name]");
            Query query = new Query(workitemstore, qd.QueryText, variables);

            var results = query.RunLinkQuery();
            foreach(var lr in results)
            {
                //check relationship according to sourceId, TargetId and LinkTypeId (2: child)
                int parentId = lr.SourceId;
                int currentId = lr.TargetId;
            }

            foreach (ITestPlan p in teamProject.TestPlans.Query("Select * From TestPlan"))
            {
                Console.WriteLine("Plan - {0} : {1}", p.Id, p.Name);

                foreach (var suite in p.RootSuite.SubSuites)
                {
                    IRequirementTestSuite requirementSuite = suite as IRequirementTestSuite;
                    if (requirementSuite != null)
                    {
                        var requirementId = requirementSuite.RequirementId;
                        //check requirementId with user story Id
                        foreach(var tc in requirementSuite.TestCases)
                        {
                            var lastResult = teamProject.TestResults.ByTestId(tc.Id).OrderByDescending(tr => tr.DateStarted).FirstOrDefault();
                            if(lastResult.Outcome== Microsoft.TeamFoundation.TestManagement.Client.TestOutcome.Failed)
                            {
                               int[] ids= lastResult.QueryAssociatedWorkItems();
                                foreach(int id in ids)
                                {
                                    var wit = workitemstore.GetWorkItem(id);
                                }

                            }

                        }


                    }
                }
            }
person starian chen-MSFT    schedule 31.10.2016
comment
@starrain..Спасибо за информацию. Можем ли мы добиться того же, используя какие-то инструменты для написания сценариев/программирования? Я предпочитаю некоторые сценарии, так как хочу еще больше расширить запрос, чтобы получить TestSuites (наборы тестов на основе требований, созданные с использованием пользовательских историй), а затем получить TestCases, связанные с этими TestSuites. Пример: UserStory→TestSuite→TestCases. Таким образом, требование к моему окончательному отчету выглядит следующим образом: Epic→Feature→UserStory→TestSuite→TestCases→TestResult→Bug (если результат теста не пройден). Можно ли получить такие данные в один отчет? - person Srini33; 31.10.2016
comment
@ Шрини33 Шрини33 Да, вы можете добиться этого программно, используя API TFS, я обновил свой ответ. - person starian chen-MSFT; 01.11.2016
comment
@starrain..Спасибо за информацию. Если возможно, не могли бы вы предложить мне лучший подход для изучения программирования API TFS, так как я новичок в этом. Кроме того, мне потребуется некоторое время, чтобы понять приведенную выше программу. Я дам вам знать, если мне нужно какое-то разъяснение. - person Srini33; 02.11.2016
comment
@Srini33 В блоге есть много примеров (блоги. microsoft.co.il/shair/tag/tfs-api/page/4). - person starian chen-MSFT; 02.11.2016
comment
@starain.. У меня есть несколько вопросов: (1) Поскольку данные VSTS размещены в облаке, не могли бы вы сообщить мне, как установить пакет расширенного клиента Microsoft TFS. Я перешел по ссылке, которой вы поделились, но не могу найти консоль диспетчера пакетов в своей учетной записи VSTS для запуска команды установки. Так что не могли бы вы предоставить ссылку на это. (2) Также мы также получаем консоль после установки пакета, на которой мы можем писать и выполнять программы (например, ваш код выше). Не могли бы вы пролить свет на то, как именно весь этот поток работает? - person Srini33; 03.11.2016
comment
@Srini33 Во-первых, консоль диспетчера пакетов находится в Visual Studio, а не в VSTS(docs. nuget.org/ndocs/tools/package-manager-console). Во-вторых, после установки этого пакета в ваш проект будет включена ссылка на необходимые сборки. Вы можете выполнить свое требование, используя TFS API (включенный в пакет) во многих приложениях, таких как консольное приложение, приложение формы Windows, надстройка excel и т. д. - person starian chen-MSFT; 03.11.2016
comment
@starrain..Спасибо за ответ и информацию. Мне почему-то немного сложно следить и понимать вещи, связанные с TFS, так как я новичок в этом. Не могли бы вы сообщить мне, можно ли добиться той же реализации, что и выше, подключившись к VSTS с помощью Powershell и вызвав API RESTful? Если это возможно, не могли бы вы предоставить некоторые рекомендации/рекомендации, которым нужно следовать, чтобы добиться этого? - person Srini33; 04.11.2016
comment
@Srini33 Да, это возможно, вы можете вызвать VSTS REST API с помощью функции PowerShell Invoke-RestMethod (статья: blog.devmatter.com/calling-vsts-apis-with-powershell). Вы также можете программно вызывать VSTS REST API с помощью расширенного клиентского пакета TFS через PowerShell (статья: visualstudio.com/en-us/docs/integrate/get-started/, сценарий PowerShell аналогичен коду C#) С другой стороны, создание новых потоков для подробных вопросов/проблем лучше для вас, чтобы решить ваши проблемы/вопросы. - person starian chen-MSFT; 04.11.2016
comment
@starrain..Спасибо за предложение. Я бы попробовал опубликовать новую тему для каждого подробного вопроса в следующий раз. - person Srini33; 04.11.2016
comment
@ Шрини33 Отлично. Если мой ответ поможет вам, вы можете отметить его как ответ. - person starian chen-MSFT; 04.11.2016
comment
@starrain.. Мне не удалось протестировать код, так как я хочу реализовать то же самое с помощью REST API. Но я понял логику приведенного выше кода. Поэтому я отмечаю это как ответ. - person Srini33; 08.11.2016
comment
@ Шрини33 Шрини33 Вы можете открывать новые темы, если у вас есть проблемы/вопросы. Мы поможем вам их решить. - person starian chen-MSFT; 08.11.2016