4

私の目標は、jacoco を私の play 2.2.0 プロジェクトに統合することです。私が従おうとしたWeb上のさまざまなガイドは、ほとんどが混乱を招き、目標に近づきませんでした.

混乱を招く

  • ほとんどのガイドは build.sbt の存在を前提としています
    • これは、異なる build.scala に取って代わられているようです
  • jacoco4sbtと通常のjacocoがあります
    • scala play フレームワーク 2 で使用するのに最も適しているのはどれですか?

現在の状態

plugins.sbt に追加

addSbtPlugin("de.johoop" % "jacoco4sbt" % "2.1.2")

build.scala に追加

import de.johoop.jacoco4sbt.JacocoPlugin._
lazy val jacoco_settings = Defaults.defaultSettings ++ Seq(jacoco.settings: _*)

これらの変更により、sbt でも play コンソールでも "jacoco" タスクが発生しなくなりました。

これを機能させるための適切な手順は何ですか?

要求に応じて build.scala のコンテンツを更新します

import com.typesafe.sbt.SbtNativePackager._
import com.typesafe.sbt.SbtScalariform._
import play.Project._
import sbt.Keys._
import sbt._
import sbtbuildinfo.Plugin._
import de.johoop.jacoco4sbt.JacocoPlugin._

object BuildSettings {
  val buildOrganization = "XXXXX"
  val buildVersion      = "0.1"
  val buildScalaVersion = "2.10.2"
  val envConfig = "-Dsbt.log.format=false -Dconfig.file=" + Option(System.getProperty("env.config")).getOrElse("local.application")
  scalacOptions ++= Seq("-encoding", "UTF-8", "-deprecation", "-unchecked", "-feature")
  javaOptions += envConfig

  val buildSettings = Defaults.defaultSettings ++ Seq (
    organization := buildOrganization,
    version      := buildVersion,
    scalaVersion := buildScalaVersion
  )
}

object Resolvers {
  val remoteRepoUrl =  "XXXXXXXXXXXX" at "http://nexus.cXXXXX/content/repositories/snapshots/"
  val publishRepoUrl = "XXXXXXXXXXXX" at "http://nexus.ciXXXXXXXXXXXXXXXX/content/repositories/snapshots/"
}

object Dependencies {
  val ods =  "XXXXXXXXX" % "XXXXXX-ws" % "2.2.1-SNAPSHOT"
  val scalatest = "org.scalatest" %% "scalatest" % "2.0.M8" % "test"
  val mockito = "org.mockito" % "mockito-all" % "1.9.5" % "test"
}

object ApplicationBuild extends Build {

  import BuildSettings._
  import Dependencies._
  import Resolvers._

  // Sub-project specific dependencies
  val commonDeps = Seq(
    ods,
    scalatest,
    mockito
  )
  //val bN = settingKey[Int]("current build Number")
  val gitHeadCommitSha = settingKey[String]("current git commit SHA")
  val release = settingKey[Boolean]("Release")

  lazy val jacoco_settings = Defaults.defaultSettings ++ Seq(jacoco.settings: _*)

  lazy val nemo = play.Project(
    "nemo",
    path = file("."),
    settings = Defaults.defaultSettings ++ buildSettings ++
      Seq(libraryDependencies ++= commonDeps) ++
      Seq(scalariformSettings: _*) ++
      Seq(playScalaSettings: _*) ++
      buildInfoSettings ++
      jacoco_settings ++
      Seq(
        sourceGenerators in Compile <+= buildInfo,
        buildInfoKeys ++= Seq[BuildInfoKey](
          resolvers,
          libraryDependencies in Test,
          buildInfoBuildNumber,
          BuildInfoKey.map(name) { case (k, v) => "project" + k.capitalize -> v.capitalize },
          "envConfig" -> envConfig, // computed at project load time
          BuildInfoKey.action("buildTime") {
            System.currentTimeMillis
          } // re-computed each time at compile
        ),
        buildInfoPackage := "com.springer.nemo"
      ) ++
      Seq(resolvers += remoteRepoUrl) ++
      Seq(mappings in Universal ++= Seq(
        file("ops/rpm/start-server.sh") -> "start-server.sh",
        file("ops/rpm/stop-server.sh") -> "stop-server.sh"
      ))
  ).settings(version <<=  version in ThisBuild)

