You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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("<", "&lt;").Replace(">", "&gt;"));
            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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 18:51:13