在MSTest中启用跟踪源

时间:2016-01-06 14:56:24

标签: visual-studio-2015 mstest trace tracelistener tracesource

我有一个DLL在复杂的一面,我正在编写测试。大多数被测试的类都有自己的TraceSource对象,用于输出跟踪信息。

namespace MyDll
{
    public class Class1
    {
        static TraceSource tracing = new TraceSource(nameof(Class1));
        //Instance members and functions...
    }

    public class Class2
    {
        static TraceSource tracing = new TraceSource(nameof(Class2));
        //Instance members and functions...
    }

    public class Class3
    {
        static TraceSource tracing = new TraceSource(nameof(Class3));
        //Instance members and functions...
    }
}

MyDll项目内部是一个App.config文件,可为所有ConsoleTraceListener添加公共TraceSource,如下所示:

<configuration>
  <system.diagnostics>
    <sources>
      <source name="Class1"
        switchName="sourceSwitch"
        switchType="System.Diagnostics.SourceSwitch">
        <listeners>
          <add name="console"/>
        </listeners>
      </source>
      <source name="Class2"
        switchName="sourceSwitch"
        switchType="System.Diagnostics.SourceSwitch">
        <listeners>
          <add name="console"/>
        </listeners>
      </source>
      <source name="Class3"
        switchName="sourceSwitch"
        switchType="System.Diagnostics.SourceSwitch">
        <listeners>
          <add name="console"/>
        </listeners>
      </source>
    </sources>
    <switches>
      <add name="sourceSwitch" value="Verbose"/>
    </switches>
    <sharedListeners>
      <add name="console"
            type="System.Diagnostics.ConsoleTraceListener">
        <filter type="System.Diagnostics.EventTypeFilter"
          initializeData="Verbose"/>
      </add>
    </sharedListeners>
  </system.diagnostics>
</configuration>

App.config配置为始终复制到输出目录。我不确定这是否相关。

问题在于:如果我运行1次测试,我会从测试的输出中获取所有跟踪信息。但是,如果我运行所有测试,则只有第一次测试运行才能从测试代码中进行跟踪。所有其他测试都没有任何输出。

如何让MSTest输出所有TraceSource所有测试的所有跟踪信息?

1 个答案:

答案 0 :(得分:0)

问题在于MSTest。测试类中的静态对象将在第一次测试中被拾取,但在以下测试中不会被拾取。例如,

public class SomeDependency
{
   private static TraceSource tracing = new TraceSource("SomeDependency");
   public void FunctionUsed()
   {
      tracing.TraceEvent(TraceEventType.Informational, 1, "This function is being used");
   }
}

[TestClass]
public class TestClass
{
   static SomeDependency dependency;

   [ClassInitialize]
   public static void Init(TestContext context)
   {
      dependency = new SomeDependecy();
   }

   [TestMethod]
   public void Test1()
   {
      dependency.FunctionUsed();
   }

   [TestMethod]
   public void Test2()
   {
      dependency.FunctionUsed();
   }
}

Test1会显示TraceSourceSomeDependency的输出,但Test2则不会。这是MSTest跑步者的限制。