我一直在尝试找出一种将一些字符串输出添加到 NUnit 测试结果的方法。我做了一些研究并遇到了这个,但这不是我想要的。我想将输出写入xml
NUnit 生成的结果,但我找不到办法。请建议!
我知道 NUnit 3 将有一个名为TextContex的机制来完成类似的事情,但我使用的是2.6.3。
我一直在尝试找出一种将一些字符串输出添加到 NUnit 测试结果的方法。我做了一些研究并遇到了这个,但这不是我想要的。我想将输出写入xml
NUnit 生成的结果,但我找不到办法。请建议!
我知道 NUnit 3 将有一个名为TextContex的机制来完成类似的事情,但我使用的是2.6.3。
您可以利用PropertyAttribute
s 将每个测试的属性附加到 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
,你可以使用你自己的类而不是使用这个属性)。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");
}
}
<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
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>