2015-10-09 33 views
8

我想熟悉Geb。我試圖從Grails內部運行它,但這根本不重要,因爲我的問題是針對Geb的。通過示例登錄Geb登錄規範

我有以下test目錄結構:

myapp/ 
    <lots of stuff here> 
    test/ 
     functional/ 
      GebConfig.groovy 
      LogInLogOutSpec.groovy 
      pages/ 
       LogInPage.groovy 
       DashboardPage.groovy 

其中LoginPage.groovy是(顯然)登錄頁面,並在DashboardPage是你應該成功登錄後,會重定向。實際上,我有安全過濾器,用於檢查您嘗試訪問的URL是否需要身份驗證。如果是這樣,他們會將您重定向到登錄頁面,並且在成功登錄後,將您重新定向到您嘗試訪問的URL。

良好的措施,這裏包括我的登錄頁面(再次,這是Grails的,所以GSP文件被動態地轉換成HTML在運行時)的HTML:

<!DOCTYPE html> 
<html> 
    <head> 
     <title>Login</title> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> 
    </head> 
    <body> 
     <form action=「/myapp/auth/signIn" method="post"> 
      <input type="hidden" name="targetUri" value="/dashboard" /> 
      <table> 
       <tbody> 
        <tr> 
         <td>Username:</td> 
         <td><input type="text" name="username" value="" /></td> 
        </tr> 
        <tr> 
         <td>Password:</td> 
         <td><input type="password" name="password" value="" /></td> 
        </tr> 
        <tr> 
         <td /> 
          <td><input type="submit" value="Sign in" /></td> 
        </tr> 
       </tbody> 
      </table> 
     </form> 
    </body> 
</html> 

所以我需要一個蓋布測試:

  1. 嘗試去儀表板頁面(非授權)
  2. 驗證我們,而不是被重定向到登錄頁面
  3. 日誌中具有良好的CR edentials
  4. 檢驗我們是不是在儀表板頁面

此外:

  • 我想之間做出選擇:(1)無論是基於瀏覽器(Firefox或Chrome)或( b)一個無頭瀏覽器(我相信HtmlUnitDriver,但糾正我,如果我錯了)
  • 我想登錄憑據使用的Geb可以從GebConfig文件或一些外部參數(可能是提供給Grails命令行的env vars或運行時參數)。基本上我不想在測試代碼中存儲用戶名/密碼。

我迄今爲止最好的嘗試:

GebConfig.groovy

driver = { 
    // Again, or Firefox 
    ChromeProfile profile = new ChromeProfile() 
    Driver driverInstance = new ChromeDriver(profile) 
    driverInstace.manage().window().maximize() 

    driverInstance 
} 

baseNavigatorWaiting = true 
atCheckWaiting = true 

// Need to inject from some external process somehow, but make these 
// available to test specs somehow. 
username = System.env("USERNAME") 
password = System.env("PASSWORD") 

LogInLogOutSpec.groovy

import geb.spock.GerbReportingSpec 
import spock.lang.* 
import pages.* 

@Stepwise 
class LogInLogOutSpec extends GebReportingSpec { 
    String username 
    String password 

    /* 
    * Attempt to go to user dashboard, and confirm you are instead 
    * redirected to the login page. Login with good credentials, 
    * and verify you are now logged in and at the dashboard. 
    */ 
    def "successful login redirects to dashboard page"() { 
     when: 
     to DashboardPage 

     then: 
     "Login".equals($(".page-header").text()) 

     when: 
     $("#login-form input[name=username]").value(username) 
     $("#login-form input[name=password]").value(password) 

     then: 
     "Dashboard".equals($(".page-header").text()) 
    } 
} 

我覺得我接近,但是這顯然是錯誤的。任何想法,我要走錯了?謝謝!

+0

我沒有看到您將表格提交到任何地方,那可能是問題所在。如果它仍然不起作用,我認爲你必須縮小它無法緩解進一步幫助的地方。此外,該最新的視頻可以幫助你一點點GEB最佳實踐:https://www.youtube.com/watch?v=rpepX441E5g&feature=youtu.be – wwwclaes

+0

是啊,這已經有一段時間,因爲我做了一個測試蓋布這樣但wwwclaes說我的第一個想法。你在哪裏提交登錄表單或點擊「登錄」按鈕。 –

+0

所以你不要說這是如何失敗的。冷杉在這種情況下所做的事情就是做最簡單,最不抽象的測試腳本。不要將登錄頁面或儀表盤頁面抽象成一些特殊的Geb配置。不要擔心外部配置中的用戶名/密碼。先把它打到最「簡單」的方式工作。一旦開始工作,開始重構以使用更高級的Geb特性。 –

回答

6

您應該模塊化您的測試代碼。您應該使用

  • modules對於能夠在不同的頁面出現UI部件
  • 頁(12)模型有一定的HTML頁面
  • 規格進行實際測試邏輯

在你的代碼示例中有一個儀表板頁面,但沒有登錄頁面對象。如果您的所有頁面都有可能登錄或至少提供檢測登錄狀態的可能性,您還應該考慮登錄模塊。模塊定義見SO answer。現在缺少的是在這裏決定登錄state.For另一種實現方式看AuthModuleGeb exampleslogin test spec功能。

對於登錄憑證:我認爲你在環境中擁有憑證方面做得很好。這在開發人員機器上以及在構建服務器上都可以正常工作。

用不同瀏覽器進行測試:geb-example-gradle是一個帶有和build.gradle的Gradle示例項目。這使您可以切換瀏覽器作爲參數傳遞給gradle這個:

./gradlew chromeTest 
./gradlew firefoxTest 
./gradlew phantomJsTest 

這也回答了你的最後一個問題:一個很好的模擬瀏覽器我喜歡用是phantomJs

0

舉例來說,請參考Geb spec。主要你可以檢查LoginModule是如何使用here提供的登錄行爲。

void login(String username = "[email protected]", String password = "admin") { 
    loginForm.j_username = username 
    loginForm.j_password = password 
    loginButton.click() 
} 

應用程序使用HtmlUnit驅動程序。

我們知道如果你需要任何進一步的解釋。