【问题标题】:Adding more information to TestResult.xml file from NUnit从 NUnit 向 TestResult.xml 文件添加更多信息
【发布时间】:2008-09-04 19:45:06
【问题描述】:

我希望能够将“消息”添加到单元测试中,以便它实际出现在 NUnit 生成的 TestResult.xml 文件中。例如,这是当前生成的:

<results>
    <test-case name="MyNamespace.Tests.MyTest" executed="True" success="True" time="0.203" asserts="4" />
</results>

我希望能够有一个额外的属性(或节点视情况而定),例如:

<results>
    <test-case name="MyNamespace.Tests.MyTest" executed="True" success="True" time="0.203" asserts="4" message="Tested that some condition was met." />
</results>

这个想法是上面的“消息”将以某种方式在测试方法本身中定义(在我的例子中,在运行时生成)。有没有我想念的地方可以做这样的事情?

【问题讨论】:

    标签: unit-testing nunit


    【解决方案1】:

    在最近的 NUnit 版本中,您可以这样做:

    Assert.AreEqual(250.00, destination.Balance, "some message here");
    

    其中“Some message here”可以是常量消息,也可以是在运行时生成并存储在字符串变量中的消息。但是,如果断言失败,这些消息只会出现在输出中。但是,通常,您只需要有关失败测试的信息,因此我建议通过添加每个先前的消息来构建一个字符串,然后将该字符串变量用作所有断言中的消息。这使您可以从失败的测试中获得所需的所有信息。

    【讨论】:

    • 太棒了,这正是我想要的!
    【解决方案2】:

    这可能没有抓住重点,但是如何命名测试以便它们指示测试的内容 - 那么您甚至可能不需要该消息。

    如果它被证明是绝对必要的,我认为您需要生成自己的测试运行程序,它会(在我的脑海中)从 TestCase 中读取一个附加属性并将其附加到输出中。

    【讨论】:

    • 你并不完全偏离基地。但是,我要添加到 TestResult.xml 的正在测试的条件在运行时之前通常是未知的。现在我只是 Console.WriteLine 他们。这些测试可能更恰当地称为“测试运行程序”,其中实际上只断言了一些最终状态值。我想沿着这些相同的思路,我可以使用反射动态创建和命名这些测试方法,但我认为这开始过火了。 :-) 不过,与此同时,我将继续研究创建 TestRunner。
    • 您确认我需要做一些反射魔法并在运行时动态创建和命名测试,或者我必须创建一个自定义测试运行器。
    【解决方案3】:

    我在运行时看不到任何可用的内容,但您可能需要研究一些功能:Description 属性和Property 属性都将文本添加到 XML 输出文件。不幸的是,它们都是在编译时定义的。

    【讨论】:

      【解决方案4】:

      您可以使用 TestContext 轻松写出您想要的任何消息。这是我的设置方式。

      我的每个测试都继承自一个测试库类。这将删除冗余代码。

      [TestFixture]
      public class TestBase
      {
      
          public IWebDriver driver;
      
          //[OneTimeSetUp] and [OneTimeTearDown] go here if needed
      
          [SetUp]
          public void Setup(){
               driver = Shortcuts.SetDriver("my browser");
          }
      
          [TearDown]
          public void TearDown()
          {
              driver.Quit();
              Comment("@Result: " + TestContext.CurrentContext.Result.Outcome.ToString());
          }
      
          public void Comment(string _comment)
          {
              TestContext.Out.WriteLine(_comment);
          }
          public void Error(string _error)
          {
              TestContext.Error.WriteLine(_error);
          }
      
      }
      

      您可以看到底部的两个函数在所述 TestContext 中写出任何消息或错误。这也适用于可并行化的测试。

      然后我可以使用该父类来设置我的测试,并写入我的控制台。

      //Role Management
      public class RoleManagementTests : TestBase
      {
          [TestCase]
          public void RoleManagement_7777_1()
          {
              Comment("Expected: User has the ability to view all roles in the system.");
              //Test goes here
          }
      }
      

      现在您可以使用 NUnit Console Runner 在输出 (Visual Studio) 和 TestResult.xml 中查看结果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-12
        • 2019-11-30
        • 2012-12-24
        • 1970-01-01
        相关资源
        最近更新 更多