Извините, что опубликовал это как ответ, а не комментарий, но мне нужно место для кода.
Я не могу воспроизвести вашу проблему, учитывая предоставленные вами фрагменты кода вместо MCVE . Я воспроизвел упрощенную версию вашей ситуации, например, просто заменив в вашем примере операции, отнимающие много времени, на операторы Groovy sleep
или Java Thread.sleep
:
package de.scrum_master.stackoverflow.q60601740
import spock.lang.Specification
import spock.lang.Timeout
import static java.lang.System.currentTimeMillis
class StartupTest extends Specification {
def startTime = currentTimeMillis()
def timeElapsed() {
currentTimeMillis() - startTime
}
void checkConnectedProducts() {
for (int i = 1; i <= 5; i++) {
println "${timeElapsed()} | checkConnectedProducts #$i, sleeping 1 s"
Thread.sleep(1000)
}
}
int countError() {
println "${timeElapsed()} | countError, sleeping 4 s"
sleep 4000
return 3
}
@Timeout(3)
def 'Start_test'() {
setup:
true
when: 'Test_started'
true
and: 'Check_something'
true
then: 'Validate_something'
checkConnectedProducts()
cleanup:
countError()
println "${timeElapsed()} | cleanup, sleeping 4 s"
sleep 4000
println "${timeElapsed()} | cleanup finished"
}
}
Журнал консоли выглядит как ожидается:
64 | checkConnectedProducts #1, sleeping 1 s
1112 | checkConnectedProducts #2, sleeping 1 s
2114 | checkConnectedProducts #3, sleeping 1 s
3011 | countError, sleeping 4 s
[spock.lang.Timeout] Method 'Start_test' has not yet returned - interrupting. Next try in 0,50 seconds.
[spock.lang.Timeout] Method 'Start_test' has not yet returned - interrupting. Next try in 1,00 seconds.
[spock.lang.Timeout] Method 'Start_test' has not yet returned - interrupting. Next try in 2,00 seconds.
[spock.lang.Timeout] Method 'Start_test' has not yet returned - interrupting. Next try in 4,00 seconds.
7012 | cleanup, sleeping 4 s
[spock.lang.Timeout] Method 'Start_test' has not yet returned - interrupting. Next try in 8,00 seconds.
11012 | cleanup finished
Method timed out after 3,00 seconds
at de.scrum_master.stackoverflow.q60601740.StartupTest.checkConnectedProducts(StartupTest.groovy:18)
at de.scrum_master.stackoverflow.q60601740.StartupTest.Start_test(StartupTest.groovy:40)
Как вы можете видеть, первые 3 итерации for
l oop, каждая из которых занимает ~ 1 с, выполняются до того, как тайм-аут 3 с прерывает тест в методе вызывается из блока then:
. После этого блок очистки выполняется полностью, как вызываемый метод, так и прямой sleep
, каждый из которых тратит ~ 4 с в дополнение к 3 истекшим секундам. В общем, у нас есть 3 + 4 + 4 = 11 секунд, так что все работает как положено.
Если вы не можете предоставить MCVE, воспроизводящий вашу проблему, как вас об этом попросил Тим, я думаю, что в этом нет никаких проблем. Говорите, скорее, о чем-то, что вы неверно истолковали из выходных данных журнала или о другой проблеме в вашем коде, которую вы не показывали нам, такой как операция очистки или zip, выполненная в дополнительном потоке.