16 Stimmen

Automatisierung von Unit-Tests (Junit) für die Eclipse-Plugin-Entwicklung

Ich entwickle Eclipse-Plugins, und ich muss in der Lage sein, die Erstellung und Ausführung der Testsuite für jedes Plugin zu automatisieren. (Mit Junit)

Die Tests funktionieren in Eclipse, und ich kann die Plugins in das eigentliche Plugin und ein Fragment-Plugin für Unit-Tests aufteilen, wie beschrieben aquí , aquí und an einigen Stellen aquí .

Jeder der oben genannten Ansätze führt jedoch zu demselben Problem: Der Java-Ant-Task/Commandline-Befehl, der den Build auslöst oder den Test auslösen sollte, erzeugt keine beobachtbaren Nebeneffekte und gibt den Wert "13" zurück. Ich habe alles ausprobiert, was ich finden konnte, und ich habe einiges darüber gelernt, wie Eclipse startet (z.B.: seit v3.3 kann man startup.jar nicht mehr verwenden - es existiert nicht - aber man sollte org.eclipse.equinox.launcher ). Leider sind diese Informationen zwar offensichtlich notwendig, aber bei weitem nicht ausreichend.

Ich arbeite mit Eclipse 3.4, Junit 4.3.1 (das org.junit4-Bündel, aber ich würde viel lieber JUnit 4.4 verwenden. Siehe aquí .)

Meine Frage lautet also: Wie genau automatisieren Sie das Erstellen und Testen von Eclipse-Plugins?

Edita: Zur Klarstellung: Ich wollen so etwas wie Ant + Cruise Control zu verwenden, aber ich kann nicht einmal die Unit-Tests zum Laufen bringen überhaupt außerhalb von Eclipse. Ich sage "so etwas wie", weil es andere Technologien gibt, die das Gleiche erreichen, und ich bin nicht so wählerisch, eine funktionierende Lösung zu verwerfen, nur weil sie, sagen wir, Maven oder Buckminster verwendet, wenn diese Technologien die Sache wesentlich einfacher machen.

Bearbeiten2: Das oben erwähnte 'Java Result 13' scheint durch die Unfähigkeit, den Coretestrunner zu finden, verursacht zu werden. Aus dem Protokoll:

java.lang.RuntimeException: Application "org.eclipse.test.coretestapplication" could not be found in the registry. The applications available are: org.eclipse.equinox.app.error, com.rcpquickstart.helloworld.application.
    at org.eclipse.equinox.internal.app.EclipseAppContainer.startDefaultApp(EclipseAppContainer.java:242)
    at org.eclipse.equinox.internal.app.MainApplicationLauncher.run(MainApplicationLauncher.java:29)
    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:382)
    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:549)
    at org.eclipse.equinox.launcher.Main.basicRun(Main.java:504)
    at org.eclipse.equinox.launcher.Main.run(Main.java:1236)
    at org.eclipse.equinox.launcher.Main.main(Main.java:1212)
    at org.eclipse.core.launcher.Main.main(Main.java:30)

!ENTRY org.eclipse.osgi 2 0 2008-11-04 21:02:10.514
!MESSAGE The following is a complete list of bundles which are not resolved, see the prior log entry for the root cause if it exists:
!SUBENTRY 1 org.eclipse.osgi 2 0 2008-11-04 21:02:10.515
!MESSAGE Bundle update@plugins/org.eclipse.test_3.2.0/ [34] was not resolved.
!SUBENTRY 2 org.eclipse.test 2 0 2008-11-04 21:02:10.516
!MESSAGE Missing required bundle org.apache.ant_0.0.0.
!SUBENTRY 2 org.eclipse.test 2 0 2008-11-04 21:02:10.516
!MESSAGE Missing required bundle org.eclipse.ui.ide.application_0.0.0.
!SUBENTRY 1 org.eclipse.osgi 2 0 2008-11-04 21:02:10.518
!MESSAGE Bundle update@plugins/org.eclipse.ant.optional.junit_3.2.100.jar [60] was not resolved.
!SUBENTRY 2 org.eclipse.ant.optional.junit 2 0 2008-11-04 21:02:10.519
!MESSAGE Missing host org.apache.ant_[1.6.5,2.0.0).
!SUBENTRY 2 org.eclipse.ant.optional.junit 2 0 2008-11-04 21:02:10.519
!MESSAGE Missing required bundle org.eclipse.core.runtime.compatibility_0.0.0.

