Ant PDE Exécuter les tests avec junit4
Question
Je suis en train d'automatiser les tests de prélivraison, en utilisant pde-maven-plugin, appels Maven ou des tâches de fourmi. J'ai suivi les instructions de l'article Automatiser Eclipse PDE Tests unitaires à l'aide Ant pour créer le test.xml
Tests ont échoué, d'abord parce que Aucun test trouvés
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)
J'ai cherché et trouvé que je devrais utiliser JUnit4Adapter
, mais cela que je suis arrivé ClassCastException
, voici la trace de la pile
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)
Voici mes dépendances de plugin:
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"
et la classe de test
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);
}
}
une idée comment résoudre?
La solution
Il est fixé en ajoutant lignes suivantes lors de l'appel org.eclipse.equinox.launcher.Main:
<arg line="-testLoaderClass org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader"/>
<arg line="-loaderpluginname org.eclipse.jdt.junit4.runtime"/>
Voici la pleine tâche ant java:
<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>
Autres conseils
J'ai eu le même problème que Noura et essayé le correctif ils ont fourni, qui, malheureusement, ne résout une partie du problème. Au lieu de jeter le ClassCastException
mentionné ci-dessus, je me suis junit4 java.lang.Exception: No runnable methods
, malgré mes 29 essais soigneusement annotés avec @Test
.
Après quelques heures de recherche (et seulement trouver des bugs vraiment vieux en arrière quand JUnit 4 était nouveau) et l'expérimentation ( ce SO poster n'a pas aidé non plus), j'ai découvert la deuxième partie de ma solution était liée au chemin de classe.
J'avais défini mon chemin de classe (qui a été utilisé pour lancer PDETestResultsCollector
, PDETestPortLocator
et le plug-in de test) être:
<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>
et a lancé comme:
<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>
Il se trouve que, ayant build/my-bundled-jar-with-tests.jar
sur le classpath confondu le coureur de test, donc je devais faire un nouveau pot qui contenait seulement des fichiers de classe pour PDETestListener
, PDETestPortLocator
et PDETestResultsCollector
(appelé pde-test.jar). Mon parcours fixe était:
<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 -->
Et les 29 tests ont été trouvés et ont couru.