Frage

Ich bin derzeit wieder mit JUnit 4 Tests aus einem anderen Projekt gegen meinen Code. Ich erhalte sie direkt aus der anderen Projekt-Repository als Teil meines automatisierten Ant-Build. Das ist großartig, da es sicherstellt, halte ich meinen Code grün gegen die neueste Version der Tests.

Allerdings gibt es eine Teilmenge von Tests, dass ich nie auf meinem Code passieren erwarten. Aber wenn ich @Ignore Anmerkungen zu diesen Tests beginnen Hinzufügen, werde ich habe meine eigene separate Kopie der Testdurchführung zu halten, was ich wirklich will nicht zu tun.

Gibt es eine Möglichkeit einzelne Tests auszuschließen, ohne die Testquelle zu modifizieren? Hier ist, was ich habe auf bisher sah:

  • Soweit ich sehen kann, nur die Ant JUnit Aufgabe können Sie ganze Testklassen auszuschließen, nicht einzelne Prüfverfahren -. So, dass nicht gut für mich ist, ich brauche Methode Granularität

  • ich zusammen betrachtet eine Testsuite setzen, dass verwendet Reflektion, um dynamisch zu finden und alle ursprünglichen Tests hinzufügen, dann Code hinzufügen, um explizit die Tests entferne ich will nicht laufen. Aber ich ditched diese Idee, als ich bemerkte, dass die Testsuite API kein Verfahren zur Entfernung von Tests liefern.

  • Ich kann meine eigenen Testklassen erstellen, die die ursprünglichen Testklassen erweitern, überschreiben die spezifischen Tests, die ich will nicht laufen, und mit Anmerkungen versehen sie mit @Ignore. Ich JUnit dann auf meine Unterklassen laufen. Der Nachteil dabei ist, dass, wenn neue Testklassen zu dem ursprünglichen Projekt hinzugefügt werden, ich will sich nicht automatisch abholen. Ich werde für neue Testklassen zu überwachen haben, wie sie zu dem ursprünglichen Projekt hinzugefügt werden. Dies ist meine beste Option so weit, aber nicht ideal fühlen.

  • Die einzige andere Option, die ich denken kann, ist die schlechten Tests sowieso und ignorieren die Fehler zu laufen. Allerdings nehmen diese Tests eine Weile laufen (und nicht!), Damit ich lieber nicht, sich überhaupt laufen. Außerdem kann ich keine Möglichkeit zu sagen, das Ant-Task sieht Ausfälle auf spezifische Testmethoden zu ignorieren (wieder - ich sehe, wie Sie es für einzelne Testklassen tun, aber diese Methoden nicht)

  • .
War es hilfreich?

Lösung

Wenn Sie nicht die Original-Test überhaupt berühren können Sie gehen, um einige ernsthafte Einschränkungen haben. Ihre zwingende klingt wie die beste Wette, aber mit ein paar Änderungen:

Erstellen Sie die Ant-Tests speziell für die Superklassen ausgenommen, so dass zusätzliche Klassen, dass Sie nicht über get laufen wissen.

Sie können die @Rule Annotation (neu JUnit 4.7) wissen, was Test ausgeführt wird und Abbruch es (durch eine leere Statement Umsetzung der Rückkehr), anstatt zwingende spezifische Methoden, mehr Flexibilität zu geben, ob oder nicht zu wissen, zu vermeiden Sie den Test. Das einzige Problem bei dieser Methode ist, dass Sie nicht die @Before Methoden ausgeführt werden mit dieser Methode stoppen können, die langsam sein können. Wenn das ein Problem (und man kann wirklich die Tests nicht berühren) dann @Ignore in der überschriebenen Methode ist das einzige, was ich mir vorstellen kann.

Wenn jedoch können Sie diese Tests berühren, einige zusätzliche Optionen öffnen:

Sie könnten sie mit einem benutzerdefinierten Läufer laufen durch den @RunWith-Tag auf der Klasse angeben. Dieser Läufer würde passiert nur über die Ausführung der Standard-Läufer (JUnit4.class) in diesem Projekt, aber in Ihrem Projekt (über eine Systemeigenschaft oder einen anderen Mechanismus) würde die Testnamen überprüfen und nicht einen Test durchführen. Dies hat den Vorteil, dass die am wenigsten aufdringlich zu sein, aber der schwierigste (Läufer sind haarigen Biester, eines der erklärten Ziele der @Rule war der größte Teil der Notwendigkeit zu beseitigen, sie zu machen) zu implementieren.

Ein weiterer Grund ist eine assumeThat Aussage über den Test zu machen, dass einige Konfigurationseinstellung überprüfen würde, die wahr sein würde, wenn dieser Test ausgeführt werden soll. Das würde bedeuten, tatsächlich direkt in die Test Injektion, die höchstwahrscheinlich ein Deal Breaker in etwas fern ein markierten „eigenständiges Projekt.“

