2011-07-12 14 views
0

助けてください。GebとSpockでGrailsテストをパスするには? (grails-functional-test-developmentを使用)

私は身体検査/機能/ページディレクトリの下

<div id="page-wrap"> 
    <div class="login-block"> 
    <g:if test="${flash.message}"> 
     <h3 class='login_message'>${flash.message}</h3> 
    </g:if> 
    <g:else> 
     <h3>IMMS Login</h3> 
    </g:else> 
    <form action='${postUrl}' method='POST' id='loginForm' class='cssform' autocomplete='off'> 
     <p> 
     <label for='username'><g:message code="auth.username.label" default="User Name"/></label> 
     <input type='text' class='text_' name='j_username' id='username'/> 
     </p> 
     <p> 
     <label for='password'><g:message code="auth.password.label" default="Password"/></label> 
     <input type='password' class='text_' name='j_password' id='password'/> 
     </p> 
     <p class="submit-wrap"> 
     <input type='submit' value="${message(code: 'default.button.Login.label', default: 'Login')}"/> 
     </p> 
    </form> 
    </div> 
    <div class="image-block"></div> 
</div> 

内側に次のコードを使用してページのログイン/ auth.gsp

を持って、私はLoginPage

package pages 

import geb.Page 

class LoginPage extends Page { 
    static url = "login/auth/" 
    static at = { 
    userName.text() == "" 
    } 
    static content = { 
    userName { $("input", name : "j_username") } 
    password { $("input", name : "j_password") } 
    loginButton(to: IndexPage){ $(".submit-wrap").find("input").first() } 
    } 
} 

そして、ここを持っています私のテストコードは

import geb.spock.GebReportingSpec 
import pages.* 
import spock.lang.Stepwise 
@Stepwise 
class BaseSpec extends GebReportingSpec { 
    String getBaseUrl() { 
    return "http://localhost:8080/IMMS/" 
    } 

    def "open URL"() { 
    when: 
    to LoginPage 
    then: 
    at LoginPage 
    } 

} 

私はテストを実行し、失敗しました。これはレポートです

<?xml version="1.0" encoding="UTF-8" ?> 
<testsuite errors="0" failures="1" hostname="SGCDMSSVR" name="BaseSpec" tests="1" time="24.715" timestamp="2011-07-12T07:00:04"> 
    <properties /> 
    <testcase classname="BaseSpec" name="open URL" time="24.693"> 
    <failure message="Condition not satisfied: 

at LoginPage 
| 
false 
" type="junit.framework.AssertionFailedError">junit.framework.AssertionFailedError: Condition not satisfied: 

at LoginPage 
| 
false 

    at BaseSpec.open URL(BaseSpec.groovy:18) 
</failure> 
    </testcase> 
    <system-out><![CDATA[--Output from open URL-- 
]]></system-out> 
    <system-err><![CDATA[--Output from open URL-- 
]]></system-err> 
</testsuite> 

私を助けてくれると思いますか?いくつかの設定が欠落しているか、jQueryのようなナビゲーションが正しくありませんか?

テストのために、私は "Functional Test Development"プラグインを使用しています。


更新: 当初、私は、私は単にデフォルトのドライバがHTMLUnitであることに気づいた正確The sample. からGebConfigを使用。

コマンドコンソールからFunctional Test Development機能を使用して機能テストを実行すると、

grails develop-functional-tests 

すべての機能テストを実行するオプションを選択します。コンソールに失敗したテストが表示されます。

デフォルトのドライバをFirefoxに変更するとします。 それはまだ失敗しましたが、私はそれが自動的にFirefoxブラウザを開き、URLを開く見ることができます:

http://localhost:8080/IMMS/login/auth.gsp 

、それは私が、これはテストが失敗した理由だと思うURL 404を開くことができませんでした。

私はIDEから以下を実行しようとしました。

grails test-app -functional 

firefoxブラウザが起動し、テストスクリプトとテストパスが書き込まれました。

ここではタイトルを改訂します。ここでは、grailsの機能テスト用のdevプラグインに焦点を当てています。 あなたはこのプラグインを試したことがありますか?答えはありますか?おかげさまで

PS:質問を改訂できますか?または私はstackoverflowで新しい質問を作成する必要がありますか?

+0

ここでは暗闇の中で撮影していますが、 'LoginPage'の' url'プロパティ( 'login/auth /'の代わりに 'login/auth')の末尾にスラッシュを入れてみてください。私はGebがそうでなければ '.gsp'を最後に追加するのはなぜか分かりません。答えのために –

答えて

0

grailsプラグインの作成者にhereさんに質問しました。 基本的に、テストコードの問題ではありません。私はちょうどテストのために別のポートを使用する必要があります。

3

LoginPageの条件が正しくありません(期待していたページにないか、マークアップに問題が発生して条件が満たされないなど)。あなたはそれの中にassertを置くことでより多くの情報を得るでしょう。

同様:

package pages 

import geb.Page 

class LoginPage extends Page { 
    static url = "login/auth/" 
    static at = { 
    assert userName.text() == "" 
    true 
    } 
    static content = { 
    userName { $("input", name : "j_username") } 
    password { $("input", name : "j_password") } 
    loginButton(to: IndexPage){ $(".submit-wrap").find("input").first() } 
    } 
} 

あなたのセレクタの実際の値が何を教えてくれなければなりません。

いずれにしても、状態は脆いと思います。ページの識別には、ドキュメントのタイトルやページヘッダーなどの特定の文字列を確認する方がよいでしょう。あなたの場合、私は<h3>ヘッダーと一致します。すなわち:

static at = { 
    assert $('h3').text() =~ /IMMS Login/ 
    true 
} 

(末尾のtrueがそうであることをすでに条件をアサートしているので、AT-チェック、失敗しませんが、アサートがnull値を持っています。)。

さらに、一貫した代替方法については、thisブログの記事をチェックしてください。

+0

ありがとう。私はそれが実行するために使用するプラグインでもっとだと思う。私はアサートを入れて、 – hida

+0

を参照しようとしますその点では、それは確かに良いです。 'assert'を追加すると、あなたは「早期に失敗する」ことができ、なぜat条件が失敗したのかについての詳細を得ることができます。 http://www.gebish.org/manual/current/browser.html#at_checkingとhttp://www.gebish.org/manual/current/pages.html#at_verificationを確認する際の詳細については、こちらをご覧ください。 。私は最後に 'true'を追加しなければなりませんでした。さもなければ、' assert'を使用したときのmy at条件は常に失敗します。 –

+0

2番目のリンクでは、詳細な出力の利点を得るために 'assert'を使うことを推奨しています。 –

関連する問題