L’obiettivo di questo progetto è di mostrare come è possibile usare dei tag degli unit test per cercare di garantire la verifica di aspetti specifici di una applicazione.
Questo progetto dimostra come implementare una strategia di testing basata su tag JUnit per garantire la copertura dei requisiti di sicurezza in un’applicazione Quarkus con autenticazione JWT e RBAC (Role-Based Access Control).
I principali componenti usati per questo progetto sono:
L’applicazione è configurata per gestire 3 ruoli e 4 path, che generano lo stesso documento in formati diversi. Non tutti i ruoli sono autorizzati a generare ogni path. Ecco la mappa dei permessi:
| Path | Output | Ruoli autorizzati |
|---|---|---|
/doc/example.md |
📝 MarkDown | admin, user, guest |
/doc/example.adoc |
📄 AsciiDoc | admin |
/doc/example.html |
🌐 HTML | admin, user |
/doc/example.pdf |
admin |
L’applicazione implementa un sistema di sicurezza a più livelli:
User → JWT Token → Quarkus Security → Role Check → Resource Access
Per eseguire i test standard:
mvn verify
Per attivare anche la verifica dei tag di sicurezza con il plugin junit5-tag-check-maven-plugin:
mvn verify -P security
mvn quarkus:dev
Usa l’endpoint /demo/{roles}.txt per generare un JWT con i ruoli desiderati.
I ruoli disponibili sono:
admin - Accesso completo a tutti i formatiuser - Accesso a MarkDown e HTMLguest - Accesso solo a MarkDownEsempio per generare un token con ruoli multipli (separati da virgola):
GET /demo/admin,user.txt
⚠️ Nota importante: L’endpoint
/demo/{roles}.txtè fornito solo per scopi dimostrativi. In produzione, l’autenticazione deve avvenire tramite un Identity Provider (IDP) esterno.

Bearer <token>
Se tenti di accedere a un endpoint senza i ruoli necessari, riceverai un errore 403.
Esempio: Tentativo di accesso a /doc/example.adoc senza ruolo admin

Con i ruoli appropriati, puoi accedere agli endpoint autorizzati.
Esempio: Accesso a /doc/example.md con ruoli guest o user

Vedi la mappatura di ruoli e path per maggiori dettagli.
Le classi di test principali sono:
Il progetto utilizza un approccio basato su tag JUnit per garantire la copertura completa dei requisiti di sicurezza.
Definiamo i gruppi di test con cui vogliamo classificare i nostri test:
| Tag | Descrizione | Status Code atteso |
|---|---|---|
authorized |
Test per accessi autorizzati | 200, 201 |
unauthorized |
Test per utenti non autenticati (JWT mancante o non valido) | 401 |
forbidden |
Test per utenti autenticati senza i permessi necessari | 403 |
security |
Tag generico per qualsiasi altro controllo di sicurezza | vari |
Ecco un esempio di test con tag forbidden:
@Test
@Tag("security")
@Tag("forbidden")
void testMarkdown403NoAdminRole() {
String token = JwtGenerator.generateUserToken();
given()
.header("Authorization", "Bearer " + token)
.when().get("/doc/example.adoc")
.then().statusCode(Response.Status.FORBIDDEN.getStatusCode());
}
Ci sono vari modi per verificare la presenza di test sui tag definiti.
Per questa demo usiamo il più semplice, ovvero andremo a verificare con il maven-surefire-plugin che sia presente almeno un test per ogni tag.
Questo può essere fatto con una execution del plugin per ogni tag, es:
<execution>
<id>verify-security-tests</id>
<phase>test</phase>
<goals>
<goal>test</goal>
</goals>
<configuration>
<groups>security</groups>
<failIfNoTests>true</failIfNoTests>
</configuration>
</execution>
Nel nostro caso attiviamo questo controllo con il profilo security:
mvn verify -P security
Nota: È possibile usare questo meccanismo per verificare anche altri tag custom definiti dallo sviluppatore.
Un effetto collaterale dell’utilizzo del profilo security è che vengono eseguiti solo i test con i tag definiti.
Nella nostra CI per ovviare a questa situazione, abbiamo separato lo step di verifica da quello per il calcolo del quality gate e coverage:
- name: Check security unit test tags
run: mvn verify -P security
- name: Build and analyze
env:
SONAR_TOKEN: $
run: mvn -B clean install org.sonarsource.scanner.maven:sonar-maven-plugin:sonar -Dsonar.organization=fugerit79 -Dsonar.projectKey=fugerit79_unit-test-demo-app
Nota: In futuro potremmo rendere più robusto il meccanismo, ad esempio con un sistema più personalizzabile di verifica (es. custom maven plugin).
Bearer <token>Verifica che tutti i tag richiesti siano coperti dai test:
mvn test -P security
Se mancano test per un tag specifico, il plugin junit5-tag-check-maven-plugin segnalerà l’errore con un messaggio chiaro.
Se riscontri errori di tipo IllegalAccessError o problemi con ConfigMappingContext, verifica:
application.yaml sia correttamente formattatomvn cleanContributi sono benvenuti! Per favore:
git checkout -b feature/AmazingFeature)git commit -m 'Add some AmazingFeature')git push origin feature/AmazingFeature)Assicurati che:
mvn verify)mvn verify -P security)Questo progetto è rilasciato sotto licenza MIT - vedi il file LICENSE per i dettagli.