2013-09-05 13 views
5

Mam zestaw testów Spec, które wykonuję w ramach projektu Grails.Wykonywanie określonych testów Geb zgodnie z otoczeniem

Muszę wykonać określony zestaw specyfikacji, gdy jestem na komputerze lokalnym, i inny zestaw specyfikacji, gdy uruchamiam środowisko pre-prod. Moja aktualna konfiguracja wykonuje wszystkie moje specyfikacje w tym samym czasie dla obu środowisk, co jest czymś, czego chcę uniknąć.

Mam wielu środowisk, które mam skonfigurowane w moim GebConfig:

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

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

} 

Odpowiedz

4

Można użyć pliku konfiguracyjnego Spock.

Tworzenie adnotacji dla dwóch typów testów - @Local i @PreProd, na przykład w Groovy:

import java.lang.annotation 

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

Następnym krokiem jest opisywanie swoich specyfikacje odpowiednio, na przykład:

@Local 
class SpecificationThatRunsLocally extends GebSpec { ... } 

następnie utworzyć plik SpockConfig.groovy obok pliku GebConfig.groovy o następującej treści:

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

EDYCJA: Wygląda na to, że Grails używa własnego testera, co oznacza, że ​​SpockConfig.groovy nie jest brany pod uwagę podczas uruchamiania specyfikacji z Grails. Jeśli potrzebujesz go do pracy pod Grails, powinieneś użyć @ IgnoreIf/@ Require wbudowanych adnotacji rozszerzenia Spock.

Najpierw utwórz klasę zamknięcia z logiką, kiedy dana specyfikacja ma być włączona. Możesz umieścić logikę bezpośrednio jako argument zamknięcia dla adnotacji rozszerzeń, ale denerwujące może być kopiowanie tego kodu w całym miejscu, jeśli chcesz opisywać wiele specyfikacji.

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' 
    } 
} 

A potem opisywanie swoich Specyfikacja:

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

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

Thanks Erdi Ci odpowiedzi, ale w jaki sposób tworzyć adnotacje proszę, masz przykłady? Tx – ErEcTuS

+0

Zobacz moją zaktualizowaną odpowiedź – erdi

+0

erdi, mój SockConfig nie jest "widziany" przez moją aplikację grails i umieściłem go w tym samym pakiecie co gebConfig. Podczas debugowania kod wewnątrz spockconfig nigdy nie został osiągnięty – ErEcTuS

Powiązane problemy