Запросы в TFS API C#

197
04 января 2020, 01:50

Мне необходимо получить список тест кейсов из запроса в TFS.

TfsTeamProjectCollection tfsTeamProjectCollection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri("server_address"));
ITestManagementService testMangementService = (ITestManagementService)tfsTeamProjectCollection.GetService(typeof(ITestManagementService));
ITestManagementTeamProject testManagementTeamProject = testMangementService.GetTeamProject("project_name");

Далее я получаю список всех запросов

IList<ITestCaseQuery> testCaseQuery = testManagementTeamProject.Queries;

Затем получаю список тест кейсов в запросе

List<ITestCase> testCaseList = testManagement.TestCases.Query(testCaseQuery["selected_query"].QueryText).ToList();

Проблема заключается в том, что если Type of Query - Flat list of work items, то я получаю все тест кейсы в запросе, а если Type of Query - Work items and direct link или Tree of work items, то выдает исключение: "TF248021: You have specifeid a query string that is not valid when you use the query method for a flat list of work items. You cannot specify a parametrized query or a query string for linked work items with the query method you specified." Если тип запроса "Flat list of work items", то строка запроса будет такой: "select [System.Id], ... from WorkItems ...", а если - "Work items and direct link" или "Tree of work items", то такой: "select [System.Id], ... from WorkItemLinks ..." Такое происходит, если я в запрос, помимо тест кейсов, добавляю Product Backlog Item.

Насчет значения поля testCaseQuery["selected_query"].QueryText. Если значение поля:

"select [System.Id], [System.WorkItemType], [System.Title], [System.AssignedTo], [System.State], [System.Tags] from WorkItems where [System.TeamProject]=@project and ([System.WorkItemType]='Test Case' and [System.Title] contains words 'new' or [System.WorkItemType]='Product Backlog Item')" то все работает. А если значение:

"select [System.Id], [System.WorkItemType], [System.Title], [System.AssignedTo], [System.State], [System.Tags] from WorkItemLinks where (Source.[System.TeamProject]=@project and (Source.[System.WorkItemType]='Test Case' or Source.[System.WorkItemType]='Task' or Source.[System.WorkItemType]='Feature')) and ([System.Links.LinkType]='System.LinkTypes.Hierarchy-Forward') and (Target.[System.TeamProject]=@project and Target.[System.WorkItemType]<>") mode (Recursive)"

то выдает исключение.

Answer 1

На самом деле не очень понятно зачем выполняется отбор тест-кейсов через клиент testManagement. Для того, чтобы отбирать айтемы в любом виде, используюется WorkItem Client. При этом результат выполнения флет-листа и результата со ссылками разный. Простой список содержит список айтем, а дерево или ссылки содержит структуру линков в виде Source->Target. Для построения правильного запроса рекомендую в VS сначал создать запрос снеобходимыми условиями, а сохранить его не в тфс, а на локальный диск. Там будет виден правильно сконструированный wiql запрос.

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

  1. Простой список:

    private static void GetTasksWithWIQL(WorkItemStore pWiStore)
    {
        List<WorkItem> _parents = new List<WorkItem>();
        string _wiql = String.Format("SELECT [System.Id] FROM WorkItems WHERE ([System.WorkItemType] = 'Task') ORDER BY [System.Id]");
        Query _query = new Query(pWiStore, _wiql);
        WorkItemCollection _wis = _query.RunQuery();
        for (int i = 0; i < _wis.Count; i++)
            Console.WriteLine("Work item: {0}:{1}:{2}", _wis[i].Type.Name, _wis[i].Id, _wis[i].Title);              
    }
    
  2. Список со ссылками:

    private static void GetParentsWithWIQL(WorkItemStore pWiStore)
    {
        string _wiql = String.Format("SELECT [System.Id] FROM WorkItemLinks WHERE ([Source].[System.WorkItemType] = 'User Story') And ([Target].[System.WorkItemType] = 'Task') And ([System.Links.LinkType] = 'System.LinkTypes.Hierarchy-Forward') ORDER BY [System.Id] mode(Recursive,ReturnMatchingChildren)");
        Query _query = new Query(pWiStore, _wiql);
        WorkItemLinkInfo[] _links = _query.RunLinkQuery();
        for (int i = 0; i < _links.Count(); i++)
            if (_links[i].SourceId == 0) Console.WriteLine("This is top level {1}", _links[i].SourceId, _links[i].TargetId);
            else
                Console.WriteLine("Parent - {0}; Child - {1}", _links[i].SourceId, _links[i].TargetId);
    }
    
  3. Получение теста через рабочий элемент:

    private static void GetTests(WorkItemStore pWiStore, string pTeamProjectName)
    {
        ITestManagementTeamProject _testProject = pWiStore.TeamProjectCollection.GetService<ITestManagementService>().GetTeamProject(pTeamProjectName);
        string _wiql = String.Format("SELECT [System.Id] FROM WorkItems WHERE [System.WorkItemType] = 'Test Case'  And [System.TeamProject] = '{0}' ORDER BY [System.Id]", pTeamProjectName);
        Query _query = new Query(pWiStore, _wiql);
        var _wis = _query.RunQuery();
        for (int i = 0; i < _wis.Count; i++)
            if (_wis[i].Type.Name == "Test Case")
            {
                var _testCaseToEdit = _testProject.TestCases.Find(_wis[i].Id);
                //edit test case here
            }
    }
    
READ ALSO
Маппинг BindingList

Маппинг BindingList

Заполняю datagridview вот так:

260
Как задать стейт для VisualStateManager в дизанйере VisualStudio?

Как задать стейт для VisualStateManager в дизанйере VisualStudio?

У меня есть UserControl для которого в корне определен элемент VisualStateManagerVisualStateGroups с определенными состояниями

326
Занимает ли поле память в структуре, если структура ограничена в длине байт?

Занимает ли поле память в структуре, если структура ограничена в длине байт?

Мне очень важно понять, будет ли размер структуры изменен, если я ее допустим определили ее так:

244
Сохранить значение элемента Switch С# Xamarin

Сохранить значение элемента Switch С# Xamarin

Задача: сохранить значение элемента Switch при следующих открытиях приложения (если Switch включен однажды, то чтобы оставался включенным и после...

240