Как прочитать счетчики производительности ".NET Data Provider for SqlServer" из MS Test?


Как я могу прочитать из счетчика производительности "NumberOfActiveConnections" категории ".NET Data Provider for SqlServer" из модульного теста в MS Test?

Я пытаюсь сделать следующее, Но кажется, что я неправильно понял имя экземпляра. Документация MSDN утверждает, что это правильный способ получения имени экземпляра приложения WinForms, но это не будет работать с MS Test:

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

При выполнении кода выше из MS Test я получаю null обратно из вызова GetEntryAssembly()

Я также пытался использовать название процесса тестирования MS и другие варианты, но без успеха.

Это пример кода, который вызовет исключение, когда я использую любое из имен экземпляров сверху:

PerformanceCounter counter = new PerformanceCounter(
    ".NET Data Provider for SqlServer", 
    "NumberOfActiveConnections", 
    instanceName, 
    true);            

Assert.AreEqual<long>(0, counter.RawValue);
Я включаю счетчик "NumberOfActiveConnections", добавив его в приложение.config согласно документации MSDN:
<system.diagnostics>
  <switches>
    <add name="ConnectionPoolPerformanceCounterDetail" value="4"/>
  </switches>
</system.diagnostics>

Возможно, проблема в том, что счетчики производительности включены для домена MS Test host, но не для домена MS Test host. домен, в котором фактически выполняются тесты?

1 2

1 ответ:

Имя экземпляра для 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 () во время модульного теста возвращает null, это также своего рода боль, чтобы получить доступ к PID для VSTestHost.exe. Тем не менее, вы должны быть в состоянии сделать что-то вроде этого:

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