Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Bucle de verificación para proyectos Quarkus: build, análisis estático, pruebas con cobertura, escaneos de seguridad, compilación nativa y revisión de diff antes del lanzamiento o PR.
.claude/skills/affaan-m-quarkus-verification/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 80% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 102% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 390% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 331% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 344% | 0% |
PR'lardan önce, büyük değişikliklerden sonra ve deployment öncesi çalıştırın.
bash# Maven mvn clean verify -DskipTests # Gradle ./gradlew clean assemble -x test
Build başarısız olursa, durdurun ve derleme hatalarını düzeltin.
bashmvn checkstyle:check pmd:check spotbugs:check
bashmvn sonar:sonar \ -Dsonar.projectKey=my-quarkus-project \ -Dsonar.host.url=http://localhost:9000 \ -Dsonar.login=${SONAR_TOKEN}
bash# Tüm testleri çalıştır mvn clean test # Kapsam raporu oluştur mvn jacoco:report # Kapsam eşiğini zorla (%80) mvn jacoco:check # Veya Gradle ile ./gradlew test jacocoTestReport jacocoTestCoverageVerification
Mock'lanmış bağımlılıklarla servis mantığını test edin:
java@ExtendWith(MockitoExtension.class) class UserServiceTest { @Mock UserRepository userRepository; @InjectMocks UserService userService; @Test void createUser_validInput_returnsUser() { var dto = new CreateUserDto("Alice", "alice@example.com"); // Panache persist() void döndürür — doNothing + verify kullanın doNothing().when(userRepository).persist(any(User.class)); User result = userService.create(dto); assertThat(result.name).isEqualTo("Alice"); verify(userRepository).persist(any(User.class)); } }
Gerçek veritabanıyla (Testcontainers) test edin:
java@QuarkusTest @QuarkusTestResource(PostgresTestResource.class) class UserRepositoryIntegrationTest { @Inject UserRepository userRepository; @Test @Transactional void findByEmail_existingUser_returnsUser() { User user = new User(); user.name = "Alice"; user.email = "alice@example.com"; userRepository.persist(user); Optional<User> found = userRepository.findByEmail("alice@example.com"); assertThat(found).isPresent(); assertThat(found.get().name).isEqualTo("Alice"); } }
REST Assured ile REST endpoint'lerini test edin:
java@QuarkusTest class UserResourceTest { @Test void createUser_validInput_returns201() { given() .contentType(ContentType.JSON) .body(""" {"name": "Alice", "email": "alice@example.com"} """) .when().post("/api/users") .then() .statusCode(201) .body("name", equalTo("Alice")); } @Test void createUser_invalidEmail_returns400() { given() .contentType(ContentType.JSON) .body(""" {"name": "Alice", "email": "invalid"} """) .when().post("/api/users") .then() .statusCode(400); } }
Ayrıntılı kapsam için target/site/jacoco/index.html sayfasını kontrol edin:
bashmvn org.owasp:dependency-check-maven:check
CVE'ler için target/dependency-check-report.html raporunu inceleyin.
bash# Güvenlik açığı olan extension'ları kontrol et mvn quarkus:audit # Tüm extension'ları listele mvn quarkus:list-extensions
bashdocker run -t ghcr.io/zaproxy/zaproxy:stable zap-api-scan.py \ -t http://localhost:8080/q/openapi \ -f openapi
GraalVM native image uyumluluğunu test edin:
bash# Native executable oluştur mvn package -Dnative # Veya container ile mvn package -Dnative -Dquarkus.native.container-build=true # Native executable'ı test et ./target/*-runner # Temel smoke testleri çalıştır curl http://localhost:8080/q/health/live curl http://localhost:8080/q/health/ready
Yaygın sorunlar:
quarkus.native.resources.includes ile kaynakları dahil edinÖrnek reflection yapılandırması:
java@RegisterForReflection(targets = {MyDynamicClass.class}) public class ReflectionConfiguration {}
javascript// load-test.js import http from 'k6/http'; import { check } from 'k6'; export const options = { stages: [ { duration: '30s', target: 50 }, { duration: '1m', target: 100 }, { duration: '30s', target: 0 }, ], }; export default function () { const res = http.get('http://localhost:8080/api/markets'); check(res, { 'status is 200': (r) => r.status === 200, 'response time < 200ms': (r) => r.timings.duration < 200, }); }
Çalıştırın:
bashk6 run load-test.js
bash# Liveness curl http://localhost:8080/q/health/live # Readiness curl http://localhost:8080/q/health/ready # Tüm sağlık kontrolleri curl http://localhost:8080/q/health # Metrikler (etkinleştirilmişse) curl http://localhost:8080/q/metrics
Beklenen yanıtlar:
json{ "status": "UP", "checks": [ { "name": "Database connection", "status": "UP" } ] }
bash# Container image oluştur mvn package -Dquarkus.container-image.build=true # Veya belirli registry ile mvn package \ -Dquarkus.container-image.build=true \ -Dquarkus.container-image.registry=docker.io \ -Dquarkus.container-image.group=myorg \ -Dquarkus.container-image.tag=1.0.0 # Container'ı test et docker run -p 8080:8080 myorg/my-quarkus-app:1.0.0
bash# Trivy trivy image myorg/my-quarkus-app:1.0.0 # Grype grype myorg/my-quarkus-app:1.0.0
bash# Tüm yapılandırma özelliklerini kontrol et mvn quarkus:info # Tüm yapılandırma kaynaklarını listele curl http://localhost:8080/q/dev/io.quarkus.quarkus-vertx-http/config
/q/swagger-ui)OpenAPI spec oluşturun:
bashcurl http://localhost:8080/q/openapi -o openapi.json
bash#!/bin/bash set -e echo "=== Faz 1: Build ===" mvn clean verify -DskipTests echo "=== Faz 2: Static Analiz ===" mvn checkstyle:check pmd:check spotbugs:check echo "=== Faz 3: Testler + Kapsam ===" mvn test jacoco:report jacoco:check echo "=== Faz 4: Güvenlik Taraması ===" mvn org.owasp:dependency-check-maven:check echo "=== Faz 5: Native Derleme ===" mvn package -Dnative -Dquarkus.native.container-build=true echo "=== Tüm Fazlar Tamamlandı ===" echo "Raporları inceleyin:" echo " - Kapsam: target/site/jacoco/index.html" echo " - Güvenlik: target/dependency-check-report.html" echo " - Native: target/*-runner"
yamlname: Verification on: [push, pull_request] jobs: verify: runs-on: ubuntu-latest steps: - uses: actions/checkout@v7 - name: Set up JDK 21 uses: actions/setup-java@v5 with: java-version: '21' distribution: 'temurin' - name: Cache Maven packages uses: actions/cache@v6 with: path: ~/.m2 key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }} - name: Build run: mvn clean verify -DskipTests - name: Test with Coverage run: mvn test jacoco:report jacoco:check - name: Security Scan run: mvn org.owasp:dependency-check-maven:check - name: Upload Coverage uses: codecov/codecov-action@v7 with: token: ${{ secrets.CODECOV_TOKEN }} files: target/site/jacoco/jacoco.xml
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-18 | pass→pass | 9,483 | 9,993 | +5% | 1 | 1 | 0% | 1,701 | 5,148 | +203% | 0 | 0 | — |
case-01 | fail→pass | 16,832 | 12,427 | -26% | 1 | 1 | 0% | 3,209 | 5,765 | +80% | 0 | 0 | — |
case-02 | fail→pass | 16,188 | 14,300 | -12% | 1 | 1 | 0% | 3,071 | 6,191 | +102% | 0 | 0 | — |
case-03 | fail→fail | 14,508 | 10,927 | -25% | 1 | 1 | 0% | 2,662 | 5,685 | +114% | 0 | 0 | — |
case-04 | fail→fail | 7,088 | 7,137 | +1% | 1 | 1 | 0% | 1,171 | 4,495 | +284% | 0 | 0 | — |
case-05 | fail→pass | 5,753 | 3,295 | -43% | 1 | 1 | 0% | 811 | 3,970 | +390% | 0 | 0 | — |
case-06 | pass→pass | 10,619 | 7,690 | -28% | 1 | 1 | 0% | 1,978 | 4,741 | +140% | 0 | 0 | — |
case-07 | fail→fail | 10,069 | 5,629 | -44% | 1 | 1 | 0% | 1,825 | 4,412 | +142% | 0 | 0 | — |
case-08 | pass→pass | 10,528 | 9,075 | -14% | 1 | 1 | 0% | 1,819 | 5,089 | +180% | 0 | 0 | — |
case-09 | fail→pass | 6,526 | 7,635 | +17% | 1 | 1 | 0% | 1,112 | 4,791 | +331% | 0 | 0 | — |
case-10 | pass→pass | 12,092 | 5,446 | -55% | 1 | 1 | 0% | 1,998 | 4,330 | +117% | 0 | 0 | — |
case-11 | pass→pass | 7,735 | 3,213 | -58% | 1 | 1 | 0% | 1,232 | 3,850 | +213% | 0 | 0 | — |
case-12 | fail→pass | 13,907 | 6,535 | -53% | 1 | 1 | 0% | 914 | 4,059 | +344% | 0 | 0 | — |
case-13 | pass→pass | 8,743 | 3,813 | -56% | 1 | 1 | 0% | 1,495 | 3,971 | +166% | 0 | 0 | — |
case-14 | pass→pass | 11,277 | 5,758 | -49% | 1 | 1 | 0% | 1,871 | 4,267 | +128% | 0 | 0 | — |
case-15 | fail→fail | 12,363 | 13,703 | +11% | 1 | 1 | 0% | 2,180 | 5,768 | +165% | 0 | 0 | — |
case-16 | pass→pass | 9,669 | 3,457 | -64% | 1 | 1 | 0% | 1,537 | 3,902 | +154% | 0 | 0 | — |
case-17 | pass→pass | 5,934 | 5,489 | -7% | 1 | 1 | 0% | 968 | 4,269 | +341% | 0 | 0 | — |
case-19 | pass→pass | 15,192 | 14,198 | -7% | 1 | 1 | 0% | 2,299 | 5,824 | +153% | 0 | 0 | — |
case-20 | fail→fail | 11,384 | 13,213 | +16% | 1 | 1 | 0% | 1,990 | 5,621 | +182% | 0 | 0 | — |
case-21 | fail→pass | 7,686 | 2,671 | -65% | 1 | 1 | 0% | 1,348 | 3,869 | +187% | 0 | 0 | — |
case-22 | pass→pass | 15,684 | 14,628 | -7% | 1 | 1 | 0% | 2,895 | 6,547 | +126% | 0 | 0 | — |
case-23 | pass→fail | 29,056 | 46,105 | +59% | 1 | 1 | 0% | 2,691 | 4,634 | +72% | 0 | 0 | — |
case-24 | pass→pass | 14,078 | 11,427 | -19% | 1 | 1 | 0% | 2,451 | 5,505 | +125% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 24 cases were attempted, and 23 counted toward the lift figure. The other 1 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +21 percentage points is the difference between those two pass rates over the 23 comparable cases. 2 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.6-flash | verified | 8/11/2026 | +9% |
Other measured skills in the registry, with their headline benchmark lift.