2

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

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

4

1 回答 1

1

您可以利用PropertyAttributes 将每个测试的属性附加到 XML 输出。下面的例子假设你真的想用它来产生字符串输出,但如果你不想弄乱控制台输出Console.WriteLine,你总是可以自己制作或其他东西。TestConsole.WriteLine

例如,此属性表示将“输出”属性附加到它声明的每个测试:

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

这个属性表示重定向到你的“输出”属性(同样,如果你不想弄乱Console.Out,你可以使用你自己的类而不是使用这个属性)。TestConsoleConsole.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");
    }
}

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

<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>
于 2016-01-01T02:14:37.040 回答