Plugin - JUnit - Tests aus einem anderen Projekt ausführen

dragon_

Mitglied
Guten Tag,
ich arbeite an einem Plugin für die Eclipseumgebung. Dabei möchte ich JUnit Tests aus einem Zielprojekt laufen und auslesen können. Hierbei habe ich mithilfe der org.eclipse.jdt.junit.JUnitCore.findTestTypes() Methode die erforderlichen Testdateien aus dem Zielprojekt auslesen können, sodass ich die Namen der java Dateien habe. Mittels eines URLCLassLoaders kann ich die class Dateien des Zielprojektes lesen und laden. Diese ClassDateien braucht man nämlich um den junit.runner laufen zu lassen. In der Methode .runClasses(Class<?> ...) kann eine Liste von Classdateien übergeben werden.

Hierbei entsteht nun das Problem. Ich kann die class-Dateien ohne Probleme laden. Jedoch wird die Test Annotation(@Test) während des Testdurchlaufes nicht erkannt. Dies äußert sich zum einen dabei, dass bei einem Durchlauf der Methoden dieser class-Datei, keine Testannotation gefunden wird, was wiederrum während des Testrunnerdurchlaufes einen Fehler ergibt. Hier wird angezeigt, dass es keine Testmethoden gibt:

Java:
FehlerMessage: No runnable methods
Fehlertrace: java.lang.Exception: No runnable methods
at org.junit.runners.BlockJUnit4ClassRunner.validateI nstanceMethods(BlockJUnit4ClassRunner.java:177)
at org.junit.runners.BlockJUnit4ClassRunner.collectIn itializationErrors(BlockJUnit4ClassRunner.java:122 )
at org.junit.runners.ParentRunner.validate(ParentRunn er.java:269)
at org.junit.runners.ParentRunner.<init>(ParentRunner .java:66)
at org.junit.runners.BlockJUnit4ClassRunner.<init>(Bl ockJUnit4ClassRunner.java:58)
at org.junit.internal.builders.JUnit4Builder.runnerFo rClass(JUnit4Builder.java:13)
at org.junit.runners.model.RunnerBuilder.safeRunnerFo rClass(RunnerBuilder.java:57)
at org.junit.internal.builders.AllDefaultPossibilitie sBuilder.runnerForClass(AllDefaultPossibilitiesBui lder.java:29)
at org.junit.runner.Computer.getRunner(Computer.java: 38)
at org.junit.runner.Computer$1.runnerForClass(Compute r.java:29)
at org.junit.runners.model.RunnerBuilder.safeRunnerFo rClass(RunnerBuilder.java:57)
at org.junit.runners.model.RunnerBuilder.runners(Runn erBuilder.java:93)
at org.junit.runners.model.RunnerBuilder.runners(Runn erBuilder.java:84)
at org.junit.runners.Suite.<init>(Suite.java:79)
at org.junit.runner.Computer.getSuite(Computer.java:2 6)
at org.junit.runner.Request.classes(Request.java:69)
at org.junit.runner.JUnitCore.run(JUnitCore.java:127)
at org.junit.runner.JUnitCore.runClasses(JUnitCore.ja va:76)
at de.hsrm.ilias_plugin.handlers.TestingHandler.execu te(TestingHandler.java:162)
at org.eclipse.ui.internal.handlers.HandlerProxy.exec ute(HandlerProxy.java:293)
at org.eclipse.core.commands.Command.executeWithCheck s(Command.java:476)
at org.eclipse.core.commands.ParameterizedCommand.exe cuteWithChecks(ParameterizedCommand.java:508)
at org.eclipse.ui.internal.handlers.HandlerService.ex ecuteCommand(HandlerService.java:169)
at org.eclipse.ui.internal.handlers.SlaveHandlerServi ce.executeCommand(SlaveHandlerService.java:241)
at org.eclipse.ui.internal.handlers.SlaveHandlerServi ce.executeCommand(SlaveHandlerService.java:241)
at org.eclipse.ui.menus.CommandContributionItem.handl eWidgetSelection(CommandContributionItem.java:829)
at org.eclipse.ui.menus.CommandContributionItem.acces s$19(CommandContributionItem.java:815)
at org.eclipse.ui.menus.CommandContributionItem$5.han dleEvent(CommandContributionItem.java:805)
at org.eclipse.swt.widgets.EventTable.sendEvent(Event Table.java:84)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.ja va:1669)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.ja va:1693)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.ja va:1678)
at org.eclipse.swt.widgets.Widget.notifyListeners(Wid get.java:1421)
at org.eclipse.swt.widgets.Display.runDeferredEvents( Display.java:3738)
at org.eclipse.swt.widgets.Display.readAndDispatch(Di splay.java:3306)
at org.eclipse.ui.internal.Workbench.runEventLoop(Wor kbench.java:2696)
at org.eclipse.ui.internal.Workbench.runUI(Workbench. java:2660)
at org.eclipse.ui.internal.Workbench.access$4(Workben ch.java:2494)
at org.eclipse.ui.internal.Workbench$7.run(Workbench. java:674)
at org.eclipse.core.databinding.observable.Realm.runW ithDefault(Realm.java:332)
at org.eclipse.ui.internal.Workbench.createAndRunWork bench(Workbench.java:667)
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(Pl atformUI.java:149)
at org.eclipse.ui.internal.ide.application.IDEApplica tion.start(IDEApplication.java:123)
at org.eclipse.equinox.internal.app.EclipseAppHandle. run(EclipseAppHandle.java:196)
at org.eclipse.core.runtime.internal.adaptor.EclipseA ppLauncher.runApplication(EclipseAppLauncher.java: 110)
at org.eclipse.core.runtime.internal.adaptor.EclipseA ppLauncher.start(EclipseAppLauncher.java:79)
at org.eclipse.core.runtime.adaptor.EclipseStarter.ru n(EclipseStarter.java:344)
at org.eclipse.core.runtime.adaptor.EclipseStarter.ru n(EclipseStarter.java:179)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Nativ e Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Native MethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(De legatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.eclipse.equinox.launcher.Main.invokeFramework( Main.java:622)
at org.eclipse.equinox.launcher.Main.basicRun(Main.ja va:577)
at org.eclipse.equinox.launcher.Main.run(Main.java:14 10)
at org.eclipse.equinox.launcher.Main.main(Main.java:1 386)

Wenn ich das selbe Szenario in einem normalen JavaProjekt ausführe funktioniert dies und es wird eine Test Annotation gefunden.

Wo könnte hier der Fehler liegen bzw. wie kann ich dieses Problem beheben? Für jede kleine Idee wär ich dankbar.
 

dragon_

Mitglied
Vielen Dank für das schnelle Antworten.

Ich nehme an du meinst, dass ich mir die JUnit Plugin Implementation anschauen sollte. Das heisst via Plugin Spy die Klassen anschaun. Das habe ich versucht, indem ich mir die JUnit-ViewPage angeschaut habe. Jedoch kam ich da nicht viel weiter.
Die Frage stellt sich eben was verhält sich anders in einem lokalen Projekt als in einem Plugin, das class Dateien lädt und somit die Annotation verliert. Wie gesagt der gleiche Code verhält sich unterschiedlich.

Ich kann ja nochmal den Code den ich benutze posten:
Java:
if (firstElement instanceof IJavaProject) {
     IJavaProject javaproject = (IJavaProject) firstElement;
	try {
		IType[] classesWithTests = org.eclipse.jdt.junit.JUnitCore.findTestTypes(javaproject, null);
                TestClassLoader loader=new TestClassLoader();
                Class theClass=loader.classLoading("/testJava/bin/", "SimpleTest");

                //test ob annotation vorhanden
                Method[] methods = theClass.getMethods();
	             for( Method m : methods ) {
			 if( m.isAnnotationPresent( Test.class ) ) {
			     Test a = m.getAnnotation( Test.class );
			     System.out.println( "Methode:                 " + m.getName() );
	             }
	        }

               Class<?>[] testClasses={theClass};
					
	       Result r = JUnitCore.runClasses(testClasses);

               if(r.getFailureCount()>0){
		   System.out.println("fehler:"+r.getFailureCount());
		   for(Failure f:r.getFailures()){
			System.out.println("FehlerMessage: "+f.getMessage()+"\n"+
						"Fehlertrace: "+f.getTrace()+"\n"+
						"Fehlerdescription: "+f.getDescription());	
		   }
		}else if(r.wasSuccessful()){
			System.out.println("test erfolgreich");
		}
         } catch (OperationCanceledException e) {
			e.printStackTrace();
	} catch (CoreException e) {
				e.printStackTrace();
	}
}
 

dragon_

Mitglied
Ja da bin ich mittlerweile auch angelangt. Ich dachte halt dass man ganz einfach den Runner anstößt und gut ist. Dann war es eine endlose Suche um herauszufinden wie ich an den Codeteil komme um z.B. die Implementierung des Run-Buttons des Plugins zu bekommen. Das habe ich immer gesucht... Damit ich Eclipse bzw das Plugin die Arbeit machen lassen kann bzw verstehe wo diese Funktion des JUnitCore aufgerufen wird. Ich habe aber jetzt herausgefunden dass man mittels Import die bestehenden Plugins in den Workspace als Projects laden kann und dass ggf. das was ich suche im org.eclipse.jdt.junit.XX Plugin/Package liegt. D.h. ich habe immer nur im Kern versucht rumzusuchen.

Ich werde mal weiter in dem neuen Package suchen, wo es die Schnittstelle zum Kern gibt. Vielleicht bin ich erfolgreich :)
 

