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

如何在所有NUnit测试执行完成后调用Xray API上传测试结果

解决NUnit测试完成后一次性上传Xray测试结果的问题

在NUnit中,[TearDown]特性标注的方法会在每个测试方法执行后运行,不符合你“所有测试完成后仅执行一次上传”的需求。你需要使用[TestFixtureTearDown]特性来实现这一逻辑——它会在当前测试类(TestFixture)的所有测试方法全部执行完毕后,仅运行一次。

修改后的代码示例

[TestFixture]
public class ProjectEmailAgentUnitTests
{
    private ProjectEmailAgent _emailAgent;

    [SetUp]
    public void Setup()
    {
        _emailAgent = new ProjectEmailAgent();
    }

    [Test, Property("Requirement", "IUV-23")]
    [TestCase(" ", false)]
    [TestCase("mcp a", false)]
    [TestCase("mc pa", false)]
    [TestCase("mcpa", true)]
    public void isKeyWordExisting(string subject, Boolean expected)
    {
        Assert.That(_emailAgent.isKeyWordExisting(subject), Is.EqualTo(expected));
    }

    // 替换[TearDown]为[TestFixtureTearDown],确保所有测试完成后仅执行一次
    [TestFixtureTearDown]
    public async Task FixtureTearDown()
    {
        var fileName = "filename.xml";
        var fileName2 = "xray.json";
        var url = "https://xray.cloud.getxray.app/api/v1/import/execution/nunit/multipart";
        
        using (var formContent = new MultipartFormDataContent("NKdKd9Yk"))
        {
            formContent.Headers.ContentType.MediaType = "multipart/form-data";
            
            // 读取测试结果XML文件(确保路径指向所有测试完成后生成的文件)
            var xmlFilePath = Path.Combine("C:/test/Projects/ProjectEmailAgentTest/bin/Debug/net6.0/TestResults/", fileName);
            using var fileStream = System.IO.File.OpenRead(xmlFilePath);
            formContent.Add(new StreamContent(fileStream), fileName, fileName);
            
            // 读取Xray配置JSON文件
            var jsonFilePath = Path.Combine("C:/test/Projects/ProjectEmailAgentTest/", fileName2);
            using var fileStream2 = System.IO.File.OpenRead(jsonFilePath);
            formContent.Add(new StreamContent(fileStream2), fileName2, fileName2);

            using (var client = new HttpClient())
            {
                // 添加Bearer Token认证
                client.DefaultRequestHeaders.Add("Authorization", "Bearer " + "你的实际Token");
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("multipart/form-data"));

                try
                {
                    var response = await client.PostAsync(url, formContent);
                    // 可根据需要处理响应,比如检查是否成功
                    response.EnsureSuccessStatusCode();
                    Console.WriteLine("测试结果上传成功:" + response.StatusCode);
                }
                catch (Exception ex)
                {
                    // 保留原始异常堆栈信息,不要直接throw ex
                    Console.WriteLine("上传失败:" + ex.Message);
                    throw;
                }
            }
        }
    }
}

关键说明

  • [TestFixtureTearDown]特性:这是实现“所有测试完成后仅执行一次”的核心,作用域覆盖整个测试类,而非单个测试方法。
  • 文件路径优化:使用Path.Combine拼接路径,避免手动拼接字符串可能出现的路径分隔符错误。
  • 异常处理改进:移除throw ex(会丢失原始异常堆栈),改用throw保留完整异常信息;添加response.EnsureSuccessStatusCode(),当HTTP请求返回错误状态码时自动抛出异常。
  • 资源释放:所有流对象添加using声明,确保资源被正确释放。

内容的提问来源于stack exchange,提问作者Alexander Brandhaug

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 03:05:41