diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 3bd520a..2714a3d 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -38,6 +38,10 @@ jobs: - name: Run unit tests run: ./gradlew :TeamCode:testReleaseUnitTest --no-daemon --stacktrace + - name: Run JaCoCo + run: + ./gradlew :TeamCode:jacocoTestReport + - name: Build Release APK run: ./gradlew assembleRelease --no-daemon --stacktrace @@ -48,6 +52,12 @@ jobs: name: test-report-debug path: TeamCode/build/reports/tests/testDebugUnitTest + - name: Upload JaCoCo Report + uses: actions/upload-artifact@v4 + with: + name: Upload JaCoCo Report + path: TeamCode/build/reports/jacoco/jacocoTestReport/**/* + - name: Upload Release APK uses: actions/upload-artifact@v4 with: diff --git a/TeamCode/build.gradle b/TeamCode/build.gradle index d4dbfd4..4a768e4 100644 --- a/TeamCode/build.gradle +++ b/TeamCode/build.gradle @@ -3,6 +3,7 @@ apply from: '../build.dependencies.gradle' apply plugin: 'de.mannodermaus.android-junit5' apply plugin: 'jacoco' + android { namespace = 'org.firstinspires.ftc.teamcode' @@ -19,6 +20,73 @@ jacoco { toolVersion = "0.8.10" } +tasks.register("testWithCoverage") { + dependsOn("testDebugUnitTest", "jacocoTestReport") +} + +tasks.withType(Test).configureEach { + jacoco.includeNoLocationClasses = true + jacoco.excludes = [ + 'jdk.internal.*' + ] +} + +tasks.register("jacocoTestReport", JacocoReport) { + // You are running debug unit tests + def variant = "debug" + def testVariant = "debugUnitTest" + + dependsOn "test${testVariant.capitalize()}" + + reports { + xml.required = true + html.required = true + } + + def allowedClasses = files( + "$buildDir/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/firstinspires/ftc/teamcode/TeleOpMain.class", + "$buildDir/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/firstinspires/ftc/teamcode/TeleOpMain\$*.class", + + "$buildDir/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/firstinspires/ftc/teamcode/AutoMain.class", + "$buildDir/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/firstinspires/ftc/teamcode/AutoMain\$*.class", + + "$buildDir/intermediates/javac/release/compileReleaseJavaWithJavac/classes/org/firstinspires/ftc/teamcode/Utils_13233" + ) + + + def fileFilter = [ + '**/R.class', '**/R$*.class', '**/BuildConfig.*', + '**/Manifest*.*', 'android/**/*.*', + '**/org/firstinspires/ftc/teamcode/tuning/**', + '**/org/firstinspires/ftc/teamcode/**', + ] + + + // Main (non-test) code classes + def mainClasses = fileTree( + dir: "$buildDir/intermediates/javac/${variant}/compile${variant.capitalize()}JavaWithJavac/classes", + excludes: fileFilter + ) + + classDirectories.setFrom( + files([ + mainClasses, // everything minus excluded dirs + allowedClasses // add back specific classes + ]) + ) + + + sourceDirectories.setFrom(files([ + "src/main/java" + ])) + + executionData.setFrom(fileTree( + dir: buildDir, + includes: ["jacoco/test${testVariant.capitalize()}.exec"] + )) +} + + repositories { maven { url = 'https://maven.brott.dev/'