Unit testing 从NUnit向TestResult.xml文件添加更多信息

Unit testing 从NUnit向TestResult.xml文件添加更多信息,unit-testing,nunit,Unit Testing,Nunit,我希望能够将“消息”添加到单元测试中,以便它实际出现在NUnit生成的TestResult.xml文件中。例如,这是当前生成的: <results> <test-case name="MyNamespace.Tests.MyTest" executed="True" success="True" time="0.203" asserts="4" /> </results> 我希望能够有一个附加属性(或节点,视情况而定),例如: <resul

我希望能够将“消息”添加到单元测试中,以便它实际出现在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>


其想法是,上面的“消息”将以某种方式在测试方法本身中定义(在我的例子中,是在运行时生成的)。是否有一个属性我无法完成类似的操作?

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


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

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

在最近的NUnit版本中,您可以执行以下操作:

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

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

您可以使用TestContext轻松写出所需的任何消息。以下是我的设置方式

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

[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中看到结果。

太棒了,这正是我想要的!你并不是完全错了。但是,我想添加到TestResult.xml的测试条件在运行时之前通常是未知的。现在我只是简单地安慰他们。这些测试可能更恰当地称为“测试运行程序”,其中只有一些最终状态值被实际断言。我想,按照同样的思路,我可以使用反射动态创建和命名这些测试方法,但我认为这已经开始过火了。:-)不过,在此期间,我将继续研究如何创建TestRunner。您确认我需要执行一些反射魔法,并在运行时动态创建和命名测试,或者我必须创建一个自定义的测试运行程序。