如何在所有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
相关产品推荐
相关产品推荐