  lazy val nemoPackaging = Project(
    "nemoPackaging",
    file("nemoPackaging"),
    settings = Defaults.defaultSettings ++Seq(Packaging.settings:_*)
  )



  def publishSettings =
    Seq(
      publishTo := Option(publishRepoUrl),
      credentials += Credentials(
        "Repo", "http://mycompany.com/repo", "admin", "admin123"))

}

注: jacoco はこれで実行されていますが、テストを取得しません。出力:

jacoco:cover
[info] Compiling 1 Scala source to /home/schl14/work/nemo/target/scala-2.10/classes...
[info] ScalaTest
[info] Run completed in 13 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] All tests passed.
[info] Passed: Total 0, Failed 0, Errors 0, Passed 0
[info] No tests to run for nemo/jacoco:test
4

3 に答える 3

4

こうすることで解決しました。

以下を plugins.sbt に追加します。

addSbtPlugin("de.johoop" % "jacoco4sbt" % "2.1.2")

build.scala に新しいインポートを追加しました

import de.johoop.jacoco4sbt.JacocoPlugin._

このように構成セクションにjacocoを追加しました

lazy val xyz = play.Project(
    "xyz",
    path = file("."),
    settings = Defaults.defaultSettings
      jacoco.settings ++ //this is the important part. 
  ).settings(parallelExecution in jacoco.Config := false) //not mandatory but needed in `most cases as most test can not be run in parallel`

これらの手順の後、jacoco:cover が sbt および play コンソールで利用可能になり、テストも検出されました。

于 2013-11-07T16:08:52.410 に答える
3

Scala コード カバレッジのより良いオプションは、ステートメント行のカバレッジを提供する Scoverage です。 https://github.com/scoverage/scalac-scoverage-plugin

project/plugins.sbt に追加:

addSbtPlugin("com.sksamuel.scoverage" % "sbt-scoverage" % "1.0.1")

次に、SBTを実行します

sbt clean coverage test
于 2014-01-12T21:02:37.103 に答える
1

Java コードのコード カバレッジを測定するには、 jacoco4sbtが最適です。

project/plugins.sbt に追加:

addSbtPlugin("de.johoop" % "jacoco4sbt" % "2.1.2")

build.sbt の末尾に追加:

jacoco.settings

次に、ターミナルで実行します。

//or just the sbt command and then use your browser
sbt jacoco:cover && /usr/bin/x-www-browser target/scala-2.10/jacoco/html/index.html

Scala コードのカバレッジは、SCCTによって決定することもできます。

project/plugins.sbt に追加:

addSbtPlugin("com.github.scct" % "sbt-scct" % "0.2.1")

build.sbt の末尾に追加:

ScctPlugin.instrumentSettings

そして、カバレッジを確認するには:

sbt scct:test && /usr/bin/x-www-browser target/scala_2.10/coverage-report/index.html

多分あなたはエラーを取得します

--allow-file-access-from-files でブラウザを再起動するか、別のブラウザを使用してください。

Chrome を使用していて、セキュリティ設定がローカル ファイルでの動的アクションを禁止している可能性があります。Firefox でページを開くかpython -m SimpleHTTPServer 8000、http プロトコルにバインドして開くことができますhttp://localhost:8000/target/scala-2.10/coverage-report/

生成されたクラスをレポートから除外する必要があるインスピレーションは、メーリング リストで見つけることができます。

私のテスト プロジェクトはGitHubにあります。

于 2013-11-05T18:48:17.850 に答える