Настройка проекта sbt play cross build: бегун uTest неправильно разделяет проекты клиент / сервер
Я использую build.sbt, который имеет настройки кросс-компиляции и в основном является адаптированной версией " Play with scala-js example", и у меня возникли некоторые проблемы при получении чистой настройки для моих тестов. В частности, при выполнении моих тестов сервера также выполняются мои клиентские тесты (чего я хочу избежать).
Я следовал инструкциям Cannot get uTest, чтобы увидеть свои тесты, и добавил
libraryDependencies += "com.lihaoyi" %%% "utest" % "0.3.0"
Мои тесты по какой-то причине не выполнялись, пока я не добавил
testFrameworks += новая TestFramework("utest.runner.Framework")
к каждому определению проекта. Тоже не добавляю
"com.lihaoyi" %% "utest" % "0.3.1" % "test"
на стороне сервера запускает серию
не найдено: объект utest [ошибка] импорт utest._ -стиль ошибок.
По моему впечатлению, мне не нужно было добавлять эти дополнительные настройки вообще, если бы они были чистыми. Вот мой файл SBT:
import sbt.Project.projectToRef
lazy val clients = Seq(client)
lazy val scalaV = "2.11.7"
lazy val server = (project in file("server")).settings(
scalaVersion := scalaV,
scalaJSProjects := clients,
pipelineStages := Seq(scalaJSProd/*, gzip*/),
resolvers += "scalaz-bintray" at "https://dl.bintray.com/scalaz/releases",
libraryDependencies ++= Seq(
"com.vmunier" %% "play-scalajs-scripts" % "0.3.0",
"be.doeraene" %% "scalajs-pickling-play-json" % "0.4.0"
),
testFrameworks += new TestFramework("utest.runner.Framework")
).enablePlugins(PlayScala).
aggregate(clients.map(projectToRef): _*).
dependsOn(sharedJvm)
lazy val client = (project in file("client")).settings(
scalaVersion := scalaV,
persistLauncher := true,
persistLauncher in Test := false,
libraryDependencies ++= Seq(
"org.scala-js" %%% "scalajs-dom" % "0.8.0"
),
testFrameworks += new TestFramework("utest.runner.Framework")
).enablePlugins(ScalaJSPlugin, ScalaJSPlay).
dependsOn(sharedJs)
lazy val shared = (crossProject.crossType(CrossType.Pure) in file("shared")).
settings(scalaVersion := scalaV,
libraryDependencies ++= Seq(
"com.lihaoyi" %%% "utest" % "0.3.1",
"be.doeraene" %%% "scalajs-pickling-core" % "0.4.0",
"com.lihaoyi" %%% "pprint" % "0.3.6"
),
testFrameworks += new TestFramework("utest.runner.Framework")
).
jsConfigure(_ enablePlugins ScalaJSPlay)
lazy val sharedJvm = shared.jvm
lazy val sharedJs = shared.js
// loads the Play project at sbt startup
onLoad in Global := (Command.process("project server", _: State)) compose (onLoad in Global).value
И вот краткое изложение моих проблем:
- когда я запускаю client / test, выполняются только клиентские тесты
- при запуске play-with-scalajs-example / test, клиент + общие тесты выполняются
- и как ни странно при запуске server / test мой сервер И клиентские тесты выполняются
Как я могу изменить настройки моего проекта на
- найти тесты моего сервера при запуске server / test
- запуск всех тестов при запуске play-with-scalajs-example / test
- и дополнительно включая общие тесты при запуске сервера / теста или теста клиента?
А на другом узле есть ли способ отключить скаляры? Это приводит к довольно нечитаемому результату теста:
[info] 1/2 TestSimpleServerSuite.absolutely simple test on the server side Success
[info] 2/2 TestSimpleServerSuite Success
[info] utest
[info] -----------------------------------Results-----------------------------------
[info]
[info]
[info] Tests: 0
[info] Passed: 0
[info] Failed: 0
[info] Passed: Total 2, Failed 0, Errors 0, Passed 2
[info] 1/2 TestSimpleClientSuite.absolutely simple test on the client side Success
[info] 2/2 TestSimpleClientSuite Success
[info] 1/2 SimpleClient.TestSimpleClientSuite.absolutely simple test on the client side Success
[info] 2/2 SimpleClient.TestSimpleClientSuite Success
[info] ScalaCheck
[info] Passed: Total 0, Failed 0, Errors 0, Passed 0
[info] ScalaTest
[info] Run completed in 1 second, 751 milliseconds.
[info] Total number of tests run: 0
[info] Suites: completed 0, aborted 0
[info] Tests: succeeded 0, failed 0, canceled 0, ignored 0, pending 0
[info] No tests were executed.
[info] utest
[info] -----------------------------------Results-----------------------------------
[info] SimpleClient.TestSimpleClientSuite Success
[info] absolutely simple test on the client side Success
[info] TestSimpleClientSuite Success
[info] absolutely simple test on the client side Success
[info]
[info] Tests: 4
[info] Passed: 4
[info] Failed: 0
[info] Passed: Total 4, Failed 0, Errors 0, Passed 4
[success] Total time: 11 s, completed 16.10.2015 03:25:59
Спасибо большое и всего наилучшего
1 ответ
sjrd об удалении агрегата указал мне правильный путь. Удаление остановилось
server/test
от выполнения тестов сервера и клиента. Как указывал sjrd, используемая агрегатная функция также запускает каждую задачу, выполняемую на сервере на клиенте.
Агрегация означает, что выполнение задачи в агрегированном проекте также будет запускать ее в агрегированных проектах. (См. Документ sbt)
Так как при запуске теста я также хотел запускать общие тесты как для клиентского, так и для серверного проекта, я изменил функцию агрегирования для определения проекта сервера и добавил дополнительный агрегат в определение проекта клиента.:
Сервер по умолчанию:
lazy val server = (project in file("server")).settings(
scalaVersion := scalaV,
scalaJSProjects := clients,
pipelineStages := Seq(scalaJSProd/*, gzip*/),
resolvers += "scalaz-bintray" at "https://dl.bintray.com/scalaz/releases",
libraryDependencies ++= Seq(
"com.vmunier" %% "play-scalajs-scripts" % "0.3.0",
"be.doeraene" %% "scalajs-pickling-play-json" % "0.4.0",
"com.lihaoyi" %% "utest" % "0.3.1" % "test"
),
testFrameworks += new TestFramework("utest.runner.Framework")
).enablePlugins(PlayScala).
/*
* Executes shared tests compiled to JVM with server/test
*/
aggregate(projectToRef(sharedJvm)). // Former: aggregate(clients.map(projectToRef): _*). before
dependsOn(sharedJvm)
Определение клиента:
lazy val client = (project in file("client")).settings(
scalaVersion := scalaV,
persistLauncher := true,
persistLauncher in Test := false,
libraryDependencies ++= Seq(
"org.scala-js" %%% "scalajs-dom" % "0.8.0"
),
testFrameworks += new TestFramework("utest.runner.Framework")
).enablePlugins(ScalaJSPlugin, ScalaJSPlay).
/*
* Executes shared tests compiled to JS with client/test
*/
aggregate(projectToRef(sharedJs)).
dependsOn(sharedJs)
При запуске тестов с помощью play-with-scalajs-example/test теперь выполняются все тесты, включая общие тесты, скомпилированные отдельно для JS и JVM.
Что касается необходимости явного включения utest зависимостей, то кажется, что клиентские и серверные проекты не являются производными от crossProject и, следовательно, отсоединяются - будут искать лучший способ справиться с этим.