2009-11-21 10 views
1

J'essaie d'automatiser les tests pde, en utilisant pde-maven-plugin, les appels maven ou les tâches ant. J'ai suivi les instructions de l'article Automating Eclipse PDE Unit Tests using Ant pour créer le test.xmlTests Ant PDE exécutés avec JUnit4

l'échec des tests, d'abord parce que Aucun test Found

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 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); 
    } 

} 

toute idée comment résoudre?

Répondre

3

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"/> 

est ici 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>  
+0

Un examen attentif de la trace de pile révèle pourquoi cela aide. Notez que l'exception provient de 'org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestLoader.getTest (JUnit3TestLoader.java:108)', en mettant l'accent sur la partie ** junit.runner.junit3 **. L'ajout des deux lignes d'argument demande que JUnit4Launcher soit utilisé à la place de JUnit3. – KevinL

0

J'ai eu le même problème que Noura et essayé la solution qu'ils ont fourni, qui, malheureusement, seulement résolu une partie du problème. Au lieu de lancer le ClassCastException ci-dessus, j'ai obtenu junit4 java.lang.Exception: No runnable methods, malgré mes 29 tests soigneusement annotés avec @Test. Après quelques heures de recherche (et seulement la découverte de bugs vraiment anciens quand JUnit 4 était nouveau) et l'expérimentation (this SO post n'a pas aidé non plus), j'ai découvert que la deuxième partie de mon correctif était liée au chemin de la classe.

j'avais défini mon chemin de classe (qui a été utilisé pour lancer PDETestResultsCollector, PDETestPortLocator et le plug-in de test) soit:

<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> 

Comme il se trouve, avoir build/my-bundled-jar-with-tests.jar sur le classpath confondu le coureur de test, donc j'ai dû faire un nouveau pot qui contenait juste des fichiers de classe pour PDETestListener, PDETestPortLocator et PDETestResultsCollector (appelé pde-test.jar). Mon chemin 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 tous les 29 tests ont été trouvés et courus.