Не восстанавливается после падения f5 во время спок-теста

Кто-нибудь когда-нибудь создавал успешный тест Spock против разрыва соединения f5?

В моем правиле f5, если ситуация устраивает - мол плохой кукис, сбрасываю соединение

if { [HTTP::cookie exists "badCookie"] } {
  if { not ([HTTP::cookie "badCookie"] matches_regex {^([A-Z0-9_\s]+)$}) } {
    drop
  }
}

Проверка этого вручную в браузере приводит к медленному, но возможному тайм-ауту, ограничение по времени зависит от браузера. Но вместо ручных тестов для каждого из правил f5 я хотел бы вместо этого включить свои тесты в нашу библиотеку функциональных тестов Spock.

Использование Spock, @Timeout() или @Timeout(value=5) просто приводит к бесконечному увеличению времени ожидания, например:

[spock.lang.Timeout] Method 'abc' has not yet returned - interrupting. Next try in 0.50 seconds.
[spock.lang.Timeout] Method 'abc' has not yet returned - interrupting. Next try in 1.00 seconds.
[spock.lang.Timeout] Method 'abc' has not yet returned - interrupting. Next try in 2.00 seconds.
[spock.lang.Timeout] Method 'abc' has not yet returned - interrupting. Next try in 4.00 seconds.
[spock.lang.Timeout] Method 'abc' has not yet returned - interrupting. Next try in 8.00 seconds.
[spock.lang.Timeout] Method 'abc' has not yet returned - interrupting. Next try in 16.00 seconds.

Использование метода waitFor в http://fbflex.wordpress.com/2010/08/25/geb-and-grails-tips-tricks-and-gotchas/ или https://github.com/hexaacta/weet/blob/master/weet/src/groovy/com/hexacta/weet/pages/AjaxPage.groovy также не закрывает метод, используя 5-секундную спецификацию.

Пример кода, использующего каждый из этих подходов (класс тайм-аута, метод тайм-аута и метод ожидания), находится по адресу https://gist.github.com/ledlogic/b152370b95e971b3992f

Мой вопрос: кто-нибудь нашел способ успешно запустить тест Spock, чтобы проверить, что правила f5 сбрасывают соединения?


person ledlogic    schedule 06.08.2014    source источник
comment
Вы случайно не нашли решение этой проблемы?   -  person Joerg S    schedule 18.10.2019


Ответы (1)


Для меня сработало использование аннотации @ThreadInterrupt вместе с аннотацией @Timeout:

@ThreadInterrupt
@Timeout(value = 100, unit = MILLISECONDS)
def 'timeout test'() {
    expect:
    while(1) {true}
}

Полную документацию вы найдете здесь: http://docs.groovy-lang.org/docs/next/html/documentation/#GroovyConsole-Interrupt

Однако этого может быть недостаточно для прерывания сценария: нажатие кнопки прервет поток выполнения, но если ваш код не обрабатывает флаг прерывания, сценарий, скорее всего, продолжит работу, и вы не сможете эффективно его остановить. Чтобы избежать этого, вы должны убедиться, что пункт меню «Сценарий»> «Разрешить прерывание» отмечен флажком. Это автоматически применит преобразование AST к вашему скрипту, который позаботится о проверке флага прерывания (@ThreadInterrupt). Таким образом, вы гарантируете, что сценарий может быть прерван, даже если вы явно не обрабатываете прерывание, за счет дополнительного времени выполнения.

person Joerg S    schedule 18.10.2019