Zum Inhalt springen

Probleme beim Implementieren / Ausführen von jUnit 5-Test Suites


DITTY

Empfohlene Beiträge

Hallo Zusammen,

ich habe eine Reihe von jUnit 4-Tests (@RunWith(JUnitPlatform.class)) und neuerdings u.a. auch erste einfache jUnit 5-Tests. Einzeln lassen sich auch alle erfolgreich ausführen.
Nun möchte ich mir gerne aus meinen Testklassen einzelne Test Suiten zusammenstellen:

Hierzu eine jUnit 5-Test-Suite (die aber auch die bisherigen jUnit 4-Testklassen ausführen können sollte):
package TestSuite.Dummy;
 

import org.junit.platform.runner.JUnitPlatform;
import org.junit.platform.suite.api.IncludeEngines;
import org.junit.platform.suite.api.SelectClasses;
import org.junit.platform.suite.api.SelectPackages;
import org.junit.platform.suite.api.SuiteDisplayName;
import org.junit.runner.RunWith;
import Main.Demo.*;

@RunWith(JUnitPlatform.class)
@SuiteDisplayName("JUnit 4+5 Suite Demos")
@IncludeEngines({"junit-jupiter", "junit-vintage"})
@SelectPackages({"Main.Demo"})
@SelectClasses({
    T5.class,
    T4.class,
    T2.class,     
    T3.class,
    T1.class
})
public class AllTests
{
    

}

Hierzu eine jUnit 4-TestSuite (die auch jUnit 5-Tests ausführen können sollte):

package TestSuite.Dummy;

import org.junit.platform.runner.JUnitPlatform;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;

import Main.Demo.T1;
import Main.Demo.T2;
import Main.Demo.T3;
import Main.Demo.T4;
import Main.Demo.T5;

@RunWith(Suite.class)
//@RunWith(JUnitPlatform.class)
@SuiteClasses({
    T2.class,
    T1.class,
    T3.class,
    T4.class,
    T5.class
})
public class TestSuite_Dummy_01
{

}

 

Problem ist nun, dass ich mit meinem Eclipse 4.7.2 (Oxygen.2 mit Java 9.0.4 und jUnit 5) es einfach nicht hinkriege, dass die jUnit 5-Tests im jUnit 5-Modus (Eclipse: Rechtsklick > Run As > RunConfigurations... > Test runner: JUnit 5) ausgeführt werden:

2018-03-05_18h12_29.thumb.png.33ff84c377470905a72560bd5159757a.png


Weder die obige jUnit 5-TestSuite als auch die untere jUnit 4-TestSuite führen unter Angabe des JUnitPlatform.class-Runners (im Quellcode die Annotation @RunWith) über die TestSuite keine Tests aus. Die jUnit 5-TestSuite findet laut Fehlermeldung "keine jUnit 5-Tests" (T4, T5) und auch die vorhandenen jUnit 4-Tests (T1, T2, T3) werden nicht mit ausgeführt:

2018-03-05_17h50_21.thumb.png.3e1ace7c574859f86c85cc7682a15715.png
Das gleiche Verhalten zeigt sich auch bei der jUnit 4-TestSuite, wenn ich via  @RunWith-Annotation den JUnitPlatform.class angebe (anstatt den Suite.class-Runner).

Erst, wenn ich den jUnit 4-Modus (Eclipse: Rechtsklick > Run As > RunConfigurations... > Test runner: JUnit 4) einstelle und den Suite.class-Runner im Quelltext verwende, führt zumindest die jUnit 4-TestSuite sowohl die jUnit 4- als auch die jUnit 5-Testklassen aus:

2018-03-05_18h26_51.thumb.png.6105d42c916786bb856143ca7aa42480.png

Bei der jUnit 5-TestSuite regt sich hingegen nichts bzw. er führt zwar den Test Run der TestSuite aus, aber keinerlei jUnit 4- und 5-Tests:

2018-03-05_18h42_07.thumb.png.85df3eb262ddad239bbd85b31ae6ac37.png

Nun zu meinen Fragen/Problemen, wo ich Euch um Rat / Hilfe oder gar Lösungsvorschläge bitten möchte, da ich hier leider nicht weiter weiß:

1.)
Es muss doch möglich sein, alles - jedoch insb. jUnit 5-Tests - im jUnit 5-Modus (Eclipse: Rechtsklick > Run As > RunConfigurations... > Test runner: JUnit 5) ausführen zu lassen? Für jUnit 4-Tests kommt schließlich junit-vintage und JUnitPlatform.class-Runner zum Einsatz, ansonsten jUnit Jupiter für die 5er.
Was mache ich falsch? Im Internet finde ich leider nichts passendes.

Gerne möchte ich von den jUnit 4-TestSuites weg. Aktuell scheint diese jedoch die einzige zu sein, die alles korrekt ausführt, wenn ich im jUnit 4-Modus ausführen lasse. Aber wie gesagt, mein Ziel sollen reine jUnit 5-TestSuites mit dem JUnitPlatform.class-Runner und den neuen Annotationen (@SuiteDisplayName, @IncludeEngines, @SelectPackages, @SelectClasses) wie oben zu sehen sein und nicht die alten jUnit 4-TestSuites. Ebenso möchte ich alle meine jUnit 4-Testklassen zu jUnit 5 migrieren. Aus meiner Sicht machen dann Runs im jUnit 4-Modus einfach keinen Sinn mehr.

