如何在C#中从Visual Studio向Azure测试套件添加带步骤的测试用例及排错
解决Azure DevOps REST API创建测试用例的HTTP 400错误
错误核心原因
你遇到的HTTP 400错误,本质是Azure DevOps工作项API要求请求体必须是JSON Patch格式的数组,但你的代码只传递了单个JSON对象,不符合API的格式规范。另外代码还存在两个问题:未处理测试步骤的写入逻辑,以及返回值类型不匹配。
修复后的完整代码
using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Net.Http; using System.Text; using System.Threading.Tasks; public static async Task<HttpResponseMessage> CreateTestCase(HttpClient client, string azureDevOpsOrganizationUrl, string project, string apiVersion, string testName, List<string> testSteps) { string url = $"{azureDevOpsOrganizationUrl}/{project}/_apis/wit/workitems/$Test%20Case?api-version={apiVersion}"; // 构建JSON Patch操作数组(API要求必须是数组格式) var patchOperations = new List<object> { // 添加测试用例标题 new { op = "add", path = "/fields/System.Title", value = testName } }; // 处理测试步骤:转换为Azure DevOps要求的XML格式 if (testSteps != null && testSteps.Count > 0) { var stepsXmlBuilder = new StringBuilder(); stepsXmlBuilder.Append("<steps id=\"0\" last=\""); stepsXmlBuilder.Append(testSteps.Count); stepsXmlBuilder.Append("\">"); for (int i = 0; i < testSteps.Count; i++) { stepsXmlBuilder.Append($"<step id=\"{i + 1}\">"); stepsXmlBuilder.Append("<parameterizedString isformatted=\"true\">"); // 转义XML特殊字符,避免格式错误 stepsXmlBuilder.Append(testSteps[i].Replace("<", "<").Replace(">", ">")); stepsXmlBuilder.Append("</parameterizedString>"); stepsXmlBuilder.Append("<parameterizedString isformatted=\"true\"></parameterizedString>"); stepsXmlBuilder.Append("<description/>"); stepsXmlBuilder.Append("</step>"); } stepsXmlBuilder.Append("</steps>"); // 将测试步骤添加到Patch操作列表 patchOperations.Add(new { op = "add", path = "/fields/Microsoft.VSTS.TCM.Steps", value = stepsXmlBuilder.ToString() }); } // 序列化数组为JSON,指定正确的媒体类型 var jsonContent = new StringContent(JsonConvert.SerializeObject(patchOperations), Encoding.UTF8, "application/json-patch+json"); var response = await client.PostAsync(new Uri(url), jsonContent); return response; }
关键修复点
- 请求体改为数组结构:JSON Patch规范要求以数组形式传递操作(哪怕只有一个操作),这是解决400错误的核心。
- 测试步骤的XML格式转换:Azure DevOps的
Microsoft.VSTS.TCM.Steps字段必须使用特定XML结构存储,不能直接传入字符串列表,需要手动构建符合要求的XML内容。 - 返回值类型修正:原方法声明返回
string但实际返回HttpResponseMessage,这里统一返回HttpResponseMessage,方便后续处理响应状态或内容。
使用注意事项
调用方法前,确保HttpClient已配置Azure DevOps身份验证(比如使用个人访问令牌PAT):
var client = new HttpClient(); // 替换为你的PAT string pat = "your-personal-access-token"; client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes($":{pat}"))); // 示例调用 var response = await CreateTestCase( client, "https://dev.azure.com/your-organization", "your-project-name", "7.1-preview.3", "新功能登录测试", new List<string> { "步骤1:打开登录页面", "步骤2:输入账号密码", "步骤3:点击登录按钮" } ); // 验证请求是否成功 response.EnsureSuccessStatusCode(); var result = await response.Content.ReadAsStringAsync();
内容的提问来源于stack exchange,提问作者vasut alexandru
相关产品推荐
相关产品推荐

