2017-08-03 1 views
0

J'ai une configuration d'application multi-projet SBT (Play Framework) comme suit. Tous les sous-modules sont sous modules mais tous les cas de test qui couvrent tous les sous-modules sont dans le projet "root".SBT + JaCoCo ne couvrant pas toutes les classes "jacoco.includes" de différents projets

|-application 
    |-src 
    |-conf 
    |-modules 
    | |-proj1 
    | | |-src 
    | | |-conf 
    | | |-target 
    | |-proj2 
    | | |-src 
    | | |-conf 
    | | |-target 
    | |-proj3 
    | | |-src 
    | | |-conf 
    | | |-target 
    | |-proj4 
    |  |-src 
    |  |-conf 
    |  |-target 
    |-test 
    | |-src //I have test cases of all other projs here 
    |-build.sbt 
    |-plugins.sbt 

Mon build.sbt ressemble à quelque chose comme ça.

name := """my-proj""" 

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

lazy val commonSettings = jacoco.settings ++ itJacoco.settings ++ Seq(
    organization := "me.abc", 
    version := "0.1.0", 
    scalaVersion := "2.11.7", 
    crossPaths := false, 
    routesGenerator := InjectedRoutesGenerator 
) 
lazy val appDependencies = Seq(
    cache, 
    "org.mockito" % "mockito-all" % "1.10.19" 
) 

lazy val scalacheck = "org.scalacheck" %% "scalacheck" % "1.13.4" 

lazy val aaRoot = (project in file(".")).configs(IntegrationTest).settings(commonSettings: _*).settings(
    libraryDependencies ++= appDependencies, 
    libraryDependencies += scalacheck % Test, 
    parallelExecution in Test := false, 
    javaOptions in Test += "-Dconfig.file=conf/" + Option(System.getProperty("test.config")).getOrElse("application") + ".conf", 
    parallelExecution in jacoco.Config := false, 
    jacoco.includes in jacoco.Config := Seq("./modules/*/target/classes/com/me/**/*"), 
    parallelExecution in itJacoco.Config := false, 
    itJacoco.includes in itJacoco.Config := Seq("./modules/*/target/classes/com/me/**/*"), 
    Keys.fork in itJacoco.Config := true, 
    Keys.fork in jacoco.Config := true 
).enablePlugins(PlayJava).disablePlugins(plugins.JUnitXmlReportPlugin).dependsOn(
    proj1 % "compile->compile", 
    proj2 % "compile->compile", 
    proj3 % "compile->compile", 
    proj4 % "compile->compile", 
).aggregate(
    proj1, 
    proj2, 
    proj3, 
    proj4 
) 

lazy val proj1 = (project in file("modules/proj1")).configs(IntegrationTest).settings(commonSettings: _*).settings(
    libraryDependencies ++= appDependencies 
).enablePlugins(PlayJava) 


fork in run := false 

PlayKeys.externalizeResources := false 

Comme vous pouvez le voir, aaRoot, je suis en train de jacoco.includes les fichiers de classe d'autres dossier cible du module (j'ai essayé plusieurs autres approches, mais rien n'a fonctionné). Tous les cas de test fonctionnent bien, mais jacoco ne pouvait rien couvrir.

[info] ------- Jacoco Coverage Report -------- 
[info] 
[info] Lines: 0% (>= required 0.0%) covered, 0 of 0 missed, OK 
[info] Instructions: 0% (>= required 0.0%) covered, 0 of 0 missed, OK 
[info] Branches: 0% (>= required 0.0%) covered, 0 of 0 missed, OK 
[info] Methods: 0% (>= required 0.0%) covered, 0 of 0 missed, OK 
[info] Complexity: 0% (>= required 0.0%) covered, 0 of 0 missed, OK 
[info] Class: 0% (>= required 0.0%) covered, 0 of 0 missed, OK 
[info] Check /Users/RP/application/target/jacoco for detail report 

Il est clair que le jacoco.includes ne regarde pas toutes les classes que je posais à regarder.

J'ai essayé de nombreuses façons et essayé d'utiliser it-jacoco:cover, mais rien n'a fonctionné. Tous les conseils ou l'aide seraient appréciés.

Répondre

0

C'est un problème. J'ai résolu mon problème et ai fait jacocosbt en travaillant avec ma configuration de projet et je pense que ma configuration de projet n'est pas trop mauvaise et tout à fait normale. Ce que j'ai, plusieurs sous-projets sous un projet racine et tous les cas de test liés aux sous-projets sont en root/test afin que je puisse tester les tests fonctionnels inter-modules. Après avoir lu et compris le code source du plugin jacocosbt, j'ai réalisé que cela dépend de deux choses principales. L'un est classesToCover et l'autre est "classes à instrument". Pour les "classes à instrument" cela dépend de products in Compile qui est le dossier "target/classes" dans le projet en cours dans lequel vous vous trouvez. Dans mon cas, "root/target/classes" n'a rien et il n'y a rien à l'insturment. Toutes mes classes sont dans le "root/modules/module1/target/classes" etc.

Tout ce dont j'avais besoin est de surcharger ce comportement. Le premier est facile et le second est un travail autour.

A mon build.sbt, j'ajouter adaptations suivantes

//Gets all the target/classes directories from sub projects 
lazy val myProducts = Def.task { 
    streams.value.log.info("Constructing the products!!!") 
    val finder: PathFinder = ((baseDirectory.value/"modules") ** "target" * "classes") filter {_.getAbsolutePath.indexOf("/project/") == -1} 
    finder.get 
} 

//Gets the classesToCover from all the sub projects 
lazy val myClassesToCover = Def.task { 
    val targetFolders: Seq[java.io.File] = myProducts.value 
    val inclFilters = Seq("*") map GlobFilter.apply 
    val exclFilters = Seq("Routes*","*Routes*","*Reverse*","*anonfun*", "*routes*") map GlobFilter.apply 

    targetFolders flatMap (classes => { 
    PathFinder(classes) ** new FileFilter { 
     def accept(f: File) = IO.relativize(classes, f) match { 
     case Some(file) if !f.isDirectory && file.endsWith(".class") => 
      val name = sbt.inc.Locate.toClassName(file) 
      inclFilters.exists(_ accept name) && !exclFilters.exists(_ accept name) 
     case _ => false 
    } 
    } get 
    }) 
} 

//Add them as settings for my root project 

lazy val root = (project in file(".")).settings(commonSettings: _*).settings(
    jacoco.settings, 
    parallelExecution in jacoco.Config := false, 
    Keys.fork in jacoco.Config := true, 
    jacoco.classesToCover in jacoco.Config ++= myClassesToCover.value, 
    products in Compile ++= myProducts.value 
).enablePlugins(PlayJava).disablePlugins(plugins.JUnitXmlReportPlugin).dependsOn(
    module1 % "test->test;compile->compile", 
    module2 % "test->test;compile->compile" 
).aggregate(
    module1, 
    module2 
) 

Quant SBT compile tâches dépend products cible Nous exécutez toujours compiler abord comme >sbt compile jacoco:cover.

J'ai testé ceci avec seulement la version plugin jacocosbt 2.1.6.