如何在C#中打印出TFS测试记录的SQL查询结果?

时间:2019-04-21 11:50:26

标签: c# sql tfs

我需要帮助在TFS中打印查询结果。

我正在运行代码以从TFS获取测试用例和测试执行记录。 摘录有效,然后我获得了所有工作项的列表以及所有相关信息。

我想出了如何打印标准TFS字段。但是我找不到如何打印出自定义字段的字段(也就是说,我们将它们添加到TFS测试用例记录中;它们不是现成的)。

是否有一种运行查询的方法,而不是获取记录的集合,仅获取SQL查询将打印到屏幕上的原始输出字符串,是否可以直接在数据库上运行它?

下面是我现在使用的代码。要使其运行,您需要用正确的路径替换“我的数据库的路径”,并将[自定义字段]替换为相关的路径。我正在努力解决的问题是如何打印出自定义字段的值,希望不必弄清楚它在工作项中的位置。

我确实发现我这里有我的自定义字段的值(从“监视”字段复制的路径):

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

但是:我不想为每个自定义字段弄清楚它在什么item []位置;同样,当尝试将以上内容放入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 :(得分:0)

好-知道了:

可通过workitem.Fields结构访问所有字段。

您可以获取字段名称:workitem.Fields [i] .Name 和字段值:workitem.Fields [i] .Value

要知道存在多少个字段:workitem.Fields.Count

如果您知道要查找的字段的名称,则可以通过workitem.Fields [“ FIELD_NAME”]。Value

来获取其值。

当您像在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);
}

对测试执行记录执行类似的操作-因为此工作项类型的字段不同。

实际上,分离查询可能更容易,并且稍后(以某种方式)使执行与测试保持一致,因为(a)查询的运行速度非常慢,并且(b)标头不同并且输出混乱带有用于测试用例和测试执行记录的标题行。