In JUnit über eigenen Thread testen

xehpuk

Top Contributor
Hey, Leute,

ich komme mal direkt zu meinem Anliegen: Ist es möglich, die ganzen assert-Tests in JUnit über einen Thread durchzuführen?

Java:
import junit.framework.TestCase;

public class ThreadTest extends TestCase {
	public void testThread() {
		new Thread(new Runnable() {
			public void run() {
				assertEquals(true, false);
			}
		}, "assertProcess").start();
	}
}
Dies funktioniert nicht. Er schmeißt den AssertionFailedError und gibt ihn auf der Konsole aus:

Code:
Exception in thread "assertProcess" junit.framework.AssertionFailedError: expected:<true> but was:<false>
	at junit.framework.Assert.fail(Assert.java:47)
	at junit.framework.Assert.failNotEquals(Assert.java:280)
	at junit.framework.Assert.assertEquals(Assert.java:64)
	at junit.framework.Assert.assertEquals(Assert.java:146)
	at junit.framework.Assert.assertEquals(Assert.java:152)
	at test.ThreadTest$1.run(ThreadTest.java:7)
	at java.lang.Thread.run(Unknown Source)

Der Test geht blöderweise positiv durch.

Vielen Dank im Voraus! 🙂
 
Die Assertion-Exception fliegt eben nicht in dem JUnit-Thread. JUnit bekommt davon gar nichts mit. Die Testmethode läuft ja fehlerfrei durch.
Was willst du denn erreichen? Unit-Tests sollte man nicht nebenläufig ausführen müssen.
 
Die Operation, die getestet werden soll, greift auf einen Buffer zu. Ist dieser leer, wird der Thread in den Wartezustand versetzt. Ist dies nun also der main-Thread, geht natürlich nichts mehr.

Ich könnte die ganzen asserts natürlich ans Ende der Test-Methode setzen. Das geht auch erwartungsgemäß. Nur würd ich gern möglichst "extrem" testen, dass also schon ein oder mehrere Threads zu Anfang auf ein bestimmtes Objekt warten, sodass es da ein größeres "Chaos" gibt.

Ohne hässlichen Code ließe sich da wohl nichts machen, oder?
 
Achso, du hast einen Belastungstest und keinen Unit-Test.
Schau dir mal TestNG an (TestNG).
Dort kanst du z.B. sagen, deine Testmethode soll 10000 mal aufgerufen werden und das auf 20 Threads verteilt bei einem maximalen Timeout von 50 Sekunden usw. Das alles durch Annotationen.

Java:
@Test(threadPoolSize = 20, invocationCount = 10000, invocationTimeOut = 50000)
public void verifyMethodIsThreadSafe() {
  ....
}

Ob man das mit JUnit auch so einfach hinbekommt, weiß ich nicht.
 

Neue Themen


Zurück
Oben