Как пройти тест Грааля с Гебом и Споком?(используя Grails-Function-Test-Development) - PullRequest
0 голосов
/ 12 июля 2011

Пожалуйста, помогите.

У меня есть страница входа / auth.gsp

со следующим кодом внутри тела

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

В тесте / функционал / страницы каталога, у меня 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?

Для тестирования я использую плагин «Разработка функциональных тестов».


Обновление: Изначально я использовал GebConfig именно из Образец. Я только что заметил, что драйвером по умолчанию является HTMLUnit.

Когда я запускаю функциональный тест с использованием функции Разработка функционального теста из командной консоли.

grails develop-functional-tests

Я выбираю опцию для запуска всех функциональных тестов. Консоль показала неудачные тесты.

Когда я меняю драйвер по умолчанию на Firefox. Это все еще не удалось, но я вижу, что он автоматически открывает браузер Firefox и открывает URL:

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

и не удалось открыть URL 404. Я думаю, что это причина, по которой тест не удался.

Я попытался запустить следующее из IDE.

grails test-app -functional

Работает, браузер Firefox открылся и сделал то, что написано, сценарий тестирования и тестовый проход.

Итак, я пересматриваю название здесь. Основное внимание сейчас уделяется плагину для функционального тестирования Grails. Возможно, кто-нибудь из вас когда-либо пробовал этот плагин и имеет ответ? Спасибо.

PS: я могу пересмотреть вопрос? или я должен создать новый вопрос в stackoverflow?

Ответы [ 2 ]

3 голосов
/ 12 июля 2011

Ваше условие at для 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 в конце означает, что проверка не провалится, поскольку вы уже утверждаете условие, но утверждение имеет значение null.).

Кроме того, проверьте это сообщение в блоге для более последовательной альтернативы.

0 голосов
/ 04 августа 2011

Я спросил создателя плагина Grails здесь .Так что, в принципе, речь идет не о проблеме тестового кода.Мне просто нужно использовать другой порт для тестирования.

...