Ant PDE-Tests Run mit JUnit4
Frage
Ich versuche pde Tests unter Verwendung von PDE-maven-plugin, maven Anrufen oder Ameise Aufgaben zu automatisieren. Ich folgte Anweisungen aus dem Artikel Automatisieren von Eclipse-PDE-Unit-Tests unter Verwendung von Ant zu erstellen, um die test.xml
Tests fehlgeschlagen ist, erstens, weil keine gefunden Testet
junit.framework.AssertionFailedError: junit.framework.AssertionFailedError: No tests found in com.example.TestSuite
at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
Ich suchte und fand, dass ich JUnit4Adapter
verwenden sollte, aber zu tun, dass ich bekam ClassCastException
, hier ist der Stack-Trace
java.lang.ClassCastException: junit.framework.JUnit4TestAdapter cannot be cast to junit.framework.Test
at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestLoader.getTest(JUnit3TestLoader.java:108)
at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestLoader.loadTests(JUnit3TestLoader.java:59)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:452)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.pde.internal.junit.runtime.RemotePluginTestRunner.main(RemotePluginTestRunner.java:62)
at org.eclipse.pde.internal.junit.runtime.CoreTestApplication.run(CoreTestApplication.java:23)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.eclipse.equinox.internal.app.EclipseAppContainer.callMethodWithException(EclipseAppContainer.java:574)
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:368)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:559)
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:514)
at org.eclipse.equinox.launcher.Main.run(Main.java:1311)
at org.eclipse.equinox.launcher.Main.main(Main.java:1287)
Hier ist meine Plugin Abhängigkeiten:
Require-Bundle:
org.eclipse.ui,
org.eclipse.core.runtime,
org.eclipse.jdt.core;bundle-version="3.4.2",
org.eclipse.jdt.launching;bundle-version="3.4.1",
org.eclipse.core.resources;bundle-version="3.4.1",
org.apache.xerces;bundle-version="2.9.0",
org.junit4;bundle-version="4.3.1"
und die Testklasse
package com.example;
import junit.framework.JUnit4TestAdapter;
import junit.framework.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;
@RunWith(Suite.class)
@SuiteClasses( { SimpleTests.class})
public class TestSuite {
public static Test suite() {
return new JUnit4TestAdapter(TestSuite.class);
}
}
eine Idee, wie sie beheben?
Lösung
Es ist festgelegt durch folgende Zeilen hinzufügen, wenn org.eclipse.equinox.launcher.Main Aufruf:
<arg line="-testLoaderClass org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader"/>
<arg line="-loaderpluginname org.eclipse.jdt.junit4.runtime"/>
Hier ist die vollständige Java-Ant-Task:
<java dir="${plugin.dir}"
fork="yes"
classname="org.eclipse.equinox.launcher.Main"
classpathref="equinox.launcher.class.path"
jvm="${jvm}">
<arg line="-application ${application}"/>
<arg line="-data ${test.reports.dir}/output/ws"/>
<arg line="-port ${pde.test.port}"/>
<arg line="-dev bin -clean -debug"/>
<arg line="-testpluginname ${plugin.name}"/>
<arg line="-testLoaderClass org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader"/>
<arg line="-loaderpluginname org.eclipse.jdt.junit4.runtime"/>
<arg line="-classnames ${test.classes.list}"/>
<jvmarg line="${vmargs}"/>
</java>
Andere Tipps
Ich hatte das gleiche Problem wie Noura und versuchte, die fix sie zur Verfügung gestellt, die leider nur einen Teil des Problems gelöst. Statt der oben erwähnten ClassCastException
werfen, ich habe junit4 java.lang.Exception: No runnable methods
, trotz meiner 29 Tests mit @Test
sorgfältig kommentierten werden.
Nach einigen Stunden des Suchens (und nur zu finden, wirklich alte Fehler zurück, wenn JUnit 4 war neu) und Experimentieren ( diese sO Post hat entweder keine Hilfe), habe ich den zweiten Teil meines fix entdeckt wurde dem Klassenpfad verwandt.
Ich hatte meinen Classpath definiert (die Einführung PDETestResultsCollector
verwendet wurde, PDETestPortLocator
und die Test-Plugin) zu sein:
<path id="test.class.path">
<pathelement location="build/my-bundled-jar-with-tests.jar" /> <!-- contains my app and the PDE* helper classes -->
<fileset dir="${test.eclipse.dir}/plugins">
<include name="org.junit_4.*/**/junit.jar" />
<include name="org.hamcrest.core_*.jar" />
<include name="org.apache.ant_*/**/ant.jar" />
<include name="org.apache.ant_*/**/ant-junit.jar" />
<include name="org.eclipse.jdt.core_*.jar" />
<include name="org.eclipse.jdt.junit_*.jar" />
<include name="org.eclipse.jdt.junit.core_*.jar" />
<include name="org.eclipse.equinox.common_*.jar" />
<include name="org.eclipse.debug.core_*.jar" />
<include name="org.eclipse.osgi_*.jar" />
<include name="org.eclipse.core.resources_*.jar" />
<include name="org.eclipse.core.runtime_*.jar" />
<include name="org.eclipse.core.jobs_*.jar" />
<include name="org.eclipse.ui.workbench_*.jar" />
<include name="org.eclipse.swt_*.jar" />
<include name="org.eclipse.equinox.preferences_*.jar" />
<include name="org.eclipse.equinox.launcher_*.jar" />
</fileset>
</path>
und leitete sie wie:
<java classpathref="test.class.path" classname="org.eclipse.equinox.launcher.Main" fork="yes" dir="${basedir}" >
<arg line="-application org.eclipse.pde.junit.runtime.uitestapplication" />
<arg line="-data reports/output/ws" />
<arg line="-dev bin -clean -port ${pde.test.port}" />
<arg line="-testApplication org.eclipse.ui.ide.workbench" />
<arg line="-testpluginname my-bundled-plugin-with-tests" />
<arg line="-testLoaderClass org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader" />
<arg line="-loaderpluginname org.eclipse.jdt.junit4.runtime" />
<arg line="-classnames TestAllMyCode" />
</java>
Wie sich herausstellt, auf dem Classpath build/my-bundled-jar-with-tests.jar
mit verwirrt den Test Läufer, so dass ich ein neues Glas zu machen hatte, die nur Klassendateien für PDETestListener
, PDETestPortLocator
und PDETestResultsCollector
(genannt pde-test.jar) enthalten ist. Mein fester Pfad war:
<path id="test.class.path">
<pathelement location="build/pde-test.jar" /> <!-- fixed the problem -->
<fileset dir="${test.eclipse.dir}/plugins">
<include name="org.junit_4.*/**/junit.jar" />
<include name="org.hamcrest.core_*.jar" />
... <!-- same as before -->
Und alle 29 Tests wurden gefunden und läuft davon.