2008-09-19 25 views
5

Ich führe einige JUnit-Tests auf meinen Anwendungen. Jeder Test hat eine for-Schleife, die die jeweilige Methode 10000 mal aufruft. Die getesteten Methoden produzieren viel log. Diese Protokolle werden auch automatisch von JUnit als Testausgabe erfasst. Diese Situation nimmt OutOfMemoryError, weil der Zeichenfolgenpuffer, in dem JUnit die Ausgabe behält, zu groß wird. Ich brauche diese Protokolle nicht während der Tests, also wenn es eine Möglichkeit gibt, JUnit zu sagen, "halte die Programmausgabe nicht", würde es reichen. Irgendwelche Ideen?Junit-Ausgabe und OutOfMemoryError

Antwort

3

Welche Art der Protokollierung verwenden Sie? Gibt es eine Möglichkeit, das Standardprotokollierungsverhalten zu überschreiben, um alle Protokollnachrichten einfach zu ignorieren?

1

Einige Optionen:

  1. Ihre Protokollierung ändern, so dass es in eine Datei statt Standardausgabe Dumps.
  2. Erhöhen Sie die maximale Heap-Größe mit -Xmx <some number>M, wie -Xmx 256M.
0

Ich würde nur den verfügbaren Speicher erhöhen .. Versuchen Sie, -Xmx256m -Xmx256m zu Ihrer VM hinzuzufügen.

0

Die Lösung überschrieb die Protokollierungseigenschaften. Jetzt habe ich die Protokollierung deaktiviert und alles scheint zu funktionieren (der Test läuft noch). Wenn es funktioniert, werde ich eine Möglichkeit für die Protokollierung in eine Datei konfigurieren. Danke allen (und herzlichen Glückwunsch an Jeff & Freunde für diese Seite).

0

Ich sehe, dass eine Antwort bereits akzeptiert wurde, aber hier ist, was ich Erklärungen abgegeben haben, wenn ich es abgetippt bekommen hatte und getestet schneller:

Wenn von „logging“ Sie bedeuten System.out.println() oder System.err.println(), und wenn Sie sicher sind, dass Ihr Test die Protokolle wirklich nicht benötigt, können Sie stdout und stderr programmgesteuert umleiten.

// Save the original stdout and stderr 
PrintStream psOut = System.out; 
PrintStream psErr = System.err; 
PrintStream psDevNull = null; 
try 
{ 
    // Send stdout and stderr to /dev/null 
    psDevNull = new PrintStream(new ByteArrayOutputStream()); 
    System.setOut(psDevNull); 
    System.setErr(psDevNull); 
    // run tests in loop 
    for (...) 
    { 
    } 
} 
finally 
{ 
    // Restore stdout and stderr 
    System.setOut(psOut); 
    System.setErr(psErr); 
    if (psDevNull != null) 
    { 
     psDevNull.close(); 
     psDevNull = null; 
    } 
} 

Auf diese Weise wird Ihr Testausgang, aber die andere Ausgabe von JUnit wird nicht deaktiviert werden, da es, wenn Sie die Umleitung auf der Kommandozeile wie folgt verwendet werden würde:

ant test &> /dev/null 

Des Bei der Befehlszeilenumleitung wird die gesamte Ausgabe von Ant/JUnit umgeleitet, nicht nur, was von der Klasse kommt, die Sie testen. Das ist wahrscheinlich nicht das, was Sie wollen. Die programmatische Umleitung bewirkt, dass nur die Ausdrucke/Schreibvorgänge in System.out und System.err in Ihrem Programm umgeleitet werden, und Sie erhalten weiterhin die Ausgabe von Ant und JUnit.

0

Wenn es irgendeine Hilfe ist, löste das Setzen von outputtoformatters = "no" alle meine Speicherprobleme (in Ant 1.7.1 verhindert dies die Ausgabe, die durch Tests erzeugt wurde, die an die Testformatierer gesendet wurden).

Verwandte Themen