我一直在试图找到一种方法,将一些字符串输出添加到NUnit测试结果中。我做了一些研究,发现了这个,但这不是我想要的。我想把输出写入NUnit生成的结果xml
,但我找不到方法。请建议!
我知道NUnit 3将有一个名为TextContex的机制来完成类似的任务,但我使用的是2.6.3.
您可以利用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
321 test
" />
</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
321 test2
" />
</properties>
</test-case>