如何通过测试用例名称/标题而非ID查询并更新TFS测试用例
解决方案
你当前调用的是测试计划查询接口,并非测试用例查询接口,且该接口的name参数为模糊匹配,自然会返回多条结果。测试用例本质是TFS中类型为Test Case的工作项,你可以通过以下方式实现精准查询+更新:
1. C# 端通过 WorkItemTrackingHttpClient 精准查询(推荐)
直接使用WIQL(工作项查询语言)做标题完全匹配,最多只会返回1条符合要求的测试用例:
using Microsoft.TeamFoundation.WorkItemTracking.WebApi; using Microsoft.TeamFoundation.WorkItemTracking.WebApi.Models; using Microsoft.VisualStudio.Services.Common; using Microsoft.VisualStudio.Services.WebApi.Patch; using Microsoft.VisualStudio.Services.WebApi.Patch.Json; // 初始化TFS连接 var credentials = new VssBasicCredential(string.Empty, "你的个人访问令牌(PAT)"); var connection = new VssConnection(new Uri("http://XXXX:8081/tfs/你的集合名称"), credentials); var witClient = connection.GetClient<WorkItemTrackingHttpClient>(); // 构造完全匹配的WIQL查询语句 var query = new Wiql { Query = @"SELECT [System.Id], [System.Title] FROM WorkItems WHERE [System.WorkItemType] = 'Test Case' AND [System.TeamProject] = '你的项目名称' AND [System.Title] = '你要查询的测试用例完整名称'" }; // 执行查询 var queryResult = await witClient.QueryByWiqlAsync(query); if (!queryResult.WorkItems.Any()) { // 无匹配测试用例逻辑 return; } // 拿到唯一匹配的测试用例ID var testCaseId = queryResult.WorkItems.First().Id;
2. 更新测试用例
拿到ID后直接用JsonPatchDocument构造更新内容即可,示例如下:
var patchDoc = new JsonPatchDocument(); // 示例:修改测试用例的标题 patchDoc.Add(new JsonPatchOperation { Operation = Operation.Replace, Path = "/fields/System.Title", Value = "修改后的测试用例名称" }); // 示例:修改测试用例的步骤 patchDoc.Add(new JsonPatchOperation { Operation = Operation.Replace, Path = "/fields/Microsoft.VSTS.TCM.Steps", Value = "<steps><step id=\"1\" type=\"ActionStep\"><parameterizedString isformatted=\"true\">测试步骤1</parameterizedString><parameterizedString isformatted=\"true\">预期结果1</parameterizedString></step></steps>" }); // 执行更新,拿到最新的测试用例对象 var updatedTestCase = await witClient.UpdateWorkItemAsync(patchDoc, testCaseId);
3. 直接调用REST API查询(无需封装客户端场景)
如果你需要自己发HTTP请求实现,用工作项查询接口即可:
- 请求方式:
POST - 接口地址:
http://XXXX:8081/tfs/{集合名}/{项目名}/_apis/wit/wiql?api-version=4.1 - 请求体:
{ "query": "SELECT [System.Id] FROM WorkItems WHERE [System.WorkItemType] = 'Test Case' AND [System.TeamProject] = '你的项目名' AND [System.Title] = 'KuKu'" }
返回结果中workItems数组即为匹配的测试用例,完全匹配场景下只会返回1条。
内容的提问来源于stack exchange,提问作者YigalG
相关产品推荐
相关产品推荐

