2015-10-09 20 views
8

Tôi đang cố gắng làm quen với Geb. Tôi đang cố gắng chạy nó từ bên trong Grails, nhưng điều đó hoàn toàn không quan trọng vì câu hỏi của tôi ở đây là cụ thể đối với Geb.Thông số đăng nhập Geb theo ví dụ

tôi có cấu trúc test thư mục sau:

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

đâu LoginPage.groovy là (rõ ràng) trang đăng nhập, và nơi DashboardPage là nơi bạn nên được chuyển đến sau khi đăng nhập thành công. Trong thực tế, tôi có bộ lọc bảo mật tại chỗ sẽ kiểm tra xem liệu URL bạn đang cố truy cập có yêu cầu xác thực hay không. Nếu vậy, họ chuyển hướng bạn đến trang đăng nhập và sau khi đăng nhập thành công, hãy chuyển hướng bạn lại đến URL bạn đang cố gắng truy cập.

Đối với biện pháp tốt, đây là HTML mà bao gồm trang đăng nhập của tôi (một lần nữa, đây là Grails, do đó, một tập tin GSP là tự động chuyển đổi sang HTML trong thời gian chạy):

<!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> 

Vì vậy, tôi cần một thử nghiệm Geb rằng :

  1. nỗ lực để đi đến Bảng điều khiển Page (trái phép)
  2. Thẩm tra, chúng tôi đã thay được chuyển đến đăng nhập trang
  3. Logs với cr tốt edentials
  4. thẩm tra chúng tôi không ở Dashboard Trang

Hơn nữa:

  • Tôi muốn lựa chọn giữa: (a) hoặc dựa trên trình duyệt (Firefox hoặc Chrome) hoặc (b) trình duyệt không có đầu (mà tôi tin rằngHtmlUnitDriver, nhưng sửa lỗi nếu tôi sai)
  • Tôi muốn thông tin đăng nhập được Geb sử dụng để được tiêm từ GebConfig tệp hoặc một số tham số bên ngoài (có lẽ là v env vars hoặc runtime args được cung cấp cho dòng lệnh Grails). Về cơ bản, tôi không muốn lưu trữ tên người dùng/mật khẩu trong mã thử nghiệm.

nỗ lực của tôi tốt nhất cho đến nay:

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()) 
    } 
} 

Tôi nghĩ tôi gần, nhưng điều này là rõ ràng là sai. Bất kỳ ý tưởng nào mà tôi sẽ gặp phải? Cảm ơn!

+0

Tôi không thấy rằng bạn gửi biểu mẫu ở bất kỳ đâu, đó có thể là vấn đề. Nếu nó vẫn không hoạt động, tôi nghĩ rằng bạn phải thu hẹp nơi mà nó không dễ dàng giúp đỡ thêm. Ngoài ra, video gần đây này có thể giúp bạn với một số thực hành tốt nhất của GEB: https://www.youtube.com/watch?v=rpepX441E5g&feature=youtu.be – wwwclaes

+0

Vâng, đã lâu rồi tôi đã làm một bài kiểm tra Geb như thế này nhưng wwwclaes nói suy nghĩ đầu tiên của tôi. Bạn đang gửi biểu mẫu đăng nhập ở đâu hoặc nhấp vào nút "Đăng nhập". –

+0

Vì vậy, bạn không nói như thế nào là không. Firs điều tôi làm trong một tình huống như thế này là làm kịch bản thử nghiệm đơn giản nhất, trừu tượng nhất mà sẽ làm việc. Đừng trừu tượng Trang Đăng nhập hoặc Trang Bảng điều khiển thành một số cấu hình Geb đặc biệt. Đừng lo lắng về tên người dùng/mật khẩu đang ở trong cấu hình bên ngoài. Hack nó lên để "làm việc" cách đơn giản nhất có thể đầu tiên. Khi đã xong, hãy bắt đầu tái cấu trúc để sử dụng các tính năng Geb nâng cao hơn. –

Trả lời

6

Bạn nên mô đun hóa mã kiểm tra của mình.Bạn nên sử dụng

  • modules cho widget UI có thể xảy ra trên các trang khác nhau
  • trang (1, 2) để mô hình hóa một trang HTML nào đó
  • số kỹ thuật cho logic kiểm tra thực tế

Trong ví dụ mã của bạn, bạn có một trang bảng điều khiển, nhưng không có đối tượng trang đăng nhập. Bạn cũng nên suy nghĩ về một modul đăng nhập nếu tất cả các trang của bạn có khả năng đăng nhập hoặc ít nhất cung cấp khả năng phát hiện trạng thái đăng nhập. Xem điều này SO answer cho một định nghĩa modul. Những gì còn thiếu ở đây là một chức năng để xác định trạng thái đăng nhập. Để có một cái nhìn thực hiện khác tại AuthModulelogin test spec của số Geb examples.

Để thông tin xác thực đăng nhập: Tôi nghĩ bạn đã làm tốt công việc có thông tin đăng nhập trong môi trường. Điều này làm việc tốt trên một máy phát triển và cũng trên máy chủ xây dựng.

Để thử nghiệm với các trình duyệt khác nhau: geb-example-gradle là dự án mẫu gradle có và build.gradle. Điều này cho phép bạn chuyển đổi trình duyệt như là đối số để gradle:

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

này cũng trả lời câu hỏi cuối cùng của bạn: một trình duyệt không đầu tốt Tôi thích sử dụng là phantomJs.

0

Tham khảo Geb spec để biết ví dụ. Chủ yếu là bạn có thể kiểm tra cách LoginModule cung cấp hành vi đăng nhập như được sử dụng here.

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

Ứng dụng sử dụng trình điều khiển HtmlUnit.

Hãy cho biết nếu bạn cần giải thích thêm.

Các vấn đề liên quan