12voto

jamesh Punkte 19377

Ich habe gerade JUnit-Tests arbeiten als Teil der Headless Build für unsere RCP-Anwendung.

Ich habe diesen Artikel gefunden - Eclipse PDE Unit Tests mit Ant automatisieren unglaublich hilfreich. Es bietet Code und Ansätze für den Einstieg. Doch eine Reihe von Dingen, die ich entdeckt:

Über den Code des Artikels

  • Es gab nur ein Bündel, das getestet wurde (wir haben unseren Erstellungsprozess vom Code getrennt, indem wir Buckminster )
  • Es gab nur eine Testklasse.
  • beide waren im Build-Skript fest einkodiert

Über Eclipse PDE

  • el uitestapplication erfordert eine weitere testApplication . Verwendung von coretestapplication nicht.
  • da diese Anwendungen beide in Bundles enthalten sind, die von SWT abhängig sind. Dies ist ein Deal-Killer in den meisten Umständen, wenn auch nicht, wenn Ihr Build-Maschine ist ein Windows-Box. Ich würde gerne sehen, diese in Nicht-UI-Bundles aufgeteilt.

Ich fand, dass der zur Verfügung gestellte Code ein guter Ausgangspunkt war, aber eine Reihe der oben genannten Annahmen implizit in ihrer Implementierung hatte.

Nachdem ich diese Annahmen herausgefunden hatte, war die Arbeit relativ einfach zu erledigen.

Unsere neue und glänzende Einrichtung

  • buckminster baut die Bündel.
  • target kopiert die Bundles der Zielplattform, die org.eclipse.pde.runtime und org.eclipse.jdt.junit in ein "tester-eclipse-install". Dies sollte für Ihre Java Result 13 Problem.
  • die Testfragmente anhand des Arbeitsbereichs finden
  • den Fragment-Host anhand des Manifests zu finden
  • finden Sie die Testklassen, indem Sie sich das Projekt im Arbeitsbereich ansehen.
  • einschreiben PDETestListener geändert, um mehrere Testklassen zu behandeln
  • Rufen Sie die tester-eclipse-install mit den verschiedenen Testklassen auf.

Ich habe auch gelesen Build- und Testautomatisierung für Plug-Ins und Funktionen aber wir verwenden PDE-Build nicht direkt.

3voto

Gunjan Aggarwal Punkte 710

Für alle, die noch nach einer Möglichkeit suchen, Eclipse-Plugin-Tests außerhalb von Eclipse auszuführen, funktioniert der folgende Befehl für mich:

java -Xms40m -Xmx1024m -XX:MaxPermSize=512m -Dorg.eclipse.swt.browser.DefaultType=mozilla -Declipse.pde.launch=true -classpath C:\eclipse\eclipse-standard-luna-M2-win32-x86_64\eclipse\plugins/org.eclipse.equinox.launcher_1.3.0.v20130327-1440.jar org.eclipse.equinox.launcher.Main -port 22 -testLoaderClass org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader -loaderpluginname org.eclipse.jdt.junit4.runtime -classNames testpackage.testClass -application org.eclipse.pde.junit.runtime.uitestapplication -data C:\temp\log.temp -dev bin -consoleLog -testpluginname PluginName

-classpath sollte auf Eclipse launcher jar gesetzt werden. Die genaue Version für Ihr Eclipse erhalten Sie unter eclipse.ini Datei.

-className ist der Name der Testdatei des Junit-Plugins

-data wird auf eine temporäre Datei gesetzt.

-testpluginname ist der Name des Plugins, das Sie testen möchten.

2voto

liangzan Punkte 6674

Wenn Sie sich Ihre Ausnahme ansehen, heißt es, dass die Coretestapplication fehlt. Das Ant-Target befindet sich unter plugins/org.eclipse.test_3.1.0/library.xml:10

Dies ist eigentlich ein Problem der Abhängigkeit. Eclipse muss alle Plugins haben, um zu bauen.

Um es richtig zu konfigurieren, müssen Sie sich 2 Dateien ansehen.

  1. Die Produktdatei
  2. Die Datei feature.xml

