向NUnit测试结果添加控制台输出

本文关键字:控制台 输出 添加 测试结果 NUnit | 更新日期: 2023-09-27 18:00:00

我一直在试图找到一种方法,将一些字符串输出添加到NUnit测试结果中。我做了一些研究,发现了这个,但这不是我想要的。我想把输出写入NUnit生成的结果xml,但我找不到方法。请建议!

我知道NUnit 3将有一个名为TextContex的机制来完成类似的任务,但我使用的是2.6.3.

向NUnit测试结果添加控制台输出

您可以利用PropertyAttribute将每个测试的属性附加到XML输出。下面的示例假设您确实希望使用Console.WriteLine来生成字符串输出,但如果您不想干扰控制台输出,则可以始终创建自己的TestConsole.WriteLine或其他内容。

例如,该属性表示将"Output"属性附加到声明的每个测试:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class TestWriterAttribute : PropertyAttribute
{
    public TestWriterAttribute() : base()
    {
        // Create a container for test output
        Properties["Output"] = new StringBuilder();
    }
}

这个属性表示将Console.Out重定向到您的"Output"属性(同样,如果您不想干扰Console.Out,您可以使用自己的TestConsole类类,而不是使用这个属性)。

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class ConsoleOutToTestWriterAttribute : TestActionAttribute
{
    public override void BeforeTest(TestDetails testDetails)
    {
        // If the test has a [TestWriter], redirect Console.Out to its "Output" property
        var output = TestContext.CurrentContext.Test.Properties["Output"] as StringBuilder;
        if (output != null) 
            Console.SetOut(new System.IO.StringWriter(output));
        _consoleOutRedirected = output != null;
    }
    public override void AfterTest(TestDetails testDetails)
    {
        // Reset Console.Out, if appropriate
        if(_consoleOutRedirected)
            Console.SetOut(new System.IO.StreamWriter(Console.OpenStandardOutput()) { AutoFlush = true });
    }
    public override ActionTargets Targets
    {
        // needs to apply to each test, since [TestWriter]s are applied per test
        get { return ActionTargets.Test; }
    }
    private bool _consoleOutRedirected;
}

你的测试可以只使用Console.WriteLine,每次测试都会捕获:

[ConsoleOutToTestWriter] // redirect Console.Out into "Output" property per test
public class ClassTest
{
    [Test]
    [TestWriter] // adds "Output" property
    public void MyTest()
    {
        Console.WriteLine("test 123");
        Console.WriteLine("321 test");
    }
    [Test]
    [TestWriter]
    public void MyTest2()
    {
        // this console output will be written to this test's own "Output"
        Console.WriteLine("test2 123");
        Console.WriteLine("321 test2");
    }
}

它在NUnit XML输出中的<results>下生成以下内容:

<test-case name="SO_31092459.ClassTest.MyTest" executed="True" result="Success" success="True" time="0.023" asserts="0">
    <properties>
        <property name="Output" value="test 123&#xD;&#xA;321 test&#xD;&#xA;" />
    </properties>
</test-case>
<test-case name="SO_31092459.ClassTest.MyTest2" executed="True" result="Success" success="True" time="0.000" asserts="0">
    <properties>
        <property name="Output" value="test2 123&#xD;&#xA;321 test2&#xD;&#xA;" />
    </properties>
</test-case>