Andere Tipps

Es ist dir jetzt nicht helfen, aber TestNG unterstützt diese Art von Fähigkeit.

OK, das ist eine ziemlich Schwergewichts-Lösung, aber nicht die Dinge auf mich werfen, wenn es lächerlich klingt.

Der Kern von junit4 ist die org.junit.runner.Runner Klasse, und ihre verschiedenen Unterklassen, vor allem org.junit.runners.Suite. Diese Läufer bestimmen, was die Tests für eine bestimmte Test-Klasse, mit Dingen wie @Test und @Ignore.

Es ist ganz einfach benutzerdefinierte Implementierungen eines Läufers zu schaffen, und normalerweise würden Sie sie mithilfe der @RunWith Anmerkung auf Ihrer Testklasse anschließen, aber das ist offensichtlich nicht eine Option für Sie.

Allerdings, in der Theorie können Sie Ihre eigene Ant-Task schreiben könnte, vielleicht auf der Basis der Standardaufgabe Ant JUnit, die Ihre kundenspezifische Testläufer nimmt und nutzt sie direkt, jede Testklasse vorbei wiederum zu ihm. Ihre Läufer Implementierung eine externe Konfigurationsdatei, die angibt, zu ignorieren, die Testmethoden nutzen könnte, um.

Es wäre ziemlich viel Arbeit, und Sie würden Zeit haben, verbringen in der prähistorischen Ant Junit Graben um Codebasis, um herauszufinden, wie es funktioniert. Die Investition in Zeit sein kann, lohnt sich aber.

Es ist nur schade, dass die JUnit Ant-Task keinen Mechanismus bietet den Test Runner zu spezifizieren, das wäre ideal.

Eine Möglichkeit, die ich denken kann zu erreichen, was Sie mit den genannten Einschränkungen wollen, ist die Verwendung Bytecode-Modifikation. Sie könnten eine Liste von Klassen und Methoden halten in einer separaten Datei zu ignorieren, und den Bytecode der Testklassen patchen, wie Sie sie laden diese Methoden ganz zu entfernen.

Wenn ich mich nicht täusche, verwendet JUnit Reflexion der Testmethoden finden auszuführen. Verfahren Umbenennungsvorgang würde dann können Sie diese Methoden entfernen, bevor JUnit sie findet. Oder das Verfahren kann modifiziert werden, sofort zurückzukehren, ohne eine Operation auszuführen.

Eine Bibliothek wie BCEL kann verwendet werden, um die Klassen zu modifizieren, wenn geladen.

Wenn Sie nur eine Teilmenge der Tests ausgeführt werden sollen, es klingt wie die Klasse mehr als eine Verantwortung und soll nach unten Refactoring werden. Alternativ könnte die Testklasse gebrochen werden auseinander, so dass das ursprüngliche Projekt alle Tests hatten aber auf eine oder mehrere Klassen (ich einige der Tests zu erraten sind wirklich Integrationstests und die Datenbank oder das Netzwerk berühren) und die Klasse ausschließen könnte ( n) Sie nicht wollen.

Wenn Sie nicht irgendetwas davon tun, Ihre Wahl der überwiegenden ist wahrscheinlich am besten. Nehmen Sie den Prozess der, wann immer Sie einige Methoden ignorieren müssen Sie diese Klasse erweitern und fügen Sie ihn auf Ihrer Ant-Liste auszuschließen. Auf diese Weise können Sie ausschließen, was Sie nicht passieren können und werden nach wie vor in allen neuen Tests (Methoden, die Sie nicht außer Kraft setzen und neue Testklassen) ziehen, ohne Ihren Build zu ändern.

Wenn die unerwünschten Tests in bestimmten Klassen / Pakete sind, können Sie eine Dateigruppe ausschließen in Ant benutzen konnten sie während des Imports auszuschließen.

Zwei Optionen

  1. Die Arbeit mit dem Eigentümer der geliehenen Tests Ihre diejenigen in eine separate Klasse, die Sie beide teilen können extrahieren.
  2. Erstellen Sie Ihre eigenen Test-Klasse, die die Testklasse als Proxy Sie verwenden möchten. Für jede Methode möchten Sie eine Methode in der Klasse enthalten haben. Sie müssen eine Instanz der Testklasse auch Sie fordern und tun vor und nach Methoden zu konstruieren, wenn sie im Original sind.
  3. Erstellen Sie eine benutzerdefinierte Junit Läufer auf blockjunitrunner basiert und es verwenden, um herauszufiltern, oder Sie wollen in den Tests.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top