2017-07-11 20 views
0

问题如何在CAS登录后对重定向的Grails 3应用程序进行功能测试?

我有一个使用CAS(中央认证服务)登录的应用程序。在上述结构(application.yml),CAS被配置如下:

grails: 
    plugin: 
    springsecurity: 
     # ...other configurations omitted ... 
     cas: 
     serverUrlPrefix: "https://<some endpoint for the actual CAS>" 
     serviceUrl: https://localhost:8443/myapp/login/cas 
     # ...other configurations omitted ... 

当运行功能测试,Tomcat服务器与随机的端口号发起的,例如http://localhost:45359并且每次运行都会随时更改。

似乎应用程序在登录后重定向到CAS serviceUrl,通常我的应用程序在端口8443上运行,所以它从来都不是问题。但是,由于功能测试在随机端口号下启动Tomcat服务器,重定向失败。

此外,我使用run-app -https(即https://localhost:8443)运行我的应用程序,但测试在http(例如http://localhost:12345)上运行。我不知道这是否是一个重要的细节。

测试

我的功能测试去如下:

  1. 导航到应用程序的主网址,这被重定向到登录页面
  2. 检查标题为
  3. 登录页面
  4. 输入登录凭证
  5. 点击提交按钮
  6. 当连接到localhost:8443时出现“连接被拒绝”错误。

源(基于:https://github.com/grails-guides/grails-test-security/blob/master/complete/src/integration-test/groovy/grails/test/security/AnnouncementControllerSpec.groovy):

@Integration 
class MyAppControllerFunctionalSpec extends GebSpec { 

    def setup(){ 
    } 

    def cleanup() { 
    } 

    void "test something"() { 
     when:"The home page is visited" 
      go '/myapp' // 1 

     then:"The title is correct" 
      title == "Login Page" // 2 
      at LoginPage // a helper class - subclass of geb.Page. 
         // Contains implementation of login method 

     when: "Sign in" 
      login('username', 'password') // 3 & 4 --> 5 

     then: "Title" 
      title == "Welcome MyApp" 
} 

堆栈跟踪:

java.lang.RuntimeException: org.apache.http.conn.HttpHostConnectException: Connect to localhost:8443 [localhost/127.0.0.1] failed: Connection refused (Connection refused) 

    at com.gargoylesoftware.htmlunit.WebClient.download(WebClient.java:2067) 
    at com.gargoylesoftware.htmlunit.html.HtmlForm.submit(HtmlForm.java:138) 
    at com.gargoylesoftware.htmlunit.html.HtmlButton.doClickStateUpdate(HtmlButton.java:97) 
    at com.gargoylesoftware.htmlunit.html.DomElement.click(DomElement.java:786) 
    at com.gargoylesoftware.htmlunit.html.DomElement.click(DomElement.java:733) 
    at org.openqa.selenium.htmlunit.HtmlUnitMouse.click(HtmlUnitMouse.java:74) 
    at org.openqa.selenium.htmlunit.HtmlUnitWebElement.click(HtmlUnitWebElement.java:151) 
    at geb.navigator.NonEmptyNavigator.click(NonEmptyNavigator.groovy:437) 
    at geb.content.TemplateDerivedPageContent.click(TemplateDerivedPageContent.groovy:115) 
    at myapp.LoginPage.login(LoginPage.groovy:22) 
    at geb.Browser.methodMissing(Browser.groovy:207) 
    at geb.spock.GebSpec.methodMissing(GebSpec.groovy:56) 
    at myapp.MyAppControllerFunctionalSpec.test something(MyAppControllerFunctionalSpec.groovy:39) 
Caused by: org.apache.http.conn.HttpHostConnectException: Connect to localhost:8443 [localhost/127.0.0.1] failed: Connection refused (Connection refused) 
    at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:158) 
    at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:353) 
    at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:380) 
    at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236) 
    at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184) 
    at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:88) 
    at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110) 
    at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184) 
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:71) 
    at com.gargoylesoftware.htmlunit.HttpWebConnection.getResponse(HttpWebConnection.java:179) 
    at com.gargoylesoftware.htmlunit.WebClient.loadWebResponseFromWebConnection(WebClient.java:1321) 
    at com.gargoylesoftware.htmlunit.WebClient.loadWebResponseFromWebConnection(WebClient.java:1379) 
    at com.gargoylesoftware.htmlunit.WebClient.loadWebResponse(WebClient.java:1238) 
    at com.gargoylesoftware.htmlunit.WebClient.download(WebClient.java:2063) 
    ... 12 more 
Caused by: java.net.ConnectException: Connection refused (Connection refused) 
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) 
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) 
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) 
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) 
    at java.net.Socket.connect(Socket.java:589) 
    at org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:337) 
    at com.gargoylesoftware.htmlunit.httpclient.HtmlUnitSSLConnectionSocketFactory.connectSocket(HtmlUnitSSLConnectionSocketFactory.java:189) 
    at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:141) 
    ... 25 more 

问题

什么是正确的方法,使之所以我的功能测试能通过CAS登录?

其他信息

  • 的Grails:3.2.7
  • Groovy:在2.4.12
  • 的IntelliJ:2017年1月5日

UPDATE

我有尝试使用a设置端口号n环境变量,无济于事。请参阅:this Grails isssue

回答

0

我目前的解决方案,使功能测试与CAS登录从IntelliJ IDEA的运行:

  1. 确保测试类是src/integration-test/groovy/<package>/目录下使用
  2. 运行/启动应用程序运行命令或控制按钮。不要从IDE终端运行应用程序。
  3. 运行从IDE的终端的测试:

    grails test-app package.test_class --integration

例如,对于包:foo和测试类MyAppControllerFunctionalSpec

grails test-app foo.MyAppControllerFunctionalSpec --integration 
相关问题