dragon_

Mitglied
Leider blieb die Suche erstmal erfolglos. Den genauen Punkt zwischen der UI und dem JUnitCore habe ich nicht entdeckt. Mittels des Spy kann man nicht die erforderlichen Handler oder Klassen anschauen, in denen die Implementierung der Aktion steht. Daher weiss ich nicht was genau passiert, wenn man den "Run As...->JUnit Test" Eintrag benutzt.

Edit: Mittels der Methode launch(ISelection,String) kann ich die Selection(IJavaProject) übergeben, wodurch der ganze Testdurchlauf gestartet wird, und danach die JUnitTestView aufgerufen wird. D.h man müsste nur noch einen Listener in diesen Ablauf einhängen, damit man an die Resultate kommt.
 
Zuletzt bearbeitet:

dragon_

Mitglied
Ich meine damit das ich fie robuste Implementierung von Eclipse versuchen würde wiederzuverwenden anstatt es nachbauen zu wollen.

Also wenn ich das richtig verstanden habe, meinst du, dass ich eclipse sage: Führe JUnit Tests mit diesem Projekt aus? Wenn dies der Fall ist habe ich dies mithilfe des org.eclipse.jdt.junit packages und der launch(ISelection)-Methode geschafft. Das Problem was nun besteht ist, dass dies einen Job erstellt, der irgendwann vom System dann abgearbeitet wird. Hierbei wird nirgendswo in den JUnitCore gegangen. D.h. ich habe keinen Debug oder Einstiegspunkt. Ich kann nur den Durchlauf der JobErstellung überwachen.

