Scalatest — набор параллельно

#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 extends OneInstancePerTest создает новый набор тестов, а затем SuiteMixedSequentialParallel последовательно запускает тесты. Почему вы пишете SuiteMixedSequentialParallel ? Может sbt test сделать это за вас? тот же код предоставит то, что вы ищете

5. Моя настройка, возможно, немного странная, но у меня есть переопределенный пошаговый класс, в котором я переопределяю def run метод. Мне действительно нужно взаимодействовать с «системой отчетов о тестировании» (для XRay Jira). Необходимо создать новое «выполнение теста» (xray) (возвращает уникальный «идентификатор выполнения теста») для каждого тестового запуска. Все тесты сообщают о результатах своих тестов этому самому «выполнению теста» (с заданным идентификатором). Подводя итог: я использую «отцовский» набор для обработки связи с системой отчетности.