我需要帮助在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);
}
}
}
}
}
答案 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)标头不同并且输出混乱带有用于测试用例和测试执行记录的标题行。