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

时间:2015-06-27 19:02:36

标签: c# nunit nunit-console nunit-2.5

我一直试图想出一种方法来为NUnit测试结果添加一些字符串输出。做了一些研究并遇到this,但这不是我想要的。我想将输出写入xml生成的结果NUnit,但无法找到方法。请提出建议!

修改

我知道NUnit 3将有一个机制调用 TextContex 来完成类似的操作,但我正在使用 2.6.3

1 个答案:

答案 0 :(得分:1)

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

E.g。此属性表示附加"输出"每个测试它的属性:

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

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

[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>