#gradle #spock #geb
#gradle #spock #geb
Вопрос:
У меня есть набор спецификаций, которые необходимо запускать в точном порядке, чтобы последняя спецификация была актуальной. Эти спецификации должны зависеть друг от друга из-за сложного варианта использования, связанного с отказоустойчивостью сервера (1 сервер отключается, другой подключается для продолжения).
Чтобы это произошло, я назвал свои спецификации буквенно-цифровыми как «T101_Something1», «T102_Something2», … «T109_LastSpec».
Однако при запуске моих тестов с помощью команды «gradle firefoxTest» тесты выполняются не в алфавитно-цифровом порядке, в результате чего последняя спецификация не имеет значения и всегда завершается ошибкой.
Как определяется порядок выполнения спецификаций Spock при использовании gradle с Geb framework?
Ответ №1:
Test
Задача Gradle не дает никаких гарантий относительно порядка, в котором будут выполняться тестовые классы. (Если Test#maxParallelForks
установлено значение больше 1, они могут даже выполняться параллельно.) Наилучшей практикой для Spock / Geb является сохранение тестов, зависящих от порядка, в том же классе тестов, аннотированном @Stepwise
. Если вам необходимо обеспечить соблюдение порядка между тестовыми классами, возможно, посмотрите на наборы тестов JUnit 4, которые можно использовать вместе со Spock . Другим (вероятно, менее желательным) вариантом было бы разделить выполнение теста на несколько Test
задач, порядок выполнения которых можно контролировать dependsOn
.
Комментарии:
1. спасибо за быстрые ответы! К сожалению, gradle не предоставляет средства гарантированного порядка выполнения. Одним из решений было бы объединить все соответствующие функции в одну спецификацию, но это была бы одна раздутая спецификация. Это будет последнее средство. Я опубликую, если найду лучший вариант. Еще раз спасибо!
Ответ №2:
Нам пришлось создать пользовательский тестовый модуль JUnit и запустить его как:
gradlew -DfirefoxTest.single=CustomJUnitSpecRunner firefoxTest
Файл CustomJUnitSpecRunner.groovy:
package spec
import org.junit.runner.RunWith
import org.junit.runners.Suite
import spec.Spec1
import spec.Spec2
import spec.Spec3
@RunWith(Suite.class)
@Suite.SuiteClasses([Spec1.class, Spec2.class, Spec3.class])
class CustomJUnitSpecRunner {
}
Это позволяет нам гарантировать порядок выполнения наших спецификаций Spock при каждом их запуске.
Комментарии:
1. Объединение спецификаций Spock в наборы JUnit довольно потрясающе.! o / Спасибо!