يتم تشغيل اختبارات ANT PDE مع JUNIT4
سؤال
أحاول أتمتة اختبارات PDE ، باستخدام مكالمات PDE-Maven-Plugin أو Maven أو مهام ANT. اتبعت تعليمات من المقالة أتمتة اختبارات وحدة PDE Eclipse باستخدام ANT لإنشاء test.xml
فشلت الاختبارات ، أولاً لأنه لم يتم العثور على اختبارات
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)
لقد بحثت ووجدت أنني يجب أن أستخدمها JUnit4Adapter
, ، لكن فعل ذلك حصلت ClassCastException
, ، هذا هو تتبع المكدس
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)
ها هي تبعيات البرنامج المساعد الخاص بي:
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"
وفئة الاختبار
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);
}
}
أي فكرة عن كيفية إصلاح؟
المحلول
يتم إصلاحه عن طريق إضافة الأسطر التالية عند استدعاء org.eclipse.equinox.launcher.main:
<arg line="-testLoaderClass org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader"/>
<arg line="-loaderpluginname org.eclipse.jdt.junit4.runtime"/>
ها هي مهمة Java ANT الكاملة:
<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>
نصائح أخرى
واجهت نفس المشكلة مثل Noura وجربت الإصلاح الذي قدموه ، والذي ، للأسف ، لم يحل سوى جزء من المشكلة. بدلا من رمي الذكرى المذكورة أعلاه ClassCastException
, ، أنا أخذت junit4 java.lang.Exception: No runnable methods
, ، على الرغم من أن اختباراتي الـ 29 يتم شرحها بعناية @Test
.
بعد بضع ساعات من البحث (والعثور فقط على الأخطاء القديمة حقًا عندما كانت Junit 4 جديدة) وتجربة (هذا بعد ذلك لم أساعد أيضًا) ، اكتشفت أن الجزء الثاني من الإصلاح الخاص بي كان مرتبطًا بمسار الفصل.
كنت قد حددت بلدي classpath (الذي كان يستخدم لإطلاق PDETestResultsCollector
, PDETestPortLocator
والمكون الإضافي للاختبار) ليكون:
<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>
وأطلقه مثل:
<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>
كما اتضح ، وجود build/my-bundled-jar-with-tests.jar
على classpath الخلط بين عداء الاختبار ، لذلك اضطررت إلى صنع جرة جديدة تحتوي فقط على ملفات الفصل PDETestListener
, PDETestPortLocator
و PDETestResultsCollector
(تسمى pde-test.jar). كان طريقي الثابت:
<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 -->
وتم العثور على جميع الاختبارات 29 وركضت.