使用Azure DevOps扩展API删除测试用例时遇权限及请求错误
问题
我开发了一款可批量删除Test runs和测试用例的Azure DevOps扩展,目前遇到以下异常情况:
- 在独立Hub页面中,Test runs的删除功能正常工作
- 但通过配置目标为
ms.vss-work-web.query-result-work-item-menu的ms.vss-web.action执行测试用例删除时,出现三类错误:- 调用
https://devops.url/azure/defaultcollection/projectid/_api/test/testcases/123456返回net::Err_Failed 401 - 网络异常提示:
TF400893: 无法连接服务器,请检查网络 - fetch请求抛出未处理的
Type error: fail to fetch
- 调用
已确认的前置条件:
- 扩展已配置
[vs.test, vso.test_write]权限 - TestRun的读写删除操作测试均正常
- 自身拥有DevOps服务器的相关权限
测试用例删除的代码实现如下:
async function DeleteTestCaseById(projectId: string, testCaseId: number): Promise<boolean> { try { const result = await getClient(TestRestClient).deleteTestCase(projectId, testCaseId); console.log(`Deleted successfully, Testcase : ${testCaseId}`); return true; } catch (e) { console.log(`Error in deleting, Testcase: ${testCaseId} : ${e.message}`); console.log(e); return false; } }
查阅REST API文档发现安全部分要求PAT作为访问令牌,疑惑是否需要通过extension.json传入PAT?
解决方案
无需手动传入PAT:Azure DevOps扩展运行时会自动获取当前用户的上下文令牌,不需要在extension.json中配置PAT。问题核心是不同场景下上下文令牌的权限范围存在差异。
场景权限差异分析:
- 独立Hub页面属于扩展自身上下文,令牌能完整获取
vso.test_write权限对应的访问范围 - 而在
query-result-work-item-menu(工作项查询结果菜单)上下文里,扩展令牌的默认权限范围可能被限制,无法访问测试用例删除API
- 独立Hub页面属于扩展自身上下文,令牌能完整获取
具体修复步骤:
- 检查extension.json的权限声明,确保
vso.test_write权限的作用域设置正确,需为对应的action配置添加scopes: ["vso.work", "vso.test"],明确覆盖工作项上下文的权限范围 - 调用API时,确保
TestRestClient基于当前菜单上下文初始化,使用getClient(TestRestClient, context)的方式传入当前场景的上下文对象,保证令牌与场景正确关联 TF400893通常是权限不足导致的伪装错误,优先解决401权限问题后,网络异常会自动消失
- 检查extension.json的权限声明,确保
额外验证点:
- 确认当前用户在DevOps项目中拥有测试用例的删除权限(区别于扩展配置的权限)
- 在菜单action的代码中,可打印当前上下文的权限标识(注意不要泄露敏感信息),验证是否包含
test_write权限
内容的提问来源于stack exchange,提问作者A.P.S
相关产品推荐
相关产品推荐

