#scala #parallel-processing #scalatest
#scala #параллельная обработка #scalatest
Вопрос:
Я использую набор (Scalatest-версия: 3.2.2), в котором есть несколько тестовых наборов внутри:
class SuiteMixedSequentialParallel
extends Stepwise(
new TestInParallel,
new TestSequentially
)
Теперь я хочу, чтобы все тесты в TestInParallel
должны выполняться параллельно, все тесты в TestSequentially
должны выполняться последовательно.
Поэтому я расширил TestInParallel
из ParallelTestExecution
class TestInParallel extends AnyFunSuite with ParallelTestExecution {
(0 to 10).foreach(i =>
test(s"$i") {
Thread.sleep(500)
println(s"TestInParallel $i")
}
)
}
class TestSequentially extends AnyFunSuite {
(0 to 10).foreach(i =>
test(s"$i") {
Thread.sleep(200)
println(s"TestSequentially $i")
}
)
}
Когда я запускаю sbt testOnly TestInParallel
, все тесты выполняются параллельно.
Но:
Когда я запускаю sbt testOnly SuiteMixedSequentialParallel
, все тесты выполняются последовательно.
Есть ли у кого-нибудь подсказка, как добиться того, чтобы мои тесты в TestInParallel
выполнялись параллельно, когда я запускаю SuiteMixedSequentialParallel
?
Наборы TestInParallel
и TestSequentially
все равно должны выполняться последовательно. Просто тесты в TestInParallel
должны выполняться параллельно.
Комментарии:
1. Примечание: если вам нужен диапазон
Int
значений, которые вы можете использоватьList.range(0, 10)
(первое число является включительным, последнее — исключительным).2. Спасибо! Хорошая подсказка. Хм, теперь мне не терпится соответствующим образом изменить код в моем примере. Но тогда ваш комментарий больше не будет иметь смысла. Итак, я оставляю
List.tabulate(10)(identity)
, как есть.3. Кстати, могло бы быть еще проще
for (i <- 0 to 10) { test(...) }
. Нет необходимости редактировать ваш код. Или прокомментируйте, что вы его отредактировали, и отредактируйте его, любой человек, читающий комментарии, поймет. 🙂4. Отредактировал примеры кода с помощью этих комментариев, чтобы сделать пример более кратким.
Ответ №1:
Когда выполняется StepsSuite, независимо от того, передан ли дистрибутив, он будет выполнять свои вложенные наборы последовательно в переданном порядке: Step1Suite, Step2Suite, Step3Suite, Step4Suite и Step5Suite.
Из документации ParallelTestExecution:
Обычный подход ScalaTest к параллельному запуску наборов тестов заключается в параллельном запуске разных наборов, но тесты любого одного набора выполняются последовательно.
Поэтому, когда вы объединяете два вышеперечисленных, вы блокируете параллельный запуск scalatest, так что даже TestInParallel
выполняется последовательно.
Чтобы решить эту проблему, вам нужно смешать ParallelTestExecution
признак с SuiteMixedSequentialParallel
, что означает:
class SuiteMixedSequentialParallel
extends Stepwise(
new TestInParallel,
new TestSequentially
) with ParallelTestExecution
Это позволит запускать оба набора параллельно, тесты в TestInParallel
параллельно и тесты из TestSequentially
последовательно. По желанию.
Чтобы убедиться в этом, я изменил println
с Hallo Welt
на TestInParallel
и TestSequentially
соответственно.
Результат, который я получил, таков:
TestInParallel 8
TestInParallel 4
TestInParallel 0
TestInParallel 7
TestInParallel 5
TestInParallel 3
TestSequentially 0
TestInParallel 2
TestInParallel 1
TestInParallel 9
TestInParallel 6
TestSequentially 1
TestSequentially 2
TestSequentially 3
TestSequentially 4
TestSequentially 5
TestSequentially 6
TestSequentially 7
TestSequentially 8
TestSequentially 9
Комментарии:
1. Спасибо за ваш ответ! 😉 К сожалению, я был не так точен в своем вопросе, как следовало бы. Чего я хочу добиться, так это того, чтобы наборы
TestInParallel
иTestSequentially
выполнялись последовательно. Только тесты в набореTestInParallel
должны выполняться параллельно. В моем проекте у меня, конечно, намного больше наборов. Я просто хочу, чтобы некоторые из них выполняли свои тесты параллельно. Я отредактирую свой вопрос, чтобы это стало более понятным. Еще раз спасибо за ваш ответ. Это все еще очень полезно знать.2. Почему вы хотите, чтобы ваши тесты выполнялись последовательно?
3. Потому что некоторые наборы изменяют состояние в базе данных и могут повредить друг другу.
4. Я не уверен, что это возможно, поскольку
TestInParallel
extendsOneInstancePerTest
создает новый набор тестов, а затем SuiteMixedSequentialParallel последовательно запускает тесты. Почему вы пишетеSuiteMixedSequentialParallel
? Можетsbt test
сделать это за вас? тот же код предоставит то, что вы ищете5. Моя настройка, возможно, немного странная, но у меня есть переопределенный пошаговый класс, в котором я переопределяю
def run
метод. Мне действительно нужно взаимодействовать с «системой отчетов о тестировании» (для XRay Jira). Необходимо создать новое «выполнение теста» (xray) (возвращает уникальный «идентификатор выполнения теста») для каждого тестового запуска. Все тесты сообщают о результатах своих тестов этому самому «выполнению теста» (с заданным идентификатором). Подводя итог: я использую «отцовский» набор для обработки связи с системой отчетности.