Integrationstests in Java ohne Arquillian?

Guten Morgen,

zurzeit arbeite ich im Bereich der Integrationstests noch mit Arquillian. Diese führen jedoch bei komplexeren Konstruktionen häufig zu Problemen. Daher wollte ich mich mal informieren, ob ihr andere Wege kennt, vernünftig Integration Tests für REST-Schnittstellen zu schreiben?
Ich habe in einem Projekt zum Beispiel REST Assured im Einsatz, was jedoch gegen einen Service auf einem anderen Server testet.
Da wäre ja Docker sicherlich interessant, jedoch müsste ich Maven dazu bringen, den Docker-Container einmal vor dem Test hochzufahren und danach wieder zu beenden – ich bin mir nicht ganz sicher, ob das mit Maven funktioniert, ohne irgendwelche Hacks oder ein eigenes Plugin.

Was meint ihr? Habt ihr noch andere Optionen für Integrationstests die ich lokal laufen lassen kann?

Besten Dank!

PS: Ich habe schon im Netz gesucht, aber da komme ich fast immer wieder zur Arquillian.

1 Like

Du könntest dir mal Testcontainers anschauen. Das sorgt dafür, dass du in deinen Test Dockercontainer starten und am Ende wieder runterfahren kannst.

2 Likes

Oh ja, sehr guter Punkt. Die hatte ich ganz vergessen. :slight_smile:

Hi,

in der pre-integration-test Phase den Docker container hochfahren (z.B. Fabric-IO) und in der post-integration-test Phase eben wieder runter fahren und in der integration-test Phase via Integrations Tests (maven-failsafe-plugin) eben den eigentlichen Test ?..

Testcontainers ist selbstverständlich auch eine Möglichkeit…

Gruß
Karl Heinz

Habe ich vor Testcontainers auch so gemacht. Das Problem ist dabei, dass der Container nicht sauber abgeräumt wird, wenn es Probleme gibt. Dafür gibt es bei Testcontainers den Container ryuk, welcher alles aufräumt, wenn der Test nicht mehr läuft.

Hast du Beispiele, in denen das passiert? failsafe soll doch grad dafür sorgen, dass immer sauber aufgeräumt wird

failsafe raeumt keine Container auf, es startet auch keine
um das ganze idempotent zu machen, kann es noetig sein in pre-integration vorhandene Container eines vorherigen runs aufzuraeumen bevor man sie startet

Starte einfach die entsprechende Maven-Phase und kill den Prozess. Der Docker-Container läuft dann noch. Wie soll sich ein gestoppter Prozess auch darum kümmern? Dafür gibt es dann z.B. ryuk. Der läuft unabhängig mit, stellt fest, dass der entsprechende Container nicht mehr benötigt wird, räumt diesen ab und dann sich.

Wobei es nicht unbedingt trivial ist, den entsprechenden “vorhandenen Container” zu finden.