我观察到Visual Studio Enterprise 2015 Update 1的奇怪行为。在单元测试中使用通过.NET Framework TraceSource
进行日志记录时,只有第一个单元测试包含日志记录输出。
这是重现问题的方法:
空单元测试项目包含UnitTest1
类,如下所示:
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)");
}
}
App.config
文件如下所示:
<?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>
从Visual Studio运行测试时:
第一次单元测试的输出是:
Test Name: TestMethod1
Test Outcome: Passed
Result StandardOutput:
Demo Information: 0 : Test 1 (trace source)
Test 1 (console)
显示来自跟踪源和控制台的消息。
第二次单元测试的输出是:
Test Name: TestMethod2
Test Outcome: Passed
Result StandardOutput: Test 2 (console)
虽然Console.WriteLine
的输出效果很好,但未显示来自TraceSource.TraceEvent
的输出。
通过执行mstest /testcontainer:UnitTestProject1.dll
从控制台运行测试也会重现问题。第一次测试报告的stdout
包含两行;第二个测试的stdout
只有一行。
除了第一次测试之外,为什么没有记录跟踪记录?
答案 0 :(得分:1)
解决方法包括包装使用基础.*?
文本编写器发送日志的默认TextWriter
:
Console.Out
然后,编写器将用于类似于one used in .NET Framework的自定义跟踪侦听器:
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);
}
}
在App.config中声明,如下所示:
public class ConsoleTraceListener : TextWriterTraceListener
{
public ConsoleTraceListener() : base(new CustomTextWriter())
{
}
public override void Close()
{
}
}
这会产生预期的输出,尽管仍然不清楚为什么问题首先存在。通过检查<add name="ConsoleTraceListener"
type="UnitTestProject1.ConsoleTraceListener, UnitTestProject1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
和基础流,在第一次测试结束后似乎没有处理或关闭的东西(如果它会,为什么the current implementation of Out
什么都不做,以及为什么文本会发送到{ {1}}出现在日志中?)