2.) Gemeinsame Daten zwischen den Testklassen:
Aktuell missbrauche ich aufgrund der nicht funktionierenden TestSuiten klassische jUnit 5-Tests als TestSuite-Container, mit deren Hilfe ich die anderen Testklassen bzw. der darin befindlichen Test-Funktionen ausführen lasse.
Konkret geht es um SeleniumRC-Tests. Hierzu habe ich eine eigene Klasse geschrieben, die mir meine komplette Testumgebung erstellt, inkl. erzeugen des WebDrivers.
Bisher musste ich in jeder Testklasse ein eigenes Objekt (QAE) dieser Klasse erzeugen lassen. Dadurch kann ich zwar Browsertests erfolgreich ausführen, die jedoch voneinander unabhängig laufen, weil jede Testklasse ein eigenes QAE-Objekt instanziiert. Strukturell ist meine Testklassen-Hierarchie jedoch so nicht gedacht und auch möchte ich nicht immer für jeden zu testenden Use Case alle möglichen Testfunktionen aus einer Testklasse ausführen lassen (z.B. für einen Checkout-Test - Testklasse: Bestellung - im eingeloggten Zustand, ohne die MyAccount-Seiten - zugehörig zu meiner Testklasse: Login - mit testen zu müssen).

Gibt es Möglichkeiten, dass sich mehrere Testklassen bei jedem Run ein gemeinsames (QAE)-Objekt teilen?
Und ist es möglich, dass sich Testklassen einander Daten austauschen (kommunizieren) können?
Wenn ja (jeweils), wie?

3.) Interaktions- und / oder Steuerungsmöglichkeiten in TestSuites:
Kann man bei klassischen TestSuites wie oben Daten / Objekte an die aufzurufenden Testklassen übergeben? Dies würde zumindest 2.) lösen, wenn die TestSuites denn funktionieren würden. Aber angenommen sie funktionieren irgendwann mal, wenn ja, wie kann ich in einer TestSuite Objekte an Testklassen überreichen?
Und kann man auch steuernd in den Run einer TestSuite eingreifen? Bisher gebe ich in der Testsuite nur die Testklassen an, die nacheinander abgearbeitet werden sollen. Ich würde gerne bestimmte Testklassen und sogar einzelne Funktionen daraus vom weiteren Testrun JIT ausschließen wollen, wenn eine bestimmte vorhergehende Testklasse bzw. einzelne Testfunktion fehlschlug.

Habt besten Dank schonmal im Voraus für Eure Hilfen.

VG

DITTY

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 1 Jahr später...
Am 5.3.2018 um 19:44 schrieb DITTY:

Gibt es Möglichkeiten, dass sich mehrere Testklassen bei jedem Run ein gemeinsames (QAE)-Objekt teilen?
Und ist es möglich, dass sich Testklassen einander Daten austauschen (kommunizieren) können?
Wenn ja (jeweils), wie?

Ja. Mache ich auch bei Selenium. Eine Klasse die den Driver handelt, abbaut etc. Muss ich morgen Mal nachschauen wie ich das implementiert habe. Wobei ich nicht genau weiß was du unter jedem Run verstehst. Du meinst eine TestSuite mit x Tests hat ein und die selbe Instanz vom WebDriver?

Hmm. Warum sollen die Testklassen das tun? Welchen Zweck oder Sinn soll das haben? Eventuell verstehe ich deinen Ansatz nicht aber Tests sollten eigentlich unabhängig voneinander laufen. 

Am 5.3.2018 um 19:44 schrieb DITTY:

Kann man bei klassischen TestSuites wie oben Daten / Objekte an die aufzurufenden Testklassen übergeben? Dies würde zumindest 2.) lösen, wenn die TestSuites denn funktionieren würden. Aber angenommen sie funktionieren irgendwann mal, wenn ja, wie kann ich in einer TestSuite Objekte an Testklassen überreichen?

Warum möchtest du sowas tun? Vor allem wir möchtest du die an die Testklassen übergeben? Konstruktor? Was macht die Testklassen wenn die Werte nicht übergeben worden sind? Wie laufen die Testklassen ohne expliziten Aufruf mit übergeben werten? Was wenn man nur einen Test einer Klasse lassen laufen will? Würde ich jetzt nicht empfehlen. 

Du kannst auf jeden Fall eine Test Methode schreiben und diese mit unterschiedlichen Parametern aufrufen lassen. Beispielsweise: https://www.baeldung.com/parameterized-tests-junit-5

Oder du schaust dir @RunWith(Parameterizd.class) Mal an. Die Werte dann über eine Util Klasse (ich hasse Klassen mit solch einem Namen. Mir fällt auf die schnelle aber nichts ein :D) bereitstellen und im Test auslesen. 

Empfinden ich vom Design aber nicht so schön

 

Bearbeitet von r4phi
Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...