2015-06-27 120 views
2

我一直在想辦法將一些字符串輸出添加到NUnit測試結果。做了一些研究並碰到了this但這不是我想要的。我想將輸出寫入由NUnit生成的結果xml,但無法找到執行此操作的方法。請建議!將控制檯輸出添加到NUnit測試結果

編輯

我知道NUnit 3將有一個機制通話TextContex來完成類似的東西,但我使用2.6.3

+0

林不知道是否'Assert'語句中的'message'參數將進入xml文件。如果是這樣,也許你可以達到你想要的那樣? – nozzleman

+0

你想打開一個XML文件,然後修改結果,還是通過一個字符串獲取XML文件?你應該可以通過c#修改任何xml。源碼來自nunit並不重要。 – jdweng

+0

@nozzleman我想,如果我現在用的'Console.Writeline()寫' – Saifur

回答

1

你可以採取的PropertyAttribute s到附着性能優勢每個測試對XML輸出。下面的例子假設你真的想要使用Console.WriteLine來產生字符串輸出,但是如果你不想弄亂控制檯輸出,你總是可以自己製作TestConsole.WriteLine或其他東西。

E.g.這個屬性就是一個「輸出」屬性附加到每個測試宣佈'S:

[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> 
相關問題