Как заставить SBT выполнять тестовые наборы параллельно? - PullRequest
1 голос
/ 26 октября 2019

У меня есть набор интеграционных тестов, выполняемых sbt, учитывая наборы тестов N с 1..M тестами для каждого пакета. Я установил fork in IntegrationTest := true, но наборы тестов всегда выполняются последовательно. Согласно документации, это не должно иметь место: тестовые наборы должны выполняться одновременно.

тестовые наборы представляют собой следующий класс:

class MyTestSuite1 extends FlatSpec with Matchers 
...
it should "do A" {}
it should "do B" {}
class MyTestSuite2 extends FlatSpec with Matchers 
...
it should "do C" {}
it should "do D" {}

проблема

MyTestSuite1 и MyTestSuiteN выполняются последовательно (в точном порядке алфавита)

ожидание

MyTestSuite1 и MyTestSuiteM выполняются одновременно

env

.sbopts:

-J-Xms1G
-J-Xmx4G
-J-XX:MaxMetaspaceSize=512m
-J-Xss4M

note

Я заметил, что все тесты выполняются с использованием одного пула и потока, например, pool-1-thread-1 для всех тестов.

версия sbt: 1.2.8 Scala: 2.12.8 os: MacOS 10.15, Ubuntu 19.04 Scalatest ver: 3.2.0-SNAP10

Пробный sbt v. 1.3.2 - тот же результат. Добавление

testOptions in IntegrationTest += Tests.Argument(TestFrameworks.ScalaTest, "-P4"),

не помогает.

============

Обновление

fork in(IntegrationTest, test) := true работает наглобальный уровень, но у меня есть 2 проекта, и я хочу заставить его работать, чтобы сохранить относительный путь к proj.

например

lazy val `p1` = Project(id = "p1", base = file("./p1"))
  .configs(IntegrationTest)
  .settings(Defaults.itSettings: _*)
  .settings(
    fork in(IntegrationTest, test) := true,
    ...)

lazy val `p2` = Project(id = "p2", base = file("./p2"))
  .configs(IntegrationTest)
  .settings(Defaults.itSettings: _*)
  .settings(
    fork in(IntegrationTest, test) := true,
    ...)

не запускает тесты параллельно

вместо этого, он работает параллельно, но, очевидно, домашний каталог установлен на "."вместо "./p1" или "./p2" соответственно:

fork in(IntegrationTest, test) := true

lazy val `p1` = Project(id = "p1", base = file("./p1"))
  .configs(IntegrationTest)
  .settings(Defaults.itSettings: _*)

Ответы [ 2 ]

0 голосов
/ 30 октября 2019

РЕШЕНИЕ:

Кажется, есть опция testForkedParallel in IntegrationTest := true, которая делает именно то, что мне нужно - она ​​порождает новую JVM для каждого набора тестов.

==============

Примечание:

Итак, единственная проблема состоит в том, что теперь он порождает JVM столько, сколько подсчитывает все доступные процессоры, и я не могу направить только тест на параллелизм:

ОПЦИЯ 1 - направляет все процессы sbt только на 2 параллельно

concurrentRestrictions in Global := Seq(Tags.limitAll(4))

ВАРИАНТ 2 - просто ничего не делает (тест в подпроекте)

concurrentRestrictions in Global += Tags.limit(Tags.Test, 4),
0 голосов
/ 27 октября 2019

По умолчанию тесты, выполняемые в разветвленной JVM, выполняются последовательно. Обратитесь к следующему пункту из документации sbt для тестирования:

Параметр:

Test / fork: = true

указывает, что все тесты будут выполняться в одном внешнемJVM. См. Форкинг для настройки стандартных опций для разветвления. По умолчанию тесты, выполняемые в разветвленной JVM, выполняются последовательно. Дополнительный контроль над тем, как тесты назначаются JVM и какие параметры для них передаются, доступен с помощью ключа testGrouping.

Итак, у вас есть два варианта:

  1. Не разветвлятьсяJVM и ваши тесты будут работать параллельно по умолчанию
  2. Если вы хотите параллельно выполнять форк-тесты и тесты рутирования, выполните следующие документы: https://www.scala -sbt.org / 1.x / docs / Testing.html# Форкинг + тесты
...