2013-09-05 46 views
5

我有一套我在Grails項目中執行的Spec測試。根據環境執行特定的Geb測試

我需要當我在本地執行一組特定的規格的,而另一組規格的,當我運行督促前環境。 我目前的配置同時爲兩個環境執行我的所有規格,這是我想避免的。

我有多個環境中,我在GebConfig完成以下任務:

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

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

} 

回答

4

你可以使用一個斯波克配置文件。

import java.lang.annotation 

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

下一步是相應註釋您的規格,例如:

@Local 
class SpecificationThatRunsLocally extends GebSpec { ... } 

然後Groovy創建@Local@PreProd,例如 -

創建了兩種類型的測試註釋一個SpockConfig.groovy文件旁邊的GebConfig.groovy文件具有以下內容:

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

編輯:它看起來像Grails是用它自己的測試運行,這意味着從Grails的運行規範時SpockConfig.groovy不考慮。如果你需要它在Grails下工作,那麼你應該使用@ IgnoreIf/@需要內置的Spock擴展註釋。

首先創建一個邏輯閉合類時,應啓用給定的規範進行。您可以直接將邏輯作爲閉包參數放入擴展註釋中,但如果您想註解很多規格,則可能會煩惱地將該位代碼複製到整個地方。

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

然後標註您的規格:

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

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

感謝ERDI對你的反應,但我如何創建註釋請,你有例子嗎? Tx – ErEcTuS

+0

查看我的更新回覆 – erdi

+0

erdi,我的SockConfig沒有被我的grails應用程序「看到」。我把它放在與gebConfig相同的包中。在調試的時候,spockconfig裏的代碼永遠不會到達 – ErEcTuS