2013-09-05 4 views
5

Ich habe eine Reihe von Spec-Tests, die ich innerhalb eines Grails-Projekts ausführe.Ausführen spezifischer Geb Tests nach Umgebungsbedingungen

Ich muss einen bestimmten Satz von Spezifikationen ausführen, wenn ich lokal bin, und einen anderen Satz von Spec, wenn ich die Pre-Prod-Umgebung ausführe. Meine aktuelle Konfiguration führt alle meine Spezifikationen gleichzeitig für beide Umgebungen aus, was ich vermeiden möchte.

Ich habe mehrere Umgebungen, dass ich in meinem GebConfig konfiguriert haben:

environments { 
    local { 
     baseUrl = "http://localhost:8090/myApp/login/auth" 
    } 

    pre-prod { 
     baseUrl = "https://preprod/myApp/login/auth" 
    } 

} 

Antwort

4

Sie eine spock Konfigurationsdatei verwenden können.

erstellen Anmerkungen für die beiden Arten von Tests - @Local und @PreProd, zum Beispiel in Groovy:

import java.lang.annotation 

@Retention(RetentionPolicy.RUNTIME) 
@Target([ElementType.TYPE, ElementType.METHOD]) 
@Inherited 
public @interface Local {} 

Der nächste Schritt ist Ihre Spezifikationen entsprechend mit Anmerkungen versehen, zum Beispiel:

@Local 
class SpecificationThatRunsLocally extends GebSpec { ... } 

Dann erstellen eine SpockConfig.groovy Datei neben Ihrer GebConfig.groovy Datei mit folgendem Inhalt:

def gebEnv = System.getProperty("geb.env") 
if (gebEnv) { 
    switch(gebEnv) { 
     case 'local': 
      runner { include Local } 
      break 
     case 'pre-prod': 
      runner { include PreProd } 
      break 
    } 
} 

EDIT: Es sieht so aus, als ob Grails seinen eigenen Test-Runner verwendet, was bedeutet, dass SpockConfig.groovy nicht berücksichtigt wird, wenn die Spezifikationen von Grails ausgeführt werden. Wenn Sie es benötigen, um unter Grails zu arbeiten, dann sollten Sie @ IgnoreIf/@ Require eingebaute Spock-Erweiterung Anmerkungen verwenden.

Erstellen Sie zuerst eine Closure-Klasse mit der Logik, wann eine bestimmte Spezifikation aktiviert werden soll. Sie könnten die Logik direkt als Abschlussargument für die Erweiterungs-Annotationen verwenden, aber es kann lästig werden, diesen Code überall zu kopieren, wenn Sie viele Spezifikationen kommentieren möchten.

class Local extends Closure<Boolean> { 
    public Local() { super(null) } 
    Boolean doCall() { 
     System.properties['geb.env'] == 'local' 
    } 
} 

class PreProd extends Closure<Boolean> { 
    public PreProd() { super(null) } 
    Boolean doCall() { 
     System.properties['geb.env'] == 'pre-prod' 
    } 
} 

Und dann Ihre Angaben mit Anmerkungen versehen:

@Requires(Local) 
class SpecificationThatRunsLocally extends GebSpec { ... } 

@Requires(PreProd) 
class SpecificationThatRunsInPreProd extends GebSpec { ... } 
+0

Dank erdi für Sie Antwort, aber wie erstelle ich Anmerkungen bitte, tun Sie Beispiele haben? Tx – ErEcTuS

+0

Siehe meine aktualisierte Antwort – erdi

+0

erdi, meine SockConfig ist nicht von meiner Grails-Anwendung "gesehen" .. und ich legte es auf das gleiche Paket wie gebConfig. Während des Debuggens wird der Code innerhalb von spockconfig niemals erreicht. – ErEcTuS