From 7eca52154d0ef073dbdd4634a8d60d64b40cf1fc Mon Sep 17 00:00:00 2001 From: yogyagamage <47789154+yogyagamage@users.noreply.github.com> Date: Wed, 11 Sep 2024 21:50:17 -0400 Subject: [PATCH] Add github action to run tests and get coverages --- .github/workflows/test.yml | 38 ++++++++++++++++++++++++++++++ config/coverage.py | 47 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+) create mode 100644 .github/workflows/test.yml create mode 100644 config/coverage.py diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 000000000..1817a817c --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,38 @@ +name: Java CI with Maven + +on: + push: + pull_request: + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-java@v4.2.1 + with: + distribution: 'temurin' + java-version: '17' + cache: 'maven' + + - name: Build and Test with Maven + timeout-minutes: 15 + run: ./mvnw -B verify + + - name: Get JaCoCo Coverage + id: coverage + run: | + coverage=$(python3 config/coverage.py target/site/jacoco/jacoco.csv) + echo "COVERAGE=$coverage" >> $GITHUB_ENV + + - name: Fail if coverage has not improved. + run: | + coverage=$COVERAGE + threshold=24.46 + if (( $(echo "$coverage <= $threshold" | bc -l) )); then + echo "Coverage is not improved." + exit 1 + else + echo "New coverage: $coverage%. Coverage is improved!" + fi diff --git a/config/coverage.py b/config/coverage.py new file mode 100644 index 000000000..7b86c7eaa --- /dev/null +++ b/config/coverage.py @@ -0,0 +1,47 @@ +import csv + +def computeCoverage(fileList): + """Parses one or more jacoco.csv files and computes code coverage percentages.""" + missed = 0 + covered = 0 + missedBranches = 0 + coveredBranches = 0 + + for filename in fileList: + try: + with open(filename, newline='') as csvfile: + jacocoReader = csv.reader(csvfile) + for i, row in enumerate(jacocoReader): + if i > 0: # Skip header + missed += int(row[3]) + covered += int(row[4]) + missedBranches += int(row[5]) + coveredBranches += int(row[6]) + except FileNotFoundError: + print(f"File not found: {filename}") + return (0, 0) + except Exception as e: + print(f"Error processing file {filename}: {str(e)}") + return (0, 0) + + return ( + calculatePercentage(covered, missed), + calculatePercentage(coveredBranches, missedBranches) + ) + +def calculatePercentage(covered, missed): + """Calculates the coverage percentage.""" + if missed == 0 and covered == 0: + return 1 + return covered / (covered + missed) + +def main(jacocoCsvFile): + coverage, branchCoverage = computeCoverage([jacocoCsvFile]) + """Return coverage percentage to check against the previous coverage.""" + return round(coverage * 100, 2) + +if __name__ == "__main__": + import sys + jacocoCsvFile = sys.argv[1] + result = main(jacocoCsvFile) + print(result)