【问题标题】:Posting testresults to an API after all the testcases has run在所有测试用例运行后将测试结果发布到 API
【发布时间】:2022-11-30 04:48:03
【问题描述】:

我正在尝试使用 Xray 的 API 来发布我的单元测试的结果。 我希望在我的所有测试运行完毕后运行发布结果的方法(然后我有一个包含我要发布的结果的 xml 文件)。

但我不确定我是否了解其机制是如何工作的——看起来每次测试后都会执行拆解。

我想要达到的目标:

  1. 创建一个将在所有测试完成后执行一次的方法,该方法应将生成的带有测试结果的 xml 文件发布到外部 API。

    [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]
         public async Task TestTearDown(){
         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";
             // 3. Add the filename C:\\... + fileName is the path your file
             Stream fileStream = System.IO.File.OpenRead("C:/test/Projects/ProjectEmailAgentTest/bin/Debug/net6.0/TestResults/" + fileName);
             formContent.Add(new StreamContent(fileStream), fileName, fileName);
             Stream fileStream2 = System.IO.File.OpenRead("C:/test/Projects/ProjectEmailAgentTest/" + fileName2);
             formContent.Add(new StreamContent(fileStream2), fileName2, fileName2);
    
    
             using (var client = new HttpClient())
             {
                 // Bearer Token header if needed
                 client.DefaultRequestHeaders.Add("Authorization", "Bearer " + "token");
                 client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("multipart/form-data"));
    
                 try
                 {
                     // 4.. Execute the MultipartPostMethod
                     var message = await client.PostAsync(url, formContent);
                     // 5.a Receive the response
                     Console.WriteLine(message);
                 }
                 catch (Exception ex)
                 {
                     // Do what you want if it fails.
                     throw ex;
                 }
     }    
    

【问题讨论】:

  • 运行 NUnit 测试的方法有很多种,例如 nunit3-console.exe、Visual Studio 测试资源管理器等。请说明您是如何运行测试的,以便能够给出答案。
  • @Charlie 抱歉没有提及。目前我只是在 Visual Studio Code 中运行它们(在上下文中运行测试)。
  • 如果我使用 [order(n)] 属性并将我的拆解指定为 [测试],似乎我能够实现我想要的。不是我真正想要的,因为这个方法将成为测试结果的一部分,但至少它以我想要的方式执行......

标签: c# testing nunit


【解决方案1】:

我会给出一个答案......但首先这个......

我认为使用代码实际上是一个错误在你的测试中管理报告的测试.这是因为与大多数测试框架一样,NUnit 非常努力地将测试与它们运行的​​上下文隔离开来。但是,正如您所展示的,它可以正常工作。值得怀疑的是它能持续工作多久。鉴于 NUnit 人员正在努力将测试与其上下文隔离开来,假设他们在下一个版本中进行了改进 - 那么会发生什么?这些改进在您看来是错误,因为您依赖于运行缺乏隔离。

但是,以 nunti 框架的当前状态,如果你想这样做, 使用程序集级别的SetUpFixture。具体来说...

  1. 在全局命名空间中创建一个类,即在所有命名空间之外。
  2. [SetUpFixture]装饰那个班级
  3. 在类中,添加一个public void方法并用[OneTimeTearDown]装饰它。

    现在你有一个看起来像这样的类......

    [SetUpFixture]
    public static class MySetUpFixture
    {
        [OneTimeSetUp]
        public static void AfterAllTestsRun()
        {
            // Your code here
        }
    }
    

    如上所述,将它放在任何名称空间之外。我让我的班级静态。它不一定是,但不要让你的任何测试装置继承它。如果这样做,您会混淆 NUnit。


    另一方面,如果您想在测试代码之外执行此操作,请编写一个程序来读取 TestResult 文件并创建必要的电子邮件。这并不难做到。

【讨论】:

    猜你喜欢
    • 2019-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-25
    • 2019-06-27
    • 1970-01-01
    相关资源
    最近更新 更多