Как прочитать счетчики производительности «.NET Data Provider for SqlServer» из MS Test? - PullRequest
2 голосов
/ 25 ноября 2008

Как прочитать из счетчика производительности «NumberOfActiveConnections» категории «Поставщик данных .NET для SqlServer» из модульного теста в MS Test?

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

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

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

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

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

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

Assert.AreEqual<long>(0, counter.RawValue);

Я включаю счетчик «NumberOfActiveConnections», добавляя его в app.config согласно документации MSDN :

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

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

1 Ответ

1 голос
/ 08 апреля 2009

Имя экземпляра для 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...