如何在MVC应用中从TFS 2015获取Selenium测试结果
解决TFS 2015测试结果集中展示的API方案
嘿,我完全懂你现在的痛点——每天要挨个登TFS看测试详情太折腾了!你找的那个测试结果API方向是对的,咱们直接用Test Management REST API就能搞定测试运行和单个用例的详情,下面给你一步步讲怎么集成到你的MVC应用里:
核心API端点(适配TFS 2015)
TFS 2015对应的API版本是1.0(部分预览功能用2.0-preview),你可以通过以下端点获取所需数据:
1. 通过构建ID获取关联的测试运行
每个构建完成后,测试运行会和构建ID绑定,用这个请求就能拿到该构建下所有测试运行的基本信息:
GET http://{你的TFS服务器地址}/{项目集合}/_apis/test/runs?buildId={构建ID}&api-version=1.0
返回结果里会包含测试运行的ID、名称、状态、测试总数/通过数/失败数这些关键字段。
2. 通过测试运行ID获取单个测试用例的详细结果
拿到测试运行ID后,用这个请求就能拉取该运行下所有测试用例的具体结果:
GET http://{你的TFS服务器地址}/{项目集合}/_apis/test/runs/{测试运行ID}/results?api-version=1.0
这里能拿到你最需要的信息:
- 测试用例的名称、ID
- 测试状态(通过/失败/跳过)
- 失败原因、堆栈跟踪(如果失败的话)
- 测试执行的时间、持续时长
MVC应用集成步骤
1. 认证处理
因为是内部应用,推荐两种认证方式:
- NTLM认证:适合域环境,直接用当前用户的域账号权限访问TFS,代码里用
HttpClientHandler启用NTLM:
var handler = new HttpClientHandler { UseDefaultCredentials = true }; var client = new HttpClient(handler);
- 个人访问令牌(PAT):如果是非域环境,在TFS里生成PAT,然后把PAT转成Base64放在请求头里:
var pat = "你的PAT令牌"; var base64Pat = Convert.ToBase64String(Encoding.ASCII.GetBytes($":{pat}")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", base64Pat);
2. 封装API调用服务
写一个专门的服务类(比如TfsTestResultService),封装获取测试运行和测试结果的方法,示例代码大概是这样:
public class TfsTestResultService { private readonly HttpClient _client; private readonly string _tfsBaseUrl; public TfsTestResultService(string tfsBaseUrl) { _tfsBaseUrl = tfsBaseUrl; var handler = new HttpClientHandler { UseDefaultCredentials = true }; _client = new HttpClient(handler); } public async Task<List<TestRun>> GetTestRunsByBuildId(int buildId, string projectCollection) { var url = $"{_tfsBaseUrl}/{projectCollection}/_apis/test/runs?buildId={buildId}&api-version=1.0"; var response = await _client.GetAsync(url); response.EnsureSuccessStatusCode(); var result = await response.Content.ReadFromJsonAsync<TestRunResponse>(); return result.Value; } public async Task<List<TestCaseResult>> GetTestCaseResultsByRunId(int runId, string projectCollection) { var url = $"{_tfsBaseUrl}/{projectCollection}/_apis/test/runs/{runId}/results?api-version=1.0"; var response = await _client.GetAsync(url); response.EnsureSuccessStatusCode(); var result = await response.Content.ReadFromJsonAsync<TestCaseResultResponse>(); return result.Value; } // 这里需要定义对应的模型类TestRun、TestRunResponse、TestCaseResult、TestCaseResultResponse来反序列化JSON }
3. MVC控制器与视图展示
在控制器里调用这个服务,获取所有你关心的构建的测试结果,然后传给视图:
public async Task<IActionResult> Index() { var service = new TfsTestResultService("http://你的TFS服务器地址"); // 假设你有一个构建ID列表,对应不同客户的构建定义 var buildIds = new List<int> { 123, 456, 789 }; var allTestResults = new List<BuildTestResultViewModel>(); foreach (var buildId in buildIds) { var testRuns = await service.GetTestRunsByBuildId(buildId, "你的项目集合名称"); foreach (var run in testRuns) { var testCaseResults = await service.GetTestCaseResultsByRunId(run.Id, "你的项目集合名称"); allTestResults.Add(new BuildTestResultViewModel { BuildId = buildId, BuildName = "对应客户的构建名称", // 你可以从Build WebApi里提前获取构建名称 TestRunName = run.Name, FailedTests = testCaseResults.Where(t => t.Outcome == "Failed").ToList() }); } } return View(allTestResults); }
然后在视图里用Razor语法把数据展示出来,比如表格形式列出每个构建的失败测试用例、失败原因,甚至可以添加跳转链接直接到TFS的测试详情页(如果需要的话)。
额外小贴士
- 可以给API请求加缓存,比如用
IMemoryCache缓存测试结果,因为夜间测试是固定执行的,不用每次请求都去TFS拉取,提升应用响应速度。 - 如果需要测试用例的更多上下文(比如关联的工作项),可以结合Work Item API进一步扩展,但目前你的需求用Test Management API就足够了。
内容的提问来源于stack exchange,提问作者Ak02
相关产品推荐
相关产品推荐

