代码之家  ›  专栏  ›  技术社区  ›  Magnus Lindhe

如何从MS测试读取“.net data provider for sqlserver”性能计数器?

  •  2
  • Magnus Lindhe  · 技术社区  · 15 年前

    如何从MS测试中的单元测试中读取类别“.NET data provider for sqlserver”的性能计数器“numberofActiveConnections”?

    我正在尝试以下操作,但似乎我弄错了实例名。这个 MSDN documentation 声称这是获取WinForms应用程序实例名的正确方法,但这不适用于MS测试:

    string instanceName = System.Reflection.Assembly.GetEntryAssembly().GetName().Name;
    

    当从MS测试运行上述代码时,我得到 null 从呼叫返回到 GetEntryAssembly()

    我也尝试过使用MS测试过程和其他变体的名称,但没有任何运气。

    这是当我使用上面的任何实例名称时将引发异常的示例代码:

    PerformanceCounter counter = new PerformanceCounter(
        ".NET Data Provider for SqlServer", 
        "NumberOfActiveConnections", 
        instanceName, 
        true);            
    
    Assert.AreEqual<long>(0, counter.RawValue);
    

    我正在启用“NumberOfActiveConnections”计数器,方法是根据 msdn文档 :

    <system.diagnostics>
      <switches>
        <add name="ConnectionPoolPerformanceCounterDetail" value="4"/>
      </switches>
    </system.diagnostics>
    

    也许问题在于,性能计数器是为MS测试主机域启用的,而不是为实际运行测试的域启用的?

    1 回复  |  直到 15 年前
        1
  •  1
  •   cthrek    15 年前

    对我来说,vstesthost的实例名往往是一个长字符串,看起来与guid后面跟着pid有点类似,因此计算实例名有点麻烦,不过如果您知道pid(我马上就会知道),那么可以通过以下几行操作来完成:

    PerformanceCounterCategory category = new PerformanceCounterCategory(
        ".NET Data Provider for SqlServer");
    string testInstanceName = null;
    foreach(string instanceName in category.GetInstanceNames())
    {
        if (instanceName.EndsWith(string.Format("[{0}]", pid)))
        {
            testInstanceName = instanceName;
            break;
        }
    }
    
    if(testInstanceName != null)
    {
        PerformanceCounter counter = new PerformanceCounter(
            category.CategoryName,
            "Number of Active Connections",
            testInstanceName,
            true);
    }
    

    由于在单元测试期间调用getEntryassembly()返回空值,因此获取vstesthost.exe的PID也是一种痛苦。但是,您应该能够沿着这些线做一些事情:

    Process[] testProcesses = Process.GetProcessesByName("VSTestHost");
    if (testProcesses.Length == 1)
    {
        pid = testProcesses[0].Id;
    }