2016-03-24 8 views
0

Ist es möglich, Tests zu generieren und auszuführen?Geb JUnit4 automatisch generierte Tests

Ich habe für z.B. eine Liste von URLs, die ich überprüfen möchte, wenn sie auf eine 404-Seite und einige andere Tests zeigen. Ich möchte nicht für jeden Link einen separaten Test erstellen. Das wäre eine Menge Arbeit.

Wenn es nicht möglich ist, ist es möglich, von einem Test auf einen anderen zu zeigen, und wenn der andere fehlschlägt, wird der erste Test einfach fortgesetzt?

Für meine Tests verwende ich Groovy mit Gebish, Gradle und JUnit4.

Antwort

1

Ich denke, was Sie suchen, sind parameterized Tests, nicht generierte Tests. Wenn ich Sie richtig verstehe, möchten Sie den gleichen Test für viele verschiedene "Dinge" ausführen.

In einem parametrisierten Test führen Sie das durch, indem Sie eine statische Methode deklarieren, die die Daten zurückgibt, und dann JUnit anweist, den Runner Parameterized zum Ausführen des Tests zu verwenden. Jede Testklasse wird dann mit einem Argument als Testdaten instanziiert, auf die die Testmethode zugreifen kann.

@RunWith(Parameterized.class) 
public class FibonacciTest { 
    @Parameters 
    public static Collection<Object[]> data() { 
     return Arrays.asList(new Object[][] {  
       { 0, 0 }, { 1, 1 }, { 2, 1 }, { 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 } 
      }); 
    } 

    private int fInput; 
    private int fExpected; 

    public FibonacciTest(int input, int expected) { 
     fInput= input; 
     fExpected= expected; 
    } 

    @Test 
    public void test() { 
     assertEquals(fExpected, Fibonacci.compute(fInput)); 
    } 
} 

Ein alternativer Ansatz wäre theories. Mit einer Theorie betten Sie die Testdaten in die Testklasse als unterschiedliche statische Felder ein, die mit @Datapoint annotiert sind, und jede Testmethode wird für jeden Datenpunkt wiederholt aufgerufen, wobei der spezifische Datenpunkt als Argument übergeben wird. Auch hier haben Sie einen speziellen Läufer, um sie geschehen ...

@RunWith(Theories.class) 
public class UserTest { 
    @DataPoint 
    public static String GOOD_USERNAME = "optimus"; 
    @DataPoint 
    public static String USERNAME_WITH_SLASH = "optimus/prime"; 

    @Theory 
    public void filenameIncludesUsername(String username) { 
     assumeThat(username, not(containsString("/"))); 
     assertThat(new User(username).configFileName(), containsString(username)); 
    } 
} 
+0

Sie auch Ihr Leben viel einfacher und mit [Spock] (https://github.com/spockframework/spock) machen könnte und [ seine Unterstützung für die Testparametrisierung] (http://spockframework.github.io/spock/docs/1.0/data_driven_testing.html). – erdi