Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 39 additions & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,5 +35,43 @@ jobs:
restore-keys: |
${{ runner.os}}-node_modules-
- name: Build ${{ matrix.java-version }}
run: mvn -B clean test
run: mvn -B clean install -DskipTests
# Étape PIT : test de mutation
- name: Run PIT Mutation Tests
run: |
mvn -B -f core/pom.xml org.pitest:pitest-maven:mutationCoverage \
-DreportsDirectory=target/pit-reports \
-DmutationThreshold=70 \
-DcoverageThreshold=80 \
-DtimestampedReports=false

# Sauvegarder les rapports PIT comme artefact GitHub
- name: Upload PIT Reports
if: always()
uses: actions/upload-artifact@v4
with:
name: pitest-report-${{ github.run_id }}-${{ matrix.java-version }}
path: core/target/pit-reports

# Vérifier si le build doit échouer selon les métriques
- name: Fail build if mutation score below threshold
run: |
REPORT=$(grep -oP '(?<=<mutationCoverage>).*(?=</mutationCoverage>)' core/target/pit-reports/mutations.xml | head -1)
SCORE=$(echo "$REPORT" | sed 's/%//')
THRESHOLD=70
echo "Mutation score: $SCORE%"
if (( $(echo "$SCORE < $THRESHOLD" | bc -l) )); then
echo "❌ Mutation score below threshold ($THRESHOLD%)"
exit 1
else
echo "✅ Mutation score OK"
fi

- name: Compare with previous PIT report
if: github.event_name == 'pull_request'
run: |
mkdir -p core/prev-pit-reports
# Exemple : récupérer le rapport précédent depuis un artefact ou le cache
# gh run download --name pit-reports --dir core/prev-pit-reports || echo "Aucun artefact précédent"
bash core/compare_pit.sh

47 changes: 47 additions & 0 deletions core/compare_pit.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
#!/usr/bin/env bash
# compare_pit.sh — Compare les métriques PIT entre la build actuelle et précédente

set -e

CURRENT_REPORT="target/pit-reports/mutations.xml"
PREVIOUS_REPORT="prev-pit-reports/mutations.xml"

if [ ! -f "$CURRENT_REPORT" ]; then
echo "❌ Aucun rapport PIT trouvé dans $CURRENT_REPORT"
exit 1
fi

if [ ! -f "$PREVIOUS_REPORT" ]; then
echo "⚠️ Aucun rapport PIT précédent trouvé — comparaison ignorée."
exit 0
fi

# Fonction pour extraire le pourcentage de mutationCoverage depuis un fichier XML
extract_score() {
local file="$1"
grep -oP '(?<=<mutationCoverage>)[0-9]+(\.[0-9]+)?(?=%</mutationCoverage>)' "$file" | head -1
}

CURRENT_SCORE=$(extract_score "$CURRENT_REPORT")
PREVIOUS_SCORE=$(extract_score "$PREVIOUS_REPORT")

if [ -z "$CURRENT_SCORE" ] || [ -z "$PREVIOUS_SCORE" ]; then
echo "❌ Impossible d'extraire les scores PIT."
exit 1
fi

echo "🧪 PIT Comparison:"
echo " Ancien score : ${PREVIOUS_SCORE}%"
echo " Nouveau score : ${CURRENT_SCORE}%"

# Comparaison numérique
improvement=$(echo "$CURRENT_SCORE - $PREVIOUS_SCORE" | bc)

if (( $(echo "$improvement < 0" | bc -l) )); then
echo "❌ Régression : le taux de mutation a baissé de ${improvement}%."
exit 1
elif (( $(echo "$improvement == 0" | bc -l) )); then
echo "ℹ️ Pas de changement du taux de mutation."
else
echo "✅ Amélioration de ${improvement}% du taux de mutation."
fi
82 changes: 81 additions & 1 deletion core/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@
-->
<maven.build.timestamp.format>yyyy-MM-dd'T'HH:mm:ss'Z'</maven.build.timestamp.format>
<builddate>${maven.build.timestamp}</builddate>

<!-- ✅ Added to prevent PITEST argLine errors -->
<argLine></argLine>
</properties>
<licenses>
<license>
Expand All @@ -35,10 +38,35 @@
</license>
</licenses>
<dependencies>
<!-- JUnit 5 (Jupiter) -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.9.3</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.9.3</version>
<scope>test</scope>
</dependency>

<!-- Mockito Core -->
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>5.3.1</version>
<scope>test</scope>
</dependency>

<!-- Mockito JUnit Jupiter (intégration Mockito + JUnit 5) -->

<dependency>
<groupId>com.graphhopper</groupId>
<artifactId>graphhopper-web-api</artifactId>
<version>${project.parent.version}</version>
<version>11.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.carrotsearch</groupId>
Expand Down Expand Up @@ -119,6 +147,16 @@
<artifactId>logback-classic</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

<build>
Expand Down Expand Up @@ -164,6 +202,48 @@
<failOnUnableToExtractRepoInfo>false</failOnUnableToExtractRepoInfo>
</configuration>
</plugin>
<plugin>
<groupId>org.pitest</groupId>
<artifactId>pitest-maven</artifactId>
<version>1.20.6</version>
<dependencies>
<dependency>
<groupId>com.graphhopper</groupId>
<artifactId>graphhopper-web-api</artifactId>
<version>${project.parent.version}</version>
</dependency>
<dependency>
<groupId>org.pitest</groupId>
<artifactId>pitest-junit5-plugin</artifactId>
<version>1.2.1</version>
</dependency>
</dependencies>
<configuration>
<targetClasses>
<param>com.graphhopper.util.BreadthFirstSearch</param>
<param>com.graphhopper.util.SimpleIntDeque</param>
<param>com.graphhopper.util.AngleCalc</param>
<param>com.graphhopper.util.ArrayUtil</param>
<param>com.graphhopper.util.BitUtil</param>
</targetClasses>
<targetTests>
<param>com.graphhopper.util.BreadthFirstSearchTest</param>
<param>com.graphhopper.util.SimpleIntDequeTest</param>
<param>com.graphhopper.util.AngleCalcTest</param>
<param>com.graphhopper.util.ArrayUtilTest</param>
<param>com.graphhopper.util.BitUtilTest</param>
<param>com.graphhopper.util.DistanceCalcEuclideanMockitoTest</param>
<!-- <param>com.graphhopper.util.MutationFailTest</param>-->
</targetTests>
<mutators>
<mutator>STRONGER</mutator>
</mutators>
<outputFormats>
<param>HTML</param>
</outputFormats>
<timestampedReports>false</timestampedReports>
</configuration>
</plugin>
</plugins>

<!-- make version available at runtime via version file -->
Expand Down
Loading