Спок-тест в файлах cookie GEB с использованием условия where - PullRequest
0 голосов
/ 10 мая 2018

Я настроил несколько geb тестов для проверки разных сообщений в зависимости от попытки входа в систему в моем веб-приложении.Поскольку сообщение и поля ввода изменятся при третьей попытке входа в систему.

Имя входа - это двухэтапное имя входа на основе пароля, отправленного на определенный номер телефона, поэтому на первой странице LoginPage пользователь вводит свои Id и phoneNumber , затем перенаправляется на вторую страницу ValidationLoginPage , где пользователь вводит полученный пароль.

Я хочу проверить, что на второй странице пользователь может ввести только три неверных пароля, а с четвертой попытки ввод пароля вводится, и появляется другое сообщение, указывающее, что больше нет попыток, которые он показывает.

Чтобы проверить это, я подготовил тест, который вводит Id и phoneNumber в предложении given:, а с помощью предложения where: вводит неверный пароль три раза.,Так как where: повторяют все тесты, я пытаюсь контролировать повторяемую часть, используя введенную переменную, как в where:, поэтому у меня есть что-то вроде:

def "Test max loging attempts"(){
  given:
    if(loginAttempt == 1)
      to LoginPage
      loginModule.startLogin(cfg.user.id,cfg.user.phone)
    }
  when:
    at LoginValidationPage
    assert  $('div.box_id_header h3').text() == 'Verify your code'
    assert  $('#code').css('display').contains('block')
    loginModule.verifyPassword('WRONGPASSWORD')
  then:
    at LoginValidationPage
    println "Attempt ${loginAttempt}"
    if(loginAttempt == 4){
      // last attempt
      assert    $('#code').css('display') == 'none' 
      assert  $('#divCodeErrorMsg').text().contains('No more attempts')
    }else{
      assert    $('#code').css('display').contains('block')
      assert  $('#divCodeErrorMsg').text().contains('Wrong password. Try again.')
    }
  where:            
    loginAttempt << (1..4)
}

Моя проблема в том, что cookies очищены длякаждая where: итерация, мысль сообщение и поведение не то, что я ожидаю.Я не хочу настраивать autoClearCookies=false в GebConfig.groovy файле, так как у меня есть другие тесты, где эта функция необходима.Существует способ избежать очистки файлов cookie для этого метода с использованием метода spock def setupSpec() {} и повторной активации в методе def cleanupSpec() {}?

Кроме того, можно также использовать where: более чистым способом, избегая проверки loginAttempt переменная, чтобы избежать запуска given: часть несколько раз, или есть лучший подход вообще не использовать where:?

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Проблема в том, что вы, возможно, неправильно понимаете и, таким образом, злоупотребляете блоком Спока where:.Он предназначен для параметризации метода объекта, и каждый запуск этого метода содержит независимую функцию.Если вы используете @Unroll свою функцию, даже для каждого набора параметров where: генерируется новый метод.Поскольку функции должны быть независимы друг от друга и теоретически должны выполняться в любом заданном порядке или даже параллельно, тестовые устройства должны быть сброшены для их запуска.Это то, что происходит с вашими файлами cookie, потому что вы используете функцию where: для реализации простого цикла.

В вашем коде есть другие небольшие проблемы, такие как не подтвержденная проверка at в when: блок.Даже если at дает false, это не имеет никакого значения, если вы не используете assert.Вы можете пропустить только assert в then: или expect: блоках, но не в given: или when:, а также не внутри замыканий или вспомогательных методов, которые я буду использовать в моем примере кода.

Как насчет этого?

package de.scrum_master.stackoverflow.foo

import geb.spock.GebReportingSpec

class LoginTest extends GebReportingSpec {
  def loginModule = new LoginModule()
  def cfg = new Config()

  def "Test max login attempts"() {
    given: "we are at the login page"
    browser.config.autoClearCookies = false
    to LoginPage

    when: "logging in 4x with wrong credentials"
    (1..4).each {
      loginWithWrongCredentials(it, it < 4)
    }

    then: "we get a 'no more attempts' error message"
    $('#codi').css('display') == 'none'
    $('#divCodiValidacioError').text().contains('No more attempts')
  }

  def loginWithWrongCredentials(int loginAttempt, boolean checkForWrongPasswordMessage) {
    println "Login attempt ${loginAttempt}"
    loginModule.startLogin(cfg.user.id, cfg.user.phone)
    assert at(LoginValidationPage)
    assert $('div.box_id_header h3').text() == 'Verify your code'
    assert $('#code').css('display').contains('block')
    loginModule.verifyPassword('WRONGPASSWORD')
    assert at(LoginValidationPage)
    if (checkForWrongPasswordMessage) {
      assert $('#codi').css('display').contains('block')
      assert $('#divCodiErrorMsg').text().contains('Wrong password. Try again.')
    }
  }
}

Я бы также порекомендовал переместить утверждения контента из loginWithWrongCredentials в вспомогательные методы LoginValidationPage, где они скорее принадлежат, и просто вызвать их из теста.

0 голосов
/ 10 мая 2018

Наконец, отключив autoClearCookies на шаге setup, я получаю желаемое поведение.

def setup() {
    browser.getConfig().setAutoClearCookies(false)      
}

Однако, что удивительно, если я использую метод setupSpec(), кажется, что он не работает, поскольку только первая where: итерация имеет autoClearCookies=false, а остальные * autoClearCookies=true.

...