From 255a61cf563ae4bb307dedc167250bfcfe56974c Mon Sep 17 00:00:00 2001 From: Christian Basler Date: Sun, 12 Oct 2025 14:11:25 +0200 Subject: [PATCH] Coverage reporting improvements - add coverage to sonar - coverage in domain and commonUI --- build.gradle.kts | 35 +++++++++++++++++++++++++++++++++-- commonUI/build.gradle.kts | 21 ++++++++++++++------- domain/build.gradle.kts | 31 ------------------------------- 3 files changed, 47 insertions(+), 40 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 900641c..309ada9 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,10 +1,11 @@ +import com.android.build.gradle.internal.coverage.JacocoReportTask +import com.android.build.gradle.internal.lint.AndroidLintTask import com.github.benmanes.gradle.versions.updates.DependencyUpdatesTask import org.jetbrains.kotlin.gradle.dsl.JvmTarget import org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompile +import org.sonarqube.gradle.SonarTask plugins { - // this is necessary to avoid the plugins to be loaded multiple times - // in each subproject's classloader alias(libs.plugins.versions) alias(libs.plugins.sonarqube) alias(libs.plugins.android.application) apply false @@ -20,9 +21,31 @@ sonar { properties { property("sonar.projectKey", "YAEP") property("sonar.projectName", "YAEP") + + val reports = subprojects + .flatMap { p -> + p.tasks.withType() + } + .map { t -> + "${t.outputReportDir.asFile.get()}/report.xml" + } + + property( + "sonar.coverage.jacoco.xmlReportPaths", + reports + ) } } +tasks.withType().configureEach { + dependsOn( + subprojects.flatMap { it.tasks.withType() } + ) + dependsOn( + subprojects.flatMap { it.tasks.withType() } + ) +} + tasks.withType().configureEach { compilerOptions { jvmTarget.set(JvmTarget.fromTarget(libs.versions.jdk.get())) @@ -41,3 +64,11 @@ fun isNonStable(version: String): Boolean { || version.contains("beta", ignoreCase = true) || version.contains("RC", ignoreCase = true) } + +subprojects { + tasks.withType { + testLogging { + events("passed", "skipped", "failed") + } + } +} diff --git a/commonUI/build.gradle.kts b/commonUI/build.gradle.kts index 89fa7b8..d21c376 100644 --- a/commonUI/build.gradle.kts +++ b/commonUI/build.gradle.kts @@ -1,4 +1,5 @@ plugins { + jacoco alias(libs.plugins.kotlin.multiplatform) alias(libs.plugins.android.library) alias(libs.plugins.compose) @@ -11,13 +12,6 @@ kotlin { jvm() androidTarget() -// @OptIn(ExperimentalWasmDsl::class) -// wasmJs { -// moduleName = "yaep-commonUI" -// browser() -// binaries.executable() -// } - sourceSets { commonMain { dependencies { @@ -61,6 +55,19 @@ android { buildFeatures { compose = true } + + sourceSets { + getByName("test") { + resources.srcDirs("src/commonTest/resources") + } + } + + buildTypes { + debug { + enableAndroidTestCoverage = true + enableUnitTestCoverage = true + } + } } compose.resources { diff --git a/domain/build.gradle.kts b/domain/build.gradle.kts index 0fe59d1..8738aa5 100644 --- a/domain/build.gradle.kts +++ b/domain/build.gradle.kts @@ -1,6 +1,5 @@ plugins { jacoco - `jvm-test-suite` alias(libs.plugins.kotlin.multiplatform) alias(libs.plugins.android.library) } @@ -24,36 +23,6 @@ kotlin { implementation(libs.atrium) } } - - jvmTest { - tasks.register(name = "jacocoTestReport", type = JacocoReport::class) { - group = "verification" - description = "Generate Jacoco coverage report" - - dependsOn(tasks.withType(Test::class)) - - val coverageSourceDirs = arrayOf( - "src/commonMain" - ) - - val buildDirectory = layout.buildDirectory - - val classFiles = buildDirectory.dir("classes/kotlin/jvm").get().asFile - .walkBottomUp() - .toSet() - - classDirectories.setFrom(classFiles) - sourceDirectories.setFrom(files(coverageSourceDirs)) - - buildDirectory.files("jacoco/jvmTest.exec").let { - executionData.setFrom(it) - } - - reports { - xml.required = true - } - } - } } }