-
Notifications
You must be signed in to change notification settings - Fork 0
193 lines (174 loc) · 8.99 KB
/
Copy pathmutation-testing.yml
File metadata and controls
193 lines (174 loc) · 8.99 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
name: 🧬 Testy Mutacyjne (Stryker)
# Uruchamianie ręczne przez GitHub Actions UI
# Użyj tego workflow do dodatkowej weryfikacji jakości testów
on:
workflow_dispatch:
inputs:
concurrency:
description: 'Liczba równoległych procesów mutacji'
required: false
default: '4'
type: choice
options:
- '2'
- '4'
- '8'
incremental:
description: 'Tylko zmienione pliki (incremental)'
required: false
default: false
type: boolean
permissions:
contents: read
pull-requests: write
jobs:
testy-mutacyjne:
name: 🧬 Testy Mutacyjne
runs-on: ubuntu-latest
timeout-minutes: 60
outputs:
score: ${{ steps.wyniki.outputs.score }}
killed: ${{ steps.wyniki.outputs.killed }}
survived: ${{ steps.wyniki.outputs.survived }}
total: ${{ steps.wyniki.outputs.total }}
status: ${{ steps.wyniki.outputs.status }}
steps:
- name: 📥 Pobieranie Kodu
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: ⚙️ Konfiguracja Node.js
uses: actions/setup-node@v4
with:
node-version: 'lts/*'
cache: 'npm'
- name: 📚 Instalacja Zależności
run: npm ci
- name: 🧬 Uruchamianie Testów Mutacyjnych
run: |
echo "🧬 Rozpoczynam testy mutacyjne..."
echo "📊 Liczba równoległych procesów: ${{ github.event.inputs.concurrency || '4' }}"
echo "ℹ️ Tryb incremental: ${{ github.event.inputs.incremental || 'false' }}"
echo "🔧 Używam command runner (kompatybilny z Vitest 4)"
if [ "${{ github.event.inputs.incremental }}" == "true" ]; then
npm run test:mutation -- --incremental --concurrency ${{ github.event.inputs.concurrency || '4' }}
else
npm run test:mutation -- --concurrency ${{ github.event.inputs.concurrency || '4' }}
fi
env:
CI: true
NODE_OPTIONS: '--max-old-space-size=4096'
- name: 📊 Przesyłanie Raportu Mutacji
uses: actions/upload-artifact@v4
if: always()
with:
name: raport-mutacji-${{ github.run_id }}
path: reports/mutation/
retention-days: 30
- name: 📝 Generowanie Podsumowania i Wyświetlanie Wyników
id: wyniki
if: always()
run: |
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "🧬 WYNIKI TESTÓW MUTACYJNYCH"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
if [ -f "reports/mutation/mutation-report.json" ]; then
# Parsowanie wyników z JSON
KILLED=$(cat reports/mutation/mutation-report.json | jq '.files | to_entries | map(.value.mutants | map(select(.status == "Killed")) | length) | add // 0')
SURVIVED=$(cat reports/mutation/mutation-report.json | jq '.files | to_entries | map(.value.mutants | map(select(.status == "Survived")) | length) | add // 0')
TIMEOUT=$(cat reports/mutation/mutation-report.json | jq '.files | to_entries | map(.value.mutants | map(select(.status == "Timeout")) | length) | add // 0')
NO_COVERAGE=$(cat reports/mutation/mutation-report.json | jq '.files | to_entries | map(.value.mutants | map(select(.status == "NoCoverage")) | length) | add // 0')
TOTAL=$((KILLED + SURVIVED + TIMEOUT + NO_COVERAGE))
if [ $TOTAL -gt 0 ]; then
SCORE=$(echo "scale=2; ($KILLED * 100) / $TOTAL" | bc)
else
SCORE=0
fi
# Wyświetlanie w konsoli
echo "📊 Statystyki:"
echo " 💀 Zabite mutanty: $KILLED"
echo " 🧟 Przeżyłe mutanty: $SURVIVED"
echo " ⏱️ Timeout: $TIMEOUT"
echo " 🚫 Bez pokrycia: $NO_COVERAGE"
echo " 📈 Łącznie mutantów: $TOTAL"
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "📊 Mutation Score: ${SCORE}%"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
if (( $(echo "$SCORE >= 80" | bc -l) )); then
echo "✅ Świetny wynik! Testy są wysokiej jakości."
STATUS_EMOJI="✅"
STATUS_TEXT="Świetny wynik! Testy są wysokiej jakości."
elif (( $(echo "$SCORE >= 60" | bc -l) )); then
echo "⚠️ Dobry wynik. Jest miejsce na poprawę."
STATUS_EMOJI="⚠️"
STATUS_TEXT="Dobry wynik. Jest miejsce na poprawę."
else
echo "❌ Niski wynik. Rozważ dodanie lepszych asercji do testów."
STATUS_EMOJI="❌"
STATUS_TEXT="Niski wynik. Rozważ dodanie lepszych asercji do testów."
fi
echo ""
echo "📥 Pełny raport HTML dostępny w sekcji Artifacts powyżej."
echo ""
# Generowanie podsumowania dla GitHub Actions Summary
echo "## 🧬 Wyniki Testów Mutacyjnych" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### 📊 Statystyki" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "| Metryka | Wartość |" >> $GITHUB_STEP_SUMMARY
echo "|---------|---------|" >> $GITHUB_STEP_SUMMARY
echo "| 💀 Zabite mutanty | **$KILLED** |" >> $GITHUB_STEP_SUMMARY
echo "| 🧟 Przeżyłe mutanty | **$SURVIVED** |" >> $GITHUB_STEP_SUMMARY
echo "| ⏱️ Timeout | $TIMEOUT |" >> $GITHUB_STEP_SUMMARY
echo "| 🚫 Bez pokrycia | $NO_COVERAGE |" >> $GITHUB_STEP_SUMMARY
echo "| 📈 Łącznie mutantów | **$TOTAL** |" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### 📊 Mutation Score" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "**${SCORE}%**" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "$STATUS_EMOJI **$STATUS_TEXT**" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "---" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "📥 **Pełny raport HTML** dostępny w sekcji [Artifacts](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }})" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "🔗 Link do tego uruchomienia: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" >> $GITHUB_STEP_SUMMARY
# Zapisanie wyników jako outputs (widoczne w GitHub Actions UI)
echo "score=$SCORE" >> $GITHUB_OUTPUT
echo "killed=$KILLED" >> $GITHUB_OUTPUT
echo "survived=$SURVIVED" >> $GITHUB_OUTPUT
echo "total=$TOTAL" >> $GITHUB_OUTPUT
echo "status=$STATUS_TEXT" >> $GITHUB_OUTPUT
# Zapisanie wyników do pliku dla następnego kroku
echo "KILLED=$KILLED" >> $GITHUB_ENV
echo "SURVIVED=$SURVIVED" >> $GITHUB_ENV
echo "TIMEOUT=$TIMEOUT" >> $GITHUB_ENV
echo "NO_COVERAGE=$NO_COVERAGE" >> $GITHUB_ENV
echo "TOTAL=$TOTAL" >> $GITHUB_ENV
echo "SCORE=$SCORE" >> $GITHUB_ENV
echo "STATUS_EMOJI=$STATUS_EMOJI" >> $GITHUB_ENV
echo "STATUS_TEXT=$STATUS_TEXT" >> $GITHUB_ENV
else
echo "⚠️ Nie znaleziono raportu mutacji."
echo "⚠️ Nie znaleziono raportu mutacji." >> $GITHUB_STEP_SUMMARY
fi
- name: 📋 Podsumowanie Wyników w Konsoli
if: always()
run: |
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "✅ WYNIKI ZOSTAŁY WYGENEROWANE"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
echo "📊 Wyniki są widoczne w:"
echo " 1. GitHub Actions Summary (na górze tej strony)"
echo " 2. Artifacts (pełny raport HTML)"
echo " 3. Outputs tego joba (poniżej)"
echo ""
echo "🔗 Link do tego uruchomienia:"
echo " https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"
echo ""