Die Frage wäre nämlich dann, ob ich alles was danach kommt selbst bauen muss oder ob ich einen Listener an den JUnitCore-Runner anhängen kann. Oder wie könnte ich den Einstiegspunkt in den JUnitCore bekommen, der irgendwann passiert?
 

Wildcard

Top Contributor
Ich weiß es nicht, da ich es nie versucht habe, aber ich weiß, das man es herausfinden kann, indem man sich den Code des JUnit Launchers und der JUnit View anschaut.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Plugin JUnit Test Plattformprogrammierung 4
M Eclipse Plugin PreferencePage BooleanFieldEditor Plattformprogrammierung 1
F OSGi Plugin unter Eclipse arbeitet anders als wenn veröffentlicht Plattformprogrammierung 2
R Aktuelle Datei in Plugin bearbeiten Plattformprogrammierung 2
Farbtopf Tomcat durch anderes Plugin neustarten Plattformprogrammierung 0
Farbtopf Plugin Wunsch Plattformprogrammierung 0
J Charset-Problem nach Plugin-Export Plattformprogrammierung 1
J RCP File Path von selected File in Package Explorer für RCP Plugin Plattformprogrammierung 2
TheWhiteShadow RCP Problem mit Plugin Interaktion Plattformprogrammierung 6
R Einfaches Eclipse-Plugin-Beispiel funktioniert nicht Plattformprogrammierung 5
C plugin development environment eclipse Plattformprogrammierung 4
M Keybinding in Eclipse Plugin Plattformprogrammierung 3
M RCP Plugin Extension Point ist NULL Plattformprogrammierung 7
B Eclipse Plugin Einstellungsleiste Plattformprogrammierung 2
M Plugin - Property Page - Get IResource in View Plattformprogrammierung 4
O Eclipse Plugin - Einfachstes Problem, das es gibt. Plattformprogrammierung 2
L RCP Plugin Template erweitern Plattformprogrammierung 2
I Plugin Testen mit Fragment Project Plattformprogrammierung 2
3 Eclipse Editor Plugin selektiert Projekt nicht Plattformprogrammierung 10
A OSGi Plugin als Service exportieren und verwenden Plattformprogrammierung 12
D Plugin - Properties ohne PropertyPage speichern Plattformprogrammierung 11
T RCP Eclipse RCP: Wo/wann im Plugin ist workbench initialisiert? Plattformprogrammierung 14
V Eigenständige Applikation als Jar in Plugin einbinden Plattformprogrammierung 2
F [FileLocator] Verzeichnisse im Plugin Plattformprogrammierung 2
L RCP Plugin mit häufig benutzen third libraries Plattformprogrammierung 11
C Eclipse Plugin NoClassDefFoundError Plattformprogrammierung 4
M Eclipse Plugin Entwicklung - NoClassDefFoundError Plattformprogrammierung 10
C Eclipse Plugin Entwicklung: Editor für Flussdiagramme Plattformprogrammierung 6
F Ecilpse plugin und MWE Workflow: classpath Problem Plattformprogrammierung 12
M RCP Aktivierung eines CommandHandlers, Änderungen in der plugin.xml wirken sich nicht aus... Plattformprogrammierung 2
R Frage zum RCP Plugin-Mechanismus. Plattformprogrammierung 2
B RCP eigenes Eclipse Plugin wird nicht aufgelöst Plattformprogrammierung 7
P Wie bekomme ich ICompilationUnit aus dem event? bei Eclipse-Plugin Plattformprogrammierung 3
M RCP Resources Plugin nutzen und erweitern... aber wie? Plattformprogrammierung 6
X Datei in einem Eclipse Projekt über Plugin zugreifen Plattformprogrammierung 2
J Plugin wird nicht mit gestartet Plattformprogrammierung 4
D Team Plugin Erweiterung Plattformprogrammierung 4
L RCP Plugin als Bundle geklarieren? Plattformprogrammierung 3
hdi Frage zu Eclipse Plugin Development Plattformprogrammierung 12
D Canvas auf View in Eclipse PlugIn Plattformprogrammierung 3
M Eclipe RCP-Application oder Plugin Einstieg Plattformprogrammierung 6
O Problem mit relativen Pfaden in einem RCP-Plugin Plattformprogrammierung 5
hdi Plugin Icon wird nicht angezeigt Plattformprogrammierung 7
H Bibliotheken in Eclipse-Plugin-Projekt verwenden. Plattformprogrammierung 18
T Java Rcp Plugin laden Plattformprogrammierung 4
H Eclipse-Plugin erstellen Plattformprogrammierung 22
hdi Schwierigkeiten mit Plugin für EPF (Eclipse Process Framework) Plattformprogrammierung 3
S Plugin: View beim Button-Klick austauschen Plattformprogrammierung 7
M Fehler bei Plugin Export für eigene Target Platform Plattformprogrammierung 3
hdi Problem bei Eclipse Plugin Export Plattformprogrammierung 9
H Eclipse Plugin Dateihandling Plattformprogrammierung 2
S Plugin Abhängigkeiten/Circle References Plattformprogrammierung 6
G Plugin einbindung Plattformprogrammierung 9
T Erstellen eines "Ersetzten Plugin" aus GEF Plattformprogrammierung 2
S RCP Anwendung nicht weiterladen bei Exception in Plugin Plattformprogrammierung 2
A Eclipse Plugin Programmierung Dateien Refreshen Plattformprogrammierung 2
F Eclipse Plugin - Rückgabewert einer Methode Plattformprogrammierung 4
M Klasse aus PLugin /Fragment anhand von String laden Plattformprogrammierung 3
M Problem beim Zugriff auf Klasse aus Fragment in einem anderen Plugin Plattformprogrammierung 3
T Plugin eines bestehenden Editors hinzufügen Plattformprogrammierung 2
R Eclipse RCP - Plugin erstellen Plattformprogrammierung 2
lumo [Eclipse RCP] Plugin OHNE visuals Plattformprogrammierung 7
S In einem Plugin main einer anderen Klasse aufrufen Plattformprogrammierung 18
N Mit Plugin externe Dateien liefern Plattformprogrammierung 6
R Eclipse RCP vs. Plugin Entwicklung Plattformprogrammierung 5
K Einträge von einem PlugIn unterbinden. Plattformprogrammierung 6
B Eclipse plugin fuer dummys Plattformprogrammierung 11
P ViewPart dynamisch (Install/Deinstall Plugin) anzeigen in Perspektive? Plattformprogrammierung 12
N Eclipse RCP Plugin aus jar starten Plattformprogrammierung 7
M Eclipse Plugin Depedencies auslesen... Plattformprogrammierung 14
reibi Edclipse PlugIn-Entwicklung Plattformprogrammierung 21
N plugin als dependencie Plattformprogrammierung 3
N Benutzen von eigene Plugin im Plugin Plattformprogrammierung 36
N plugin dependencies innerhalb eines projects halten Plattformprogrammierung 11
R Wo/Wie Eclipse Plugin einhängen für Jar-Export? Plattformprogrammierung 14
Spot84 compareeditor in eclipsercp plugin verhält sich komisch Plattformprogrammierung 3
M Plugin wird nicht mehr geladen Plattformprogrammierung 3
M Dateien in PlugIn ansprechen Plattformprogrammierung 12
N einfaches Projekt in Plugin umwandeln Plattformprogrammierung 3
V [erledigt] Eclipse plugin startet nicht Plattformprogrammierung 3
M External JARs in Plugin Plattformprogrammierung 5
N preference page plugin Plattformprogrammierung 3
N programm in plugin umwandeln Plattformprogrammierung 3
N plugin architektur Plattformprogrammierung 15
S Eclipse-Plugin + Velocity + Files lesen Plattformprogrammierung 3
dzim immer noch Probleme bei PlugIn-Integrierung Plattformprogrammierung 2
C AST (Abstract Syntax Tree)-Generierung für Eclipse-Plugin Plattformprogrammierung 5
F RCP und JMF PlugIn Registrierung Plattformprogrammierung 6
R Plugin-Lokalisierung für Ganymede Plattformprogrammierung 12
G Plugin Export Plattformprogrammierung 4
V Javadoc an Eclipse Plugin anfügen Plattformprogrammierung 4
V JNI in Eclipse Plugin Plattformprogrammierung 17
F Eclipse plugin ausserhalb von Eclipse starten Plattformprogrammierung 4
S RCP mit canvas plugin ! Plattformprogrammierung 2
byte [ Eclipse ] NoClassDefFoundError bei neuem Plugin Plattformprogrammierung 4
rgubler Plugin mit eigenem ClassLoader Plattformprogrammierung 2
G neues project -> Plug-in project. Wie plugin starten? Plattformprogrammierung 6
G subMenue per PlugIn.xml Plattformprogrammierung 3
Linad RCP - Plugin mit Fragment Plattformprogrammierung 2
A Plugin konzepte: OSGI oder JPF? Plattformprogrammierung 5

Ähnliche Java Themen

Neue Themen


Oben