2014-07-01 4 views
12

die Testklassen bereitgestellt und JUnit sind beide auf dem Classpath, kann man JUnit-Tests von der Kommandozeile wie folgt:Können Sie alle JUnit-Tests in einem Paket über die Befehlszeile ausführen, ohne sie explizit aufzulisten?

java org.junit.runner.JUnitCore TestClass1 TestClass2 

, jetzt ist es eine Möglichkeit, alle Tests in einem Paket (und sub- laufen Pakete) auch?

Ich suche nach etwas wie

java org.junit.runner.JUnitCore com.example.tests.testsIWantToRun.* 

Gibt es eine einfache Möglichkeit, dies zu tun (das nicht Maven oder Ameise mit sich bringt)?

+0

Ich möchte alle Tests in einem Paket und seinem Unterpaket auf Continuous Integration-Servern ausführen, und ich weiß nicht, welche Pakete und Tests Adopters einrichten werden. Aber ich kann nicht alle von ihnen laufen, weil Tests in einem bestimmten Paket nicht auf dieser Box gestartet werden sollen. Alles, was erfordert, dass jemand manuell eine Liste von Tests erstellt, ist somit nicht ideal (es sei denn, eine solche Liste kann vollständig aus Ausschlüssen bestehen). – Christian

+0

mögliches Duplikat von [Wie erstelle ich dynamisch eine Test-Suite in JUnit 4?] (Http://stackoverflow.com/questions/3257080/how-do-i-dynamically-create-a-test-suite-in-junit -4) – Christian

+0

Ich habe Antworten auf meine eigene Frage gefunden, nachdem ich die erste Antwort bekommen habe; Sie sind von meiner Antwort unten verlinkt. Ich habe gerade eine Abstimmung gestartet, um das als Duplikat zu schließen. – Christian

Antwort

9

In Junit können Sie suites von Tests definieren. Jede Suite definiert eine Sammlung von Tests. Wenn die Suite ausgeführt wird, werden alle Tests ausgeführt. Was ich tue, ist eine Suite für jedes Paket zu definieren, die Auflistung der Testklassen für das Paket zusammen mit den Suiten für alle Unterpakete:

package com.foo.bar; 

import org.junit.runner.RunWith; 
import org.junit.runners.Suite; 

import com.foo.bar.baz.Suite_baz; 

@RunWith(Suite.class) 
@Suite.SuiteClasses({ 
    ThisTest.class, 
    ThatTest.class, 
    TheOtherTest.class, 
    Suite_baz.class, 
}) 
public class Suite_bar { 
} 

Das ist nicht ganz mühelos. Sie müssen die Suites konstruieren und manuell mit neuen Testklassen aktualisieren. Ich nehme an, es wäre nicht schwer, ein kleines Java-Programm zu schreiben, um diese automatisch zu generieren, wenn jemand wollte.

2

Ich habe diese Frage gestellt, um in der Lage zu sein, Sets von Gurken-Tests eines Projekts selektiv auf Jenkins zu kicken, ohne wirklich zu wissen, was ihre RunTests-Klassen heißen würden, was ihre CucumberOptions enthalten würden oder wo sie sich befinden würden. Ich fand ein paar hilfreiche Themen auf Stackoverflow in der Zwischenzeit, die Antwort auf meine Frage:

Mit diesen kann ich meine Gurke Tests aus einzeln treten wie folgt:

Zuerst habe ich das Maven-Assembly-Plugin verwendet, um die Tests in einem Glas zu bekommen: https://stackoverflow.com/a/574650/2018047

Dann kopierte ich die Abhängigkeiten Tests auf dem Zielordner auf Jenkins, wie hier gezeigt:

https://stackoverflow.com/a/23986765/2018047 Wir haben bereits eine Fahne haben, die die Ausführung unserer Tests überspringt, wenn es gesetzt ist, so dass ich meine Tests verpacken, ohne sie zu laufen : mvn clean install -DskipMyTestModule=true

und von unten den Code von oben und den Aufruf verwenden, werde ich in der Lage sein, sie alle arbeiten ... das jemand in der Zukunft hilft

java -Dcucumber.options="src/test/resources/features --tags @b --format pretty:STDOUT --format html:target/cucumber-b --format json:target/cucumber-b.json" -Dname=value -cp target/artifact-1.2.8-SNAPSHOT-tests.jar;target/test-classes/libs/junit-4.11.jar;target/test-classes/libs/* org.junit.runner.JUnitCore com.example.foo.bar.test.cucumber.RunTest 

Hoffnung zu machen. :)

1

Mit JUnit 4 wird dies mit einer Erweiterung namens cpsuite unterstützt.Alles, was Sie tun müssen, ist es Classpath zu Ihrem Test hinzufügen (Maven io.takari.junit:takari-cpsuite), erstellen Sie eine dynamische Test-Suite Klasse:

package com.mycompany; 
import org.junit.extensions.cpsuite.ClasspathSuite; 
import org.junit.runner.RunWith; 

@RunWith(ClasspathSuite.class) 
@ClasspathSuite.IncludeJars(true) 
public class RunAllTests {} 

und führen Sie es:

java -cp ${CP} org.junit.runner.JUnitCore com.mycompany.RunAllTests 

Ihre Classpath ${CP} sollte Ihren Testgefäß umfassen , Junit, Hamcrest und Cpsuite.

Verwandte Themen