Ich versuche, einige parametrisierte Testsuiten einzurichten, leider bisher ohne Glück. Ich habe zwei Parameter, und ich möchte mehrere Testfälle (sie sind in verschiedenen Klassen) mit allen möglichen Kombinationen ausführen. Ich habe versucht, es mit JUnit4 zu machen, aber ich kann es nicht richtig einrichten. Dies wäre meine Grundidee:
TestSuite1.class
richtet einen Parametersatz ein und startet TestSuite2.class
. TestSuite2.class
richtet die zweite Gruppe von Parametern ein und startet dann die eigentlichen Tests, die beide Parameter verwenden. Inzwischen scheint es nicht möglich, sowohl Suite.class
als auch Parameterized.class
in der RunWith
Annotation gleichzeitig einzurichten (laut google, Parameterized
extends Suite
, bekomme ich normalerweise "no runnable" Methode gefunden "Nachricht, wenn ich verwende."
So sieht mein Code grundsätzlich aus:
TestSuite1.class:
%Vor% TestSuite2.class
sieht genauso aus wie TestSuite1.class
, außer dass ich TestCase1.class
der Suite statt TestSuite2
hinzugefügt habe und eine andere Variable in Params
festlegt.
TestCase1.class:
%Vor%Ich bin offen für alle Ideen - auch zum Beispiel mit TestNG. Ich habe es auch versucht (obwohl heute das erste Mal ich es gesehen habe), aber wie ich bemerkte, sind die Suiten ein bisschen anders als in JUnit. Ich würde es vorziehen, XML-Dateien vor dem Testen nicht einzurichten, möchte ich alle programmgesteuert lösen.
Ist das, was ich versuche zu erreichen, mit jedem Rahmen möglich?
Update: Mit TestNG habe ich den folgenden Code:
Start.class:
%Vor%Params.class:
%Vor%FirstTest.class:
%Vor% SecondTest.class
ist dasselbe wie FirstTest.class
. Wenn ich das starte, läuft FirstTest
4 mal, dann läuft SecondTest
4 mal. Ich möchte FirstTest
einmal und SecondTest
einmal auch mit dem ersten Satz der Parameter laufen lassen. Dann möchte ich FirstTest
und SecondTest
einmal ausführen, mit dem zweiten Parametersatz usw.
Ich habe versucht setPreserveOrder (true) zu setzen und habe auch alle setParallel-Optionen ausprobiert. Auf diese Weise sind die Ergebnisse jedoch in zufälliger Reihenfolge.
(Es wäre ein Selentest. Ich bin mir bewusst, dass Tests nicht voneinander abhängen sollten, aber trotzdem wäre es mein gewünschter Weg dafür)
Also, so weit ich es verstehe, wollen Sie einen Test mit einer Reihe von Parametersätzen durchführen. Das ist mit JUnit möglich und deshalb gibt die Methode, die mit @Parameters annotiert wurde, eine Sammlung von Arrays zurück (im Allgemeinen eine Menge von Sets).
Sehen Sie sich dieses Beispiel an:
%Vor%Bearbeiten: Wenn Sie Parameter zwischen mehreren Tests teilen möchten, können Sie in Ihren Testfällen eine Abstraktion verwenden.
%Vor%Aber der beste Weg, es zu tun, denke ich wäre, TestNGs Datenanbieter zu verwenden. Sehen Sie sich das Beispiel in Abschnitt 5.6.2 und die Verwendung von statischen Datenprovidern an Ссылка
Um das Ziel zu erreichen, alle Testfälle mit denselben Parametern in sequentieller Reihenfolge auszuführen, benötigen Sie ein anderes Runner
, da dieses Verhalten in dieser Klasse enthalten ist. Sie haben Glück, denn dies ist im JUnit Toolbox-Projekt mit der ParallelParameterized
klasse!
Obwohl Parameterized
% Suite
erweitert, verhält es sich völlig anders - in Missachtung des Liskow-Substitutionsprinzips . Dies liegt daran, dass normalerweise der Konstruktor Suite(Class<?>, RunnerBuilder)
die Annotation @SuiteClasses
verarbeitet. Aber Parameterized(Class<?>)
ersetzt dieses Verhalten durch eine Verarbeitung von @Parameters
.
Wenn Sie das Verhalten von Suite
und Parameterized
kombinieren möchten, müssen Sie außerhalb von JUnit 4 suchen. Sie könnten Ihre eigene Runner
wie Adam Hawkes implementieren, die bereits in einem anderen Beitrag hier erwähnt wurde.
Ich habe das selbe selbst gemacht und eine Bibliothek zusammengestapelt, die euch einen ParameterizedSuite
Runner zur Verfügung stellt: Ссылка
Eine parametrisierte Testsuite sieht folgendermaßen aus:
%Vor%Hier schlagen einige andere vor, dass sie viel flexibler zu sein scheinen: @RunWith ( Enclosed.class)
Kurz gesagt:
Anstelle von @Suite.SuiteClasses(...)
, verwenden Sie einfach @RunWith(Enclosed.class)
und erweitern Sie Ihre Test Classes
Jetzt mit parametrisierten:
%Vor%Ihre Testklassen für parametrisierte Tests sehen folgendermaßen aus:
%Vor%Entspricht genau dem, nach dem ich gesucht habe. Ich kann verschiedene Testszenarien erstellen (vollständiger Test, schneller Test, ...). Erstellen Sie einfach verschiedene @ RunWith-Klassen (Enclosed.class) und erweitern Sie die Tests, die Sie einschließen möchten.
Einziger Nebenpunkt scheint zu sein, dass Enclosed.class sich nicht um die Sortierreihenfolge kümmert (wenn es Ihnen wichtig ist). Ich löste es, indem ich Enclosed:
%Vor% Und dann @RunWith(SortedEnclosed.class)
Tags und Links java junit testng test-suite