Produkt

Vergewissern Sie sich, dass die Produktdatei alle Plugins enthält, die Sie benötigen.

Danach fügen Sie die Funktionen org.eclipse.rcp und org.eclipse.test hinzu

... Plugins sind oben ...

<features>
      <feature id="mock_feature" version="1.0.0"/>
      <feature id="mock_feature_test" version="1.0.0"/>
      <feature id="org.eclipse.rcp" version="3.2.0.v20060609m-SVDNgVrNoh-MeGG"/>
      <feature id="org.eclipse.test" version="3.2.0.v20060220------0842282442"/>
 </features>

Sie benötigen org.eclipse.test, um die Tests auszuführen, und org.eclipse.rcp, um eclipse zu starten, damit die Tests ausgeführt werden können.

Vergessen Sie nicht, useFeatures auf 'true' zu setzen.

<product name="mock" id="com.example.mock" application="com.example.mock.application" useFeatures="true">

feature.xml

Angenommen, Sie haben eine Funktion zum Testen, müssen Sie 2 zusätzliche Plugins hinzufügen.

... andere Plugins oben ...

<plugin
         id="org.apache.ant"
         download-size="0"
         install-size="0"
         version="0.0.0"/>

   <plugin
         id="org.eclipse.core.runtime.compatibility"
         download-size="0"
         install-size="0"
         version="0.0.0"
         unpack="false"/>

Die Tests benötigen org.apache.ant zum Ausführen der Tests und org.eclipse.core.runtime.compatibility zum Starten.

Ein weiteres Problem

Stellen Sie sicher, dass in Ihrem Ziel-Eclipse (die Kopie von Eclipse, die Sie zum Erstellen verwenden) nur eine Kopie jedes Plugins vorhanden ist. Wenn es zum Beispiel 2 Versionen von com.ibm.icu Plugins im Plugin-Ordner gibt, würde eclipse die neuere Version verwenden. Da das pde-Build-Plugin so konfiguriert ist, dass es eine bestimmte Version verwendet, würde sich eclipse beschweren, dass es das bestimmte Plugin nicht finden kann, obwohl es vorhanden ist.

Einige Gedanken

Der gesamte Prozess der Erstellung von eclipse könnte viel besser sein. In der Tat habe ich den Prozess meist durch Versuch und Irrtum. Die Dokumentation ist veraltet und spärlich. Die Fehlermeldungen sind nicht hilfreich. Sie lassen einen nur hilflos und frustriert zurück. Hoffentlich hilft dieser Beitrag einem anderen Programmierer, etwas Zeit zu sparen!

0voto

JesperE Punkte 61161

Wir verwenden die PDE-Bau-Skripte (siehe diese Frage ), und wir exportieren Ant-Build-Dateien für unsere Unit-Test-Plugins. Diese Ant-Build-Skripte werden dann von den PDE-Build-Skripten (customTargets.xml) mit der Ant-Task "ant" aufgerufen. Leider funktioniert dies nur mit JUnit3. Es soll einen JUnit4-Adapter für JUnit3 geben, damit man JUnit4-Tests von einem JUnit3-Test-Runner aus ausführen kann.

Wir werden wahrscheinlich auf etwas wie Maven umsteigen; die PDE-Build-Skripte sind nicht wirklich für das geeignet, was wir mit ihnen machen müssen.

0voto

AMilassin Punkte 1115

Als Alternative zu Ant habe ich gute Erfahrungen mit dem brandneuen Maven+Tycho mit Hudson gemacht. Tycho bietet vollständige Unterstützung für Osgi und Eclipse-Entwicklung in Maven. Es wird derzeit intensiv weiterentwickelt, aber die meisten Funktionen, die ich gebraucht habe, haben funktioniert. Es benötigt nur sehr wenig Konfiguration von Ihrer Seite, da es MANIFEST.MF Dateien parsen kann.

Wenn Sie etwas Erfahrung mit Maven haben, ist es nicht sehr schwer, mit ihm zu arbeiten. Hudson ist etwas problematischer, da die Unterstützung für Maven 3 fehlt. (die Entwicklungsversion von Maven 3 wird von Tycho verwendet)

Links für den Anfang:

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X