2016-03-31 6 views
4

Ich beobachte ein seltsames Verhalten mit Visual Studio Enterprise 2015 Update 1. Wenn Sie die Protokollierung über .NET Framework TraceSource innerhalb der Komponententests verwenden, enthält nur der erste Komponententest die Protokollierungsausgabe.Warum werden Nachrichten an die Trace-Quelle gesendet, die bei allen außer dem ersten Komponententest fehlen?

Dies ist der Weg, um das Problem zu reproduzieren:

Ein leeres Unit-Test-Projekt enthält die UnitTest1 Klasse, die wie folgt aussieht:

using System; 
using System.Diagnostics; 
using Microsoft.VisualStudio.TestTools.UnitTesting; 

[TestClass] 
public class UnitTest1 
{ 
    private readonly TraceSource trace = new TraceSource("Demo", SourceLevels.All); 

    [TestMethod] 
    public void TestMethod1() 
    { 
     this.trace.TraceEvent(TraceEventType.Information, 0, "Test 1 (trace source)"); 
     Console.WriteLine("Test 1 (console)"); 
    } 

    [TestMethod] 
    public void TestMethod2() 
    { 
     this.trace.TraceEvent(TraceEventType.Information, 0, "Test 2 (trace source)"); 
     Console.WriteLine("Test 2 (console)"); 
    } 
} 

Die App.config Datei sieht wie folgt aus:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.diagnostics> 
    <trace autoflush="true" /> 
    <sources> 
     <source name="Demo" switchValue="Critical, Error, Warning, ActivityTracing, Information, Verbose"> 
     <listeners> 
      <add name="ConsoleTraceListener" /> 
      <add name="TextFileListener" /> 
     </listeners> 
     </source> 
    </sources> 
    <sharedListeners> 
     <add name="ConsoleTraceListener" type="System.Diagnostics.ConsoleTraceListener" /> 
     <add name="TextFileListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="tests.log" /> 
    </sharedListeners> 
    </system.diagnostics> 
</configuration> 

Beim Ausführen der Tests von Visual Studio:

  • Der Ausgang der ersten Einheit Test ist:

    Test Name: TestMethod1 
    Test Outcome: Passed 
    Result StandardOutput: 
    Demo Information: 0 : Test 1 (trace source) 
    Test 1 (console) 
    

    Sowohl die Nachrichten von trace Quelle und der Konsole angezeigt werden.

  • Der Ausgang der zweiten Einheit Test ist:

    Test Name: TestMethod2 
    Test Outcome: Passed 
    Result StandardOutput: Test 2 (console) 
    

    Während die Ausgabe von Console.WriteLine gut funktioniert, ist die von TraceSource.TraceEvent nicht gezeigt.

die Tests von der Konsole ausgeführt wird durch mstest /testcontainer:UnitTestProject1.dll Ausführung reproduziert das Problem auch. Die für den ersten Test berichtete stdout enthält zwei Zeilen; der zweite Test stdout hat nur eine Zeile.

Warum wird die Protokollierung nicht für alle außer dem ersten Test protokolliert?

Antwort

1

Eine Abhilfe besteht den Standard TextWriter die Verpackung, die die zugrunde liegenden Console.Out Textdichter verwendet die Protokolle senden:

public class CustomTextWriter : TextWriter 
{ 
    public override Encoding Encoding 
    { 
     get 
     { 
      return Console.Out.Encoding; 
     } 
    } 

    public override void Write(string value) 
    { 
     Console.Out.Write(value); 
    } 

    public override void WriteLine(string value) 
    { 
     Console.Out.WriteLine(value); 
    } 
} 

Der Autor dann in einem benutzerdefinierten Spur Hörer verwendet wird, ähnlich wie one used in .NET Framework:

public class ConsoleTraceListener : TextWriterTraceListener 
{ 
    public ConsoleTraceListener() : base(new CustomTextWriter()) 
    { 
    } 

    public override void Close() 
    { 
    } 
} 

, die in App.config wie folgt erklärt:

<add name="ConsoleTraceListener" 
    type="UnitTestProject1.ConsoleTraceListener, UnitTestProject1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 

Dies erzeugt die erwartete Ausgabe, , obwohl es immer noch unklar ist, warum das Problem in erster Linie existiert. Durch die Überprüfung Console.Out und den zugrunde liegenden Stream, scheint es nicht, dass etwas entsorgt oder geschlossen wird, nachdem der erste Test endet (wenn es würde, warum würde the current implementation of Out nichts tun, und warum würde Text an in Protokollen erscheinen?)

Verwandte Themen