Как распечатать результаты SQL-запросов из записей теста TFS в C #? - PullRequest
0 голосов
/ 21 апреля 2019

Мне нужна помощь в распечатке результатов запроса в TFS.

Я выполняю код для получения тестового примера и записей выполнения теста из TFS. Извлечение работает, и я получаю список всех рабочих элементов со всей связанной информацией.

Я понял, как распечатать стандартные поля TFS. Но я не могу найти, как распечатать поля, которые являются настраиваемыми полями (то есть мы добавили их в запись теста TFS; их нет в готовом виде).

Есть ли способ выполнить запрос и вместо получения набора записей просто получить необработанные выходные строки, которые SQL-запрос выведет на экран, если бы я запустил его непосредственно в БД?

Ниже приведен код, который я использую сейчас. Чтобы запустить его, вам нужно заменить «путь к моей БД» на правильный путь, а [пользовательское поле] - на соответствующий. Проблема, с которой я сталкиваюсь, заключается в том, как распечатать значение моего настраиваемого поля, надеюсь, не выясняя, где в рабочем элементе оно находится.

Я обнаружил, что у меня есть значение для моего настраиваемого поля (путь скопирован из поля «watch»):

(new System.Collections.Generic.Mscorlib_DictionaryDebugView<int, object>(workitem.FieldData.m_latestData).Items[78]).Value

Но: я не хочу выяснять, для каждого настраиваемого поля, в каком расположении элементов [] оно находится; также при попытке поместить вышеупомянутое в оператор Console.Writeline (или назначить его сначала переменной), оно не компилируется.

using System;
using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.WorkItemTracking.Client;


namespace tfs_api_starter
{
    class Program
    {

        static void Main()
        {
            // connect to a tfs collection
            var collectionUri = new Uri("https://path to my DB");
            var tfsCollection = new TfsTeamProjectCollection(collectionUri);

            // workitemStore object is used to query and update workitems
            var workitemStore = tfsCollection.GetService<WorkItemStore>();

            // query workitems
            var queryText = "SELECT [System.Id], [System.WorkItemType], [System.Title], [System.State], [System.CreatedBy], [System.AreaPath], [System.IterationPath],  [My Custom field]  FROM WorkItemLinks WHERE Source.[System.WorkItemType] = 'Test Case' and (Target.[System.WorkItemType] = 'Test Execution' and Target.[System.CreatedDate] >= '2019-04-01T00:00:00.0000000') ";
            var workitemCollection = new Query(workitemStore, queryText).RunLinkQuery();

            foreach (var link in workitemCollection)
            {
                var workitem = workitemStore.GetWorkItem(link.TargetId);
                if (workitem.Type.Name == "Test Case")
                {
                    Console.WriteLine("{0}|{1}|{2}",
                        workitem.Id,
                        workitem.Title,
                        <my custom field value>);
                }
                if (workitem.Type.Name == "Test Execution")
                {
                    Console.WriteLine("{0}|{1}|{2}", workitem.Id, workitem.Type.Name, workitem.State);
                }

            }


        }
    }
}

1 Ответ

0 голосов
/ 23 апреля 2019

ОК - понял:

Все поля доступны через структуру workitem.Fields.

Вы можете получить имя поля: workitem.Fields [i] .Name и значение поля: workitem.Fields [i] .Value

Чтобы узнать, сколько существует полей: workitem.Fields.Count

Если вам известно имя искомого поля, вы можете получить его значение с помощью workitem.Fields ["FIELD_NAME"]. Значение

Когда вы запускаете запрос, как я сделал в uestio, вы получаете все поля - независимо от того, что запрашивается текст SQL-запроса.

Печать заголовка для всех имен полей теперь проста (примечание: я использую «|» в качестве разделителя полей, поскольку TFS записывает имена пользователей с запятой между фамилией и именем):

Где-то в начале, определите флаг:

 bool first=true;

Затем, после "if (workitem.Type.Name ==" Test Case ")"

есть это:

 if (first) {
   // write the header with field names
    for (int i = 0; i < workitem.Fields.Count; i++) {
         Console.Write("{0}|", workitem.Fields[i].Name);
         Console.Write("\n");
         first = false;
        }
  }

А затем выведите значения:

for (int i = 0; i < workitem.Fields.Count; i++)
{
    Console.Write("{0}|", workitem.Fields[i].Value);
}

И сделать что-то похожее для записей выполнения теста - поскольку поля для этого типа рабочего элемента различны.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...