MSTest & AppDomains
In einigen meiner Projekt ich feststellen, dass beim ausführen von unit-tests unter VSTS2008 seine VSTestHost der Speicher wächst. Da ich sehr viele tests in meiner Lösung, es führt zu OutOfMemroyException schließlich.
Das sieht sehr seltsam für mich, als ich mir sicher war, dass MSTest erstellt eine neue Anwendungsdomäne für jede Einheit testen. Wie sonst würden Sie es zurücksetzen statischer Felder?
Aber wenn AppDomain erstellt wird für jeden test als Arbeitsspeicher sollte nicht Auslaufen. Aber das tut es.
Also die Frage ist: Soll VS erstellen Anwendungsdomäne für jede test-Klasse oder nicht? Wenn ja, als wie kann ich überprüfen, dass Sie es tut.
Ich habe versucht, die Führung durch ProcessExpolorer und Leistung-snap-in. Ein Wert von "Total appdomain entladen" ist immer 0, während der test ausgeführt wird.
- Ich bin mit dem gleichen problem. Dies Tat am Ende ein "problem" als Antwort schien zu sagen? Oder war es in der Tat der test-runner? Ich bin mal gespannt.
- Ich habe festgestellt, social.msdn.microsoft.com/Forums/en-US/vststest/thread/... und social.msdn.microsoft.com/Forums/en-US/vststest/thread/... - ich bin immer die Idee, dass die wenigen von uns, die haben eine große test-suite sind von diesem problem betroffen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube nicht, dass das unit-test-engine erstellt eine neue Anwendungsdomäne für jeden test. Da das erstellen einer Anwendungsdomäne ist eine relativ teure operation, damit für jeden test würde verlangsamen die Ausführung von unit-tests deutlich!
Visual Studio 2008 verwendet eine separate ausführbare Datei namens vstesthost.exe zum ausführen von unit-tests. VS kommuniziert mit vstesthost.exe (wie es das macht, weiß ich nicht) sagen, welche tests ausgeführt werden. vstesthost.exe gibt das ausführungsergebnis an VS, die zeigt die Ergebnisse.
Wenn Sie immer OutOfMemoryExceptions, wenn Sie mit Ihrem unit-tests würde ich sagen, dass das ein starker Indikator dafür, dass Sie Ihren code unter test ist eigentlich nicht die Reinigung Dinge. Sind Sie sicher, dass Sie nicht die Beibehaltung Griffe, um die nicht verwaltete Objekte/Speicher? Ich würde empfehlen, läuft Ihre unit-tests unter einer Performance-Analyse (Sie können dies durch die Suche nach dem unit-test unter die "Test-Anzeigen", der rechten Maustaste auf es, und wählen Sie "Performance Session"). Das könnte etwas Licht zumindest auf Ihren Klassenzuordnungen.
MsTest erstellt eine app-Domäne pro Test Montage, es sei denn, Sie sind mit noisolation, in dem Fall gibt es keine AppDomain-Isolierung.
Wenn Sie sehen, Lecks, es ist wahrscheinlich, aber in Ihrem test-code, oder Ihr Produkt-code. Stellen Sie sicher, dass Sie nicht die Füllung, die Dinge in die Wörterbücher und verlassen Sie dort.
War ich falsch über separate AppDomains für jeden unittest.
Hier ist der Beweis:
ein singleton
und zwei tests:
Während der Ausführung von tests der Ausgabe, die dieselbe guid.
Gesehen das gleiche problem mit den großen test läuft. Meine Theorie ist die folgende. Speicher Abführung in diesem Fall ist aufgrund der Tatsache, dass MSTest-test-Ergebnis-Dateien sind XML. Daher es braucht, um alle log-Ergebnisse in den Speicher bis zum Ende des Tests ausgeführt werden, bevor mit der Serialisierung auf der Festplatte. Es Lebe XML 🙂
Ich habe diese problem als connect-Ausgabe eine Weile zurück und es sollte behoben wurden in MSTest 10 (64 bit), aber ich habe nicht in der Lage zu überprüfen, diese aber wegen all der anderen Probleme, die wir haben, bewegen zu VS2010 und .NET 4.0.
Der einzige Weg, um über ein singleton ist zu entsorgen die Anwendungsdomäne. Ein singleton ist eine statische festhalten an sich, es ist also im Grunde ein Zirkelbezug. Wahr ist singletons nicht bekommen, entsorgt, bis die appdomain geht Weg.
Scheint dies nicht zu sein, gelöst in MSTest 2010. Ich erlebe eine Menge von ähnlichen Problemen wie diesem. Warum garbage collection arbeiten nicht in der unit-test?
Mein Verständnis war, dass die UT-framework kümmerte sich um die Entsorgung aller ausgeführten tests, aber dies scheint nicht der Fall zu sein mit einigen singleton-Muster, wir haben im code.