sbt play настройка проекта кросс-сборки: бегун uTest неправильно разделяет проекты клиент / сервер

Я использую build.sbt с настройками кросс-компиляции и в основном это адаптированная версия "Поиграйте с примером scala-js" и у меня возникли проблемы с получением чистой настройки для моих тестов. В частности, при запуске моих серверных тестов также выполняются мои клиентские тесты (чего я хочу избежать).

Я выполнил инструкции из Не могу заставить uTest просмотреть мои тесты и добавил

libraryDependencies + = "com.lihaoyi" %%% "utest"% "0.3.0"

Мои тесты по какой-то причине не выполнялись, пока я не добавил

testFrameworks + = новый TestFramework ("utest.runner.Framework")

к каждому определению проекта. Также не добавляется

"com.lihaoyi" %% "utest"% "0.3.1"% "test"

на стороне сервера запускает серию

не найдено: объект utest [error] import utest._ -style errors.

На мой взгляд, мне вообще не нужно было добавлять эти дополнительные настройки, если у меня чистая настройка. Вот мой 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

А вот краткое изложение моих проблем:

  • когда я запускаю клиент / тест, выполняются только клиентские тесты
  • при запуске play-with-scalajs-example / 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

Большое спасибо и добрые пожелания


person Simon Lischka    schedule 16.10.2015    source источник
comment
Удалить aggregate(clients.map(projectToRef): _*).. Эта штука явно просит sbt, что всякий раз, когда вы запускаете задачу на server, она также запускает ту же задачу на client.   -  person sjrd    schedule 16.10.2015
comment
Привет, спасибо, что указали мне на агрегат. Удаление его действительно помогло, я в конечном итоге изменил его, чтобы дополнительно включать общие тесты при запуске теста сервера / теста или клиента.   -  person Simon Lischka    schedule 17.10.2015


Ответы (1)


Комментарий sjrd об удалении агрегата указал мне на правильный путь. Удаление остановлено

server/test

от выполнения как серверных, так и клиентских тестов. Как указано в sjrd, используемая агрегатная функция также запускает каждую задачу, которая выполняется на сервере на клиенте.

Агрегация означает, что при выполнении задачи в агрегированном проекте она также будет выполняться в агрегированных проектах. (См .: sbt doc)

Поскольку я также хотел запускать общие тесты как для клиентского, так и для серверного проекта при запуске теста, я изменил агрегатную функцию для определения серверного проекта и добавил дополнительный агрегат в определение клиентского проекта. :

По умолчанию сервера:

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 и, таким образом, отключены - мы постараемся найти лучший способ справиться с этим.

person Simon Lischka    schedule 17.10.2015