scoverage: объединить покрытие из теста и оно: test - PullRequest
0 голосов
/ 24 января 2019

Я разделил свои модульные и интеграционные тесты с фильтром:

  lazy val FunTest = config("it") extend Test

  def funTestFilter(name: String): Boolean = name endsWith "Spec"

  def unitTestFilter(name: String): Boolean = name endsWith "Test"

  ...
  testOptions in Test := Seq(Tests.Filter(unitTestFilter)),
  testOptions in FunTest := Seq(Tests.Filter(funTestFilter)),
  ...

Так что я могу сделать что-то подобное:

sbt clean coverage test dockerComposeUp it:test dockerComposeStop coverageReport

К сожалению, это убивает все мое Покрытие, только сгенерированное BuildInfo имеет Покрытие.

Использование только sbt clean coverage test coverageReport или sbt clean coverage it:test coverageReport работает как положено.

Весь проект можно найти здесь: https://github.com/pme123/play-binding-form

Версия scoverage: 1.5.1

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

вместо того, чтобы иметь разные объекты buildinfo в зависимости от фазы, что может привести к ошибкам компиляции, вы можете использовать свое время сборки.

lazy val buildTime: SettingKey[String] = SettingKey[String]("buildTime", "time of build")

ThisBuild / buildTime := ZonedDateTime.now(ZoneOffset.UTC).toString

buildInfoKeys :=
  Seq[BuildInfoKey](
    name,
    version,
    scalaVersion,
    sbtVersion,
    buildTime
  )

Это должно решить эту проблему.У меня есть эта конфигурация в моем проекте, потому что я хотел лучше контролировать форматирование даты, и у меня нет той же проблемы

0 голосов
/ 31 января 2019

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

В этом случае плагин sbt-buldinfo включен в модуле server. Он регистрирует генератор исходного кода, который выполняется перед каждой компиляцией и генерирует файл server/target/scala_2.12/src_managed/main/sbt-buildinfo/BuildInfo.scala.

Плагин SBT BuildInfo достаточно умен, чтобы регенерировать этот файл только при изменении его содержимого, но, поскольку BuildInfoOption.BuildTime включен в настройку buildInfoOptions, Этот файл восстанавливается перед каждой компиляцией.

Когда дело доходит до процесса компиляции, компилятор каждый раз находит один измененный файл (BuildInfo.scala) и запускает пошаговую компиляцию этого одного файла. Scoverage очищает свою предыдущую информацию об инструментах и ​​сохраняет только информацию о файле BuildInfo.scala.

В случае выполнения, подобного sbt clean coverage test dockerComposeUp it:test dockerComposeStop coverageReport, первый процесс компиляции является частью задачи test, а второй - it:test. Вот почему нет проблем, когда они используются отдельно.

Докер не имеет никакого отношения к нашей проблеме.

Чтобы решить эту проблему, вы должны предотвращать BuildInfo.scala регенерацию файлов при каждой компиляции, по крайней мере, когда включено покрытие. Я сделал это, изменив файл project/Settings.scala следующим образом:

  private lazy val buildInfoSettings = Seq(

    buildInfoKeys := Seq[BuildInfoKey](name, version, scalaVersion, sbtVersion),

    buildInfoOptions ++= { if (coverageEnabled.value) Seq() else Seq(BuildInfoOption.BuildTime) }, // <-- this line was changed
    buildInfoOptions += BuildInfoOption.ToJson,

    buildInfoPackage := "pme123.adapters.version"
  )

buildInfoOptions не включает параметр BuildTime при включенном покрытии.

Это не выглядит элегантно, но работает. Вы, вероятно, можете найти лучший способ.

...