Azure DevOps .NET SDK中GetTestSuitesForPlanAsync方法突遭废弃无法使用
解决Azure Test Management SDK中GetTestSuitesForPlanAsync废弃且新方法无法调用的问题
问题场景
为QA团队开发测试用例收集脚本,目标是筛选Azure项目中测试结果多为N/A的用例。此前基于测试计划ID的版本运行正常,优化脚本结构时突然报错:
CS0612 'TestCompatHttpClientBase.GetTestSuitesForPlanAsync(string, int, int?, int?, int?, bool?, object, CancellationToken)' is obsolete
尝试调用Azure SDK文档中第三个参数为Nullable<SuiteExpand>的同名重载方法,但即使添加using引用、传入对应类型参数也无法调用,怀疑是微软SDK更新导致的兼容问题。
原因分析
- 旧方法属于SDK的兼容层基类
TestCompatHttpClientBase,已被微软标记废弃,不再维护 - 新的正式方法重载属于
TestManagementHttpClient,但如果引用的NuGet包版本过低,会不存在该重载 - 代码中存在异步调用不规范问题(用
.Result阻塞线程,可能导致异常无法被捕获)
解决方案
1. 更新NuGet依赖包
确保以下NuGet包更新至最新稳定版:
Microsoft.TeamFoundationServer.ClientMicrosoft.VisualStudio.Services.Client
2. 替换为非废弃的方法重载
新的GetTestSuitesForPlanAsync重载签名为:
Task<List<TestSuite>> GetTestSuitesForPlanAsync(string project, int planId, SuiteExpand? expand = null, int? top = null, int? skip = null, object userState = null, CancellationToken cancellationToken = default);
3. 修复异步调用的死锁问题
原代码中使用.Result阻塞异步方法,会导致异常无法被catch块捕获,需替换为await。
修改后的完整代码示例
using HtmlAgilityPack; using Microsoft.TeamFoundation.TestManagement.WebApi; using Microsoft.TeamFoundation.WorkItemTracking.WebApi; using Microsoft.TeamFoundation.WorkItemTracking.WebApi.Models; using System.Text.RegularExpressions; using System.Threading; static internal async Task<List<TestCaseResult>> collectTestCaseResultsByPlan(TestManagementHttpClient client, WorkItem plan) { // Azure测试结构:plan > suite > case > results/runs List<TestCaseResult> results = new List<TestCaseResult>(); string projectName = "[REDACTED]"; try { // 替换为非废弃的方法重载,使用默认可选参数 List<TestSuite> suites = await client.GetTestSuitesForPlanAsync(projectName, (int)plan.Id, cancellationToken: CancellationToken.None); foreach (var suite in suites) { List<SuiteTestCase> cases = await client.GetTestCasesAsync(projectName, (int)plan.Id, suite.Id); foreach (var testCase in cases) { var testQuery = new TestResultsQuery { ResultsFilter = new ResultsFilter { TestCaseId = Convert.ToInt32(testCase.Workitem.Id), AutomatedTestName = "test" // 保留原注释 } }; // 替换.Result为await,避免死锁和异常丢失 TestCaseResult caseQuery = await client.GetTestResultsByQueryAsync(testQuery, projectName); results.AddRange(caseQuery.Results); } } } catch (Exception e) { Console.WriteLine($"捕获异常:{e.Message}\n堆栈跟踪:{e.StackTrace}"); } return results; }
额外排查点
如果仍无法调用新方法:
- 检查命名空间:确保
using Microsoft.TeamFoundation.TestManagement.WebApi;已正确引用 - 清理项目缓存:删除bin/obj目录,重新生成项目
- 确认SDK版本:在NuGet包管理器中查看
Microsoft.TeamFoundationServer.Client的版本,需至少是16.170.0及以上版本
内容的提问来源于stack exchange,提问作者mCastillo
相关产品推荐
相关产品推荐

