Frage

In einigem meinem Projekt, das ich feststellen, dass sein während der Ausführung von Unit-Tests unter VSTS2008 VSTestHost Speicher verbrauchen wächst. Da ich sehr viele Tests in meiner Lösung habe es führt schließlich zu OutOfMemroyException. Das sieht für mich sehr seltsam, wie ich war sicher, dass MSTest eine neue AppDomain für jede Einheit Test erstellt. Wie sonst wäre es statische Felder zurücksetzen? Aber wenn AppDomain wird für jeden Test als Speicher erstellt sollte nicht auslaufen. Aber es tut.

Die Frage ist also: Sollte VS erstellen AppDomain für jede Testklasse oder nicht? Wenn ja als wie kann ich überprüfen, ob sie es tut. Ich habe versucht, durch ProcessExpolorer Tracing und Performance-Snap-In. Ein Wert von „Total Appdomain entladen“ ist immer 0 beim Testlauf.

War es hilfreich?

Lösung

Ich glaube nicht, das Gerät zu testen Motor für jeden Test eine neue AppDomain erstellt. Da eine AppDomain der Schaffung ein relativ teurer Betrieb ist, wesentlich dabei für jeden Test verlangsamen würde die Ausführung von Unit-Tests!

Visual Studio 2008 verwendet eine separate ausführbare vstesthost.exe genannt Unit-Tests zu laufen. VS steht in Verbindung mit vstesthost.exe (wie sie tut dies, weiß ich nicht), es zu sagen, welche Tests ausgeführt werden. vstesthost.exe gibt die Ausführungsergebnisse zu VS, die diese Ergebnisse angezeigt werden.

Wenn Sie OutOfMemoryExceptions bekommen, wenn die Komponententests laufen würde ich sagen, das ist ein starker Indikator dafür, dass Ihr im Test befindlichen Code ist eigentlich nicht die Dinge zu reinigen. Sind Sie sicher, dass Sie nicht Griffe auf nicht verwalteten Objekte / Speicher behalten? Ich würde empfehlen, Ihre Unit-Tests unter einer Performance-Analyse läuft (können Sie tun, indem Sie die Unit-Test unter dem „Test View“ zu finden, mit der rechten Maustaste darauf, und wählen Sie „Performance Session erstellen“). Dies könnte etwas Licht zumindest auf dem Objektzuordnung vergießen.

Andere Tipps

MSTest schafft ein Anwendungsdomäne pro Test Montage , es sei denn, Sie verwenden noisolation, wobei in diesem Fall gibt es keine AppDomain Isolation.

Wenn Sie Lecks sehen, es ist wahrscheinlich ein, aber entweder in der Testcode oder Ihr Produktcode. Stellen Sie sicher, dass Sie nicht Dinge in Wörterbücher stopfen und verlassen sie dort.

Ich war falsch über getrennten AppDomains für jeden Unittest.

Hier ist Beweis: ein Singleton

public class Singleton
{
    public static Singleton Instance = new Singleton();

    private Guid _token;
    private Singleton()
    {
        _token = Guid.NewGuid();
    }

    public Guid Token
    {
        get { return _token; }
    }
}

und zwei Tests:

[TestClass]
public class UnitTest2
{
    [TestMethod]
    public void TestMethod1()
    {
        Console.WriteLine(Singleton.Instance.Token);
    }
}
[TestClass]
public class UnitTest1
{
    [TestMethod]
    public void TestMethod1()
    {
        Console.WriteLine(Singleton.Instance.Token);
    }
}

Während der beiden Tests Ausgang die gleiche guid ausgeführt wird.

gesehen das gleiche Problem mit großen Testläufen. Meine Theorie ist die folgende. Speicher Erschöpfung in diesem Fall ist aufgrund der Tatsache, dass MSTest Prüfergebnis Dateien XML sind. Deshalb braucht es bis zum Ende des Testlaufs all Protokolle Ergebnisse im Speicher zu halten, bevor auf der Festplatte Serialisierung. Hurray für XML: -)

Ich habe dieses Problem als verbinden Ausgabe eine Weile zurück, und es sollte 10 in MSTest festgelegt worden ist (in Richtung 64-Bit), aber ich habe das noch nicht in der Lage gewesen, wegen all der anderen Probleme zu VS2010 haben wir bewegt und .NET 4.0 zu überprüfen.

Der einzige Weg, einen Singleton zu entsorgen ist die AppDomain zu entsorgen. Ein Singleton ist ein statischer Halte auf sich selbst, so ist es im Grunde eine kreisförmige Referenz. Wahre Singletons angeordnet nicht bekommen, bis die Appdomain weggeht.

Dies scheint nicht 2010 in MSTest zu lösend ich viele ähnlichen Fragen wie diese erlebe. Warum Garbage Collection nicht in Unit-Test arbeiten?

war mein Verständnis, dass der UT Rahmen aller ausgeführten Tests der Entsorgung kümmern, aber dies scheint nicht der Fall mit einigem Singleton-Muster zu sein, die wir in Code.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top