我一直试图想出一种方法来为NUnit测试结果添加一些字符串输出。做了一些研究并遇到this,但这不是我想要的。我想将输出写入xml
生成的结果NUnit
,但无法找到方法。请提出建议!
修改
我知道NUnit 3
将有一个机制调用 TextContex 来完成类似的操作,但我正在使用 2.6.3
答案 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
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>