/ / Starten Sie Jetty programmgesteuert im Debug-Modus in einem Junit4-Kontext - Maven, Junit, Jetty

Starten Sie Jetty programmatisch im Debug-Modus in einem Junit4-Kontext - Maven, Junit, Jetty

Wir haben für alle unsere Tests eine Methode, mit der ein Jetty Server gestartet wird, um die Web-Services zu veröffentlichen und zu testen:

@Before
public void startJettyAndloadWSDL() throws Exception {
String port = System.getProperty("jetty.port");
server = new Server(Integer.valueOf(port));
WebAppContext webapp = new WebAppContext();
webapp.setSecurityHandler(getSecurityHandler()); // this is a local function in my test
webapp.setContextPath("/");
webapp.setWar(System.getProperty("jetty.war"));
server.setHandler(webapp);
// Is there an option somewhere to say "start Jetty in Debug mode"?
server.start();
service = new MyServiceToTest(new URL("http://127.0.0.1:" + port + "/WS/MyServiceToTest/1?WSDL"),
new QName("urn:myservicetotest.services.mycompany.com/1", "MyService")).getMyServicePort();
}

Gibt es eine Möglichkeit, Jetty zu sagen, um im Debug-Modus zu starten, um einen Haltepunkt in Eclipse zu setzen?

Der Test wird mit Maven extern ausgeführtEclipse, dann ist es vielleicht besser, in diesem Fall ein Remote-Debugging durchzuführen? Wir wollen keine große Verbindung zu Eclipse haben, deshalb starten wir in allen JUnits-Tests den Steg.

Antworten:

2 für die Antwort № 1

Wir können den Embedded Jetty nicht ändern, da die kontinuierliche Integration dies erfordert und wir keine zwei Versionen der JUnit-Tests (automatisiert oder manuell) beibehalten werden.

Die Lösungen, die ich gefunden habe, sind:

1 - Von maven mit Remote-Debugging:

Starten Sie den Test mit dem folgenden Befehl (von Maven Site):

mvn -Dmaven.surefire.debug="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -Xnoagent -Djava.compiler=NONE" test

Starten Sie dann den Eclipse-Remote-Debug für Port8000. Diese Lösung ist jedoch nicht sehr schlau: Da der Anlegesteg eingebettet ist, muss ich das Remote-Debugging von Eclipse manuell starten. Wenn ich Maven über die Befehlszeile starte, muss es etwas synchronisiert werden.

Am besten verwenden wir schließlich:

2 - Von Eclipse Junit

Ich führe einfach den Junit-Test von Eclipse im Debug-Modus aus und das ist einfach perfekt: Die Jetty-Startmethode benötigt keine Option debug mode da es die JVM ist, die im Laufzeit- oder Debugmodus gestartet wird.

Ich brauche den WTP-Steg nicht in der Eclipse, ich musste nur die Eigenschaften im Test definieren:

${jetty.port}

und der Haltepunkt hält an, wo ich will.

Die einzige Konfiguration ist in Eclipse und wird unseren Code nicht ändern.


1 für die Antwort № 2

Es gibt im Allgemeinen zwei Kontexte, in denen Tests durchgeführt werdenFühren Sie 1) als Teil eines Builds aus, um sicherzustellen, dass das neue Build keine Tests durchläuft, und 2) bei der Entwicklung, um sicherzustellen, dass ein kleiner Funktionsumfang funktioniert, bevor Sie fortfahren.

Ich denke, das Problem hier ist, dass Ihre Umgebung versucht, beide Szenarien gleichzeitig zu behandeln, wenn Ihre Tests Jetty starten, und ich bin nicht sicher, ob dies auf saubere Weise möglich ist.

Ich denke, Sie wollen den Anlegesteg entfernenLassen Sie maven aus Ihrem Testcode heraus mit Jetty in der Phase vor der Integration beginnen und führen Sie Tests aus, für die in der Integrationstestphase ein Jetty erforderlich ist. Dies ist eine sehr verbreitete Methode zum Ausführen von Tests, für die ein Webserver erforderlich ist.

Starten Sie in Context 2 einen eingebetteten Jetty in Eclipse im Debug-Modus und führen Sie dann den Test von Eclipse aus statt von Maven aus.