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

问题描述 投票:0回答:1

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

我正在运行代码以从TFS获取测试用例和测试执行记录。提取工作,我得到所有工作项的列表,包括所有相关信息。

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

有没有办法运行查询而不是获取记录集合,只需获取SQL查询将打印到屏幕的原始输出字符串,我是否直接在数据库上运行它?

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

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

(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);
                }

            }


        }
    }
}
c# sql tfs
1个回答
0
投票

好的,我知道了:

可以通过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);
}

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

实际上可以更容易地分离查询和(以某种方式)稍后将执行与测试对齐,因为(a)查询运行速度非常慢,而且(b)标题不同并且输出变得混乱有标题行用于测试用例和测试执行记录。

© www.soinside.com 2019 - 2024. All rights reserved.