2 Stimmen

Wie liest man ".NET Data Provider für SqlServer" Leistungszähler von MS Test?

Wie lese ich den Leistungszähler "NumberOfActiveConnections" der Kategorie ".NET Data Provider for SqlServer" aus einem Einheitstest in MS Test aus?

Ich versuche das Folgende, aber es scheint, dass ich den Instanznamen falsch verstehe. Die MSDN-Dokumentation behauptet, dass dies ein korrekter Weg ist, um den Instanznamen einer WinForms-Anwendung zu erhalten, aber dies wird nicht mit MS Test funktionieren:

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

Wenn ich den obigen Code von MS Test aus ausführe, erhalte ich null zurück von dem Anruf bei GetEntryAssembly()

Ich habe auch versucht, den Namen des MS-Testprozesses und andere Varianten zu verwenden, aber ohne Erfolg.

Dies ist der Beispielcode, der eine Ausnahme auslöst, wenn ich einen der Instanznamen von oben verwende:

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

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

Ich aktiviere den "NumberOfActiveConnections"-Zähler, indem ich dies der app.config wie folgt hinzufüge MSDN-Dokumentation :

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

Vielleicht liegt das Problem darin, dass die Leistungszähler für die MS Test-Hostdomäne aktiviert sind, aber nicht für die Domäne, in der die Tests tatsächlich ausgeführt werden?

1voto

cthrek Punkte 26

Der Instanzname für VSTestHost für mich neigt dazu, eine lange Zeichenfolge, die vage ähnlich wie eine GUID, gefolgt von der PID, so herauszufinden, der Instanzname ist ein wenig von einem Schmerz, obwohl, wenn Sie die PID wissen (ich werde zu, dass in einer Sekunde), dann kann es getan werden, indem Sie etwas entlang dieser Zeilen:

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);
}

Da der Aufruf von GetEntryAssembly() während eines Unit-Tests Null zurückgibt, ist es auch ziemlich mühsam, die PID für VSTestHost.exe zu ermitteln. Sie sollten jedoch in der Lage sein, etwas in dieser Richtung zu tun:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X