Sbt условно, если еще конфигурация стиля - PullRequest
3 голосов
/ 13 февраля 2020

Я хочу иметь возможность переключаться между параллельным и последовательным выполнением scala тестов с помощью командной строки.

Рабочий пример с системным свойством "test.par":

val parallelTestOpt = Option(System.getProperty("test.par"))

testOptions in IntegrationTest += Tests.Argument(
  //Configure distributor's pool size
  parallelTestOpt.map(count =>s"-P$count").getOrElse("-P1")
)

lazy val root = (project in file("."))
  .configs(IntegrationTest)
  .settings(Defaults.itSettings,
      //If suites are executed in parallel
      IntegrationTest / parallelExecution := parallelTestOpt.exists(_ != "1"),
      IntegrationTest / testForkedParallel := parallelTestOpt.exists(_ != "1")
  )

Часть "problemmati c" - это parallelTestOpt.map(count =>s"-P$count").getOrElse("-P1"). Я не хочу указывать значение по умолчанию «-P1», если свойство «test.par» не указано. Какова наилучшая практика для достижения этого?

Может быть, вся концепция неверна, и я должен сделать это по-другому?

1 Ответ

2 голосов
/ 13 февраля 2020

В качестве альтернативного подхода рассмотрите возможность разделения проблемы параллелизма на настраиваемую команду с одним аргументом

commands += Command.single("testpar") { (state, numOfThreads) =>
  s"""set IntegrationTest / testOptions  += Tests.Argument("-P$numOfThreads")"""::
     "set IntegrationTest / parallelExecution := true" ::
     "set IntegrationTest / testForkedParallel := true" ::
     "IntegrationTest / test" :: state
}

и выполните, скажем, testpar 6 для запуска с пулом из 6 потоков ,


Обращаясь к комментарию, для безопасности во время компиляции попробуйте

commands += Command.single("testpar") { (state, numOfThreads) =>
  val extracted = Project.extract(state)
  val stateWithParallel= extracted.appendWithSession(
    Seq(
      IntegrationTest / testOptions  += Tests.Argument(s"-P$numOfThreads"),
      IntegrationTest / parallelExecution := true,
      IntegrationTest / testForkedParallel := true,
    ),
    state
  )
  extracted.runTask(IntegrationTest / test, stateWithParallel)
  state
}
...