При использовании gradle с Geb, как определяется порядок выполнения для моих спецификаций?

#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 / Спасибо!