2013-09-05 34 views
5

Bir Grails Project içerisinde yürüttüğüm Spec testleri kümesi var.Özel Gebelik Testlerini ortam koşullarına göre yürütme

Ben yerel olduğumda Özellikleri belirli bir dizi yürütmek gerekiyor ve Spec başka dizi ben ön prod ortamı çalıştırdığınızda. Geçerli yapılandırmam, tüm özelliklerin her iki ortam için aynı anda yürütülmesidir; bu, kaçınmak istediğim bir şeydir.

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

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

} 

cevap

4

Bir Spock yapılandırma dosyasını kullanabilirsiniz:

benim GebConfig yapılandırılmış olması, birden ortamlar var.

@Local 
class SpecificationThatRunsLocally extends GebSpec { ... } 

Sonra oluşturmak:

import java.lang.annotation 

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

Sonraki adım, örneğin buna göre gözlük açıklama şudur: Groovy örneğin @Local ve @PreProd, -

testlerin iki tip açıklamalar oluşturun aşağıdaki içerikleri ile GebConfig.groovy dosyanın yanındaki bir SpockConfig.groovy dosyası:

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

DÜZENLEME: O Grails gelen özelliklere çalıştırırken SpockConfig.groovy dikkate alınmaz demektir kendi test atlet kullanıyor Grails benziyor. Eğer Grails altında çalışmak için ihtiyacınız varsa o zaman @ IgnoreIf/@ Dahili Spock uzantılı ek açıklamaları kullanmalısınız.

İlk verilen bir Spec etkin olması gerektiğine ilişkin mantığı ile bir Kapanış sınıf oluşturmak. Mantığı, uzantı ek açıklamalarına doğrudan bir kapatma argümanı olarak koyabilirsiniz, ancak çok fazla ayrıntıya ek açıklama eklemek istiyorsanız, bu kod bitini kopyalamak için can sıkıcı olabilir.

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

Ve sonra sizin gözlük açıklama: Eğer yanıtını için

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

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

Teşekkür erdi, ama nasıl sana örnekler var, ek açıklamalar lütfen oluşturabilirim? Tx – ErEcTuS

+0

Güncellenmiş yanıtıma bakın – erdi

+0

erdi, benim SockConfig benim grails uygulamanız tarafından 'görülmedi' .. ve bunu gebConfig ile aynı pakete koydum. Hata ayıklama yaparken, spockconfig içindeki kod hiçbir zaman ulaşılamaz. – ErEcTuS