Creo applicazioni web moderne e strumenti digitali personalizzati per aiutare le attività a crescere attraverso l'innovazione tecnologica. La mia passione è unire informatica ed economia per generare valore reale.
La mia passione per l'informatica è nata tra i banchi dell'Istituto Tecnico Commerciale di Maglie, dove ho scoperto il potere della programmazione e il fascino di creare soluzioni digitali. Fin da subito, ho capito che l'informatica non era solo codice, ma uno strumento straordinario per trasformare idee in realtà.
Durante gli studi superiori in Sistemi Informativi Aziendali, ho iniziato a intrecciare informatica ed economia, comprendendo come la tecnologia possa essere il motore della crescita per qualsiasi attività. Questa visione mi ha accompagnato all'Università degli Studi di Bari, dove ho conseguito la Laurea in Informatica, approfondendo le mie competenze tecniche e la mia passione per lo sviluppo software.
Oggi metto questa esperienza al servizio di imprese, professionisti e startup, creando soluzioni digitali su misura che automatizzano processi, ottimizzano risorse e aprono nuove opportunità di business. Perché la vera innovazione inizia quando la tecnologia incontra le esigenze reali delle persone.
Le Mie Competenze
Analisi Dati & Modelli Previsionali
Trasformo i dati in insights strategici con analisi approfondite e modelli predittivi per decisioni informate
Automazione Processi
Creo strumenti personalizzati che automatizzano operazioni ripetitive e liberano tempo per attività a valore aggiunto
Sistemi Custom
Sviluppo sistemi software su misura, dalle integrazioni tra piattaforme alle dashboard personalizzate
Credo fermamente che l'informatica sia lo strumento più potente per trasformare le idee in realtà e migliorare la vita delle persone.
Democratizzare la Tecnologia
La mia missione è rendere l'informatica accessibile a tutti: dalle piccole imprese locali alle startup innovative, fino ai professionisti che vogliono digitalizzare la propria attività. Ogni realtà merita di sfruttare le potenzialità del digitale.
Unire Informatica ed Economia
Non è solo questione di scrivere codice: è capire come la tecnologia possa generare valore reale. Intrecciando competenze informatiche e visione economica, aiuto le attività a crescere, ottimizzare processi e raggiungere nuovi traguardi di efficienza e redditività.
Creare Soluzioni su Misura
Ogni attività è unica, e così devono esserlo le soluzioni. Sviluppo strumenti personalizzati che rispondono alle esigenze specifiche di ciascun cliente, automatizzando processi ripetitivi e liberando tempo per ciò che conta davvero: far crescere il business.
Trasforma la Tua Attività con la Tecnologia
Che tu gestisca un negozio, uno studio professionale o un'azienda, posso aiutarti a sfruttare le potenzialità dell'informatica per lavorare meglio, più velocemente e in modo più intelligente.
Il mio percorso accademico e le tecnologie che padroneggio
Certificazioni Professionali
8 certificazioni conseguite
Nuovo
Visualizza
Reinvention With Agentic AI Learning Program
Anthropic
Dicembre 2024
Nuovo
Visualizza
Agentic AI Fluency
Anthropic
Dicembre 2024
Nuovo
Visualizza
AI Fluency for Students
Anthropic
Dicembre 2024
Nuovo
Visualizza
AI Fluency: Framework and Foundations
Anthropic
Dicembre 2024
Nuovo
Visualizza
Claude with the Anthropic API
Anthropic
Dicembre 2024
Visualizza
Master SQL
RoadMap.sh
Novembre 2024
Visualizza
Oracle Certified Foundations Associate
Oracle
Ottobre 2024
Visualizza
People Leadership Credential
Connect
Settembre 2024
Linguaggi & Tecnologie
Java
Python
JavaScript
Angular
React
TypeScript
SQL
PHP
CSS/SCSS
Node.js
Docker
Git
💼
12/2024 - Presente
Custom Software Engineering Analyst
Accenture
Bari, Puglia, Italia · Ibrida
Analisi e sviluppo di sistemi informatici attraverso l'utilizzo di Java e Quarkus in Health and Public Sector. Formazione continua su tecnologie moderne per la creazione di soluzioni software personalizzate ed efficienti e sugli agenti.
💼
06/2022 - 12/2024
Analista software e Back End Developer Associate Consultant
Links Management and Technology SpA
Esperienza nell'analisi di sistemi software as-is e flussi ETL utilizzando PowerCenter. Formazione completata su Spring Boot per lo sviluppo di applicazioni backend moderne e scalabili. Sviluppatore Backend specializzato in Spring Boot, con esperienza in progettazione di database, analisi, sviluppo e testing dei task assegnati.
💼
02/2021 - 10/2021
Programmatore software
Adesso.it (prima era WebScience srl)
Esperienza nell'analisi AS-IS e TO-BE, evoluzioni SEO ed evoluzioni website per migliorare le performance e l'engagement degli utenti.
🎓
2018 - 2025
Laurea in Informatica
Università degli Studi di Bari Aldo Moro
Bachelor's degree in Computer Science, focusing on software engineering, algorithms, and modern development practices.
📚
2013 - 2018
Diploma - Sistemi Informativi Aziendali
Istituto Tecnico Commerciale di Maglie
Technical diploma specializing in Business Information Systems, combining IT knowledge with business management.
Contattami
Hai un progetto in mente? Parliamone! Compila il form qui sotto e ti risponderò al più presto.
* Campi obbligatori. I tuoi dati saranno utilizzati solo per rispondere alla tua richiesta.
Testing e qualità del Codice con Claude Code
I test sono il fondamento di un progetto manutenibile. Non sono solo una rete di sicurezza
contro i bug, ma anche documentazione eseguibile che descrive come il codice
dovrebbe comportarsi. Claude Code può accelerare drasticamente la scrittura di test,
dal TDD al refactoring guidato, dal debugging assistito alla copertura dei casi edge.
In questo articolo esploreremo come sfruttare Claude Code per ogni livello della
piramide dei test, con prompt specifici, esempi pratici e best practices
per ottenere test robusti e manutenibili.
Panoramica della Serie
#
Articolo
Focus
1
Introduzione a Claude Code
Setup e primi passi
2
Ideazione e Requisiti
Da idea a specifiche
3
Architettura Codebase
Struttura del progetto
4
Context e CLAUDE.md
Configurazione avanzata
5
Struttura del Codice
Implementazione guidata
6
Prompt Engineering
Prompt avanzati
7
Sei qui - Testing e qualità
Test e debug
8
Documentazione
README e API docs
9
Deploy e DevOps
CI/CD e Docker
10
Evoluzione del Progetto
Manutenzione
La Piramide dei Test
La piramide dei test definisce la strategia ottimale per bilanciare velocità,
copertura e manutenibilità. Claude Code può aiutarti a tutti i livelli.
Piramide dei Test
/\
/ \
/ E2E\ Pochi (5-10%)
/------\ Lenti, costosi, fragili
/ \ Testano flussi utente completi
/Integration\ Moderati (15-25%)
/--------------\ Velocita media
/ \ Testano interazioni tra componenti
/ Unit Tests \ Molti (70-80%)
/--------------------\ Veloci, isolati, stabili
/ \ Testano singole unita
/________________________\
Caratteristiche per Livello
Livello
Velocita
Isolamento
Costo
Confidenza
Unit
~1ms
Alto
Basso
Logica interna
Integration
~100ms
Medio
Medio
Interazioni
E2E
~5s
Basso
Alto
Sistema completo
Strategia di Test con Claude Code
Claude Code eccelle nel generare test completi partendo dal codice esistente.
Ecco la strategia ottimale:
Workflow Consigliato
Fase
Azione
Claude Code
1
Analizza il codice da testare
"Quali casi di test servono per questa funzione?"
2
Genera test per happy path
"Genera unit test per i casi di successo"
3
Aggiungi edge cases
"Aggiungi test per edge cases e errori"
4
Review e refactor
"Rivedi questi test e migliora la leggibilità"
5
Verifica coverage
"Quali righe non sono coperte?"
Generazione Unit Test
Gli unit test verificano singole funzioni o classi in isolamento completo.
Sono veloci, affidabili e forniscono feedback immediato durante lo sviluppo.
Prompt per Generare Unit Test
Prompt - Generate Comprehensive Unit Tests
Generate comprehensive unit tests for this service:
```typescript
[PASTE SERVICE CODE HERE]
```
TESTING REQUIREMENTS:
- Framework: Jest with TypeScript
- Coverage target: >90% for this critical service
- Mock ALL external dependencies (repositories, external services)
TEST CATEGORIES TO COVER:
1. Happy Path: Normal successful operations
2. Validation: Invalid inputs, edge cases
3. Error Handling: Expected errors are thrown correctly
4. Edge Cases: Empty arrays, null values, boundary conditions
5. State Changes: Verify side effects (calls to dependencies)
OUTPUT FORMAT:
- Complete test file with all imports
- Use describe/it blocks with clear descriptions
- Include beforeEach for setup
- Group tests by method
- Use AAA pattern (Arrange, Act, Assert)
- Add comments explaining non-obvious test cases
NAMING CONVENTION:
- Describe: "ServiceName"
- Nested describe: "methodName"
- It: "should [expected behavior] when [condition]"
Gli integration test verificano che i componenti funzionino correttamente insieme.
Testano l'API completa, incluso routing, middleware, validazione e accesso al database.
Prompt per Integration Tests
Prompt - Generate Integration Tests
Generate integration tests for this API:
ENDPOINTS:
- POST /api/users - Create user (requires auth)
- GET /api/users/:id - Get user by ID
- PATCH /api/users/:id - Update user (owner only)
- DELETE /api/users/:id - Soft delete (admin only)
TESTING REQUIREMENTS:
- Framework: Jest + Supertest
- Database: Test PostgreSQL (use transactions, rollback after each test)
- Auth: JWT tokens (mock or real test tokens)
TEST SCENARIOS FOR EACH ENDPOINT:
1. Success case with valid request
2. Validation errors (400) - invalid body, missing fields
3. Authentication errors (401) - missing/invalid token
4. Authorization errors (403) - wrong role/permissions
5. Not found errors (404) - resource doesn't exist
6. Conflict errors (409) - duplicate resources
SETUP/TEARDOWN:
- beforeAll: Create test database, run migrations
- beforeEach: Start transaction
- afterEach: Rollback transaction
- afterAll: Close database connection
Include helper functions for:
- Creating authenticated requests
- Generating test users
- Cleaning up test data
Esempio Integration Test
TypeScript - users.integration.spec.ts
import request from 'supertest';
import {{ '{' }} app {{ '}' }} from '../app';
import {{ '{' }} db {{ '}' }} from '../database';
import {{ '{' }} createTestUser, getAuthToken, cleanupTestData {{ '}' }} from './helpers';
import {{ '{' }} UserRole {{ '}' }} from '@shared/types';
describe('Users API Integration Tests', () => {{ '{' }}
let adminToken: string;
let userToken: string;
let testUserId: string;
beforeAll(async () => {{ '{' }}
await db.connect();
await db.migrate();
// Create test users and get tokens
const admin = await createTestUser({{ '{' }} role: UserRole.ADMIN {{ '}' }});
const user = await createTestUser({{ '{' }} role: UserRole.USER {{ '}' }});
adminToken = await getAuthToken(admin);
userToken = await getAuthToken(user);
testUserId = user.id;
{{ '}' }});
afterAll(async () => {{ '{' }}
await cleanupTestData();
await db.disconnect();
{{ '}' }});
// ================================================
// POST /api/users - Create User
// ================================================
describe('POST /api/users', () => {{ '{' }}
const validPayload = {{ '{' }}
name: 'Integration Test User',
email: 'integration@test.com',
password: 'SecurePass123!',
{{ '}' }};
describe('success cases', () => {{ '{' }}
it('should create user with valid data (201)', async () => {{ '{' }}
const response = await request(app)
.post('/api/users')
.set('Authorization', `Bearer
Claude Code può suggerire refactoring mantenendo il comportamento.
I test esistenti diventano la tua rete di sicurezza.
Prompt - Refactoring con Safety Net
I want to refactor this code. I have tests that cover its behavior:
CURRENT CODE:
```typescript
[PASTE CODE]
```
EXISTING TESTS (passing):
```typescript
[PASTE TESTS]
```
REFACTORING GOALS:
1. Reduce cyclomatic complexity
2. Extract reusable functions
3. Improve naming
CONSTRAINTS:
- All existing tests MUST still pass
- Don't change public interface
- No new dependencies
Provide:
1. Refactored code
2. Explanation of each change
3. Any new tests needed for extracted functions
Debug Assistito con Claude Code
Claude Code è eccellente per analizzare errori e trovare la causa root.
Prompt - Debug Failing Test
This test is failing and I can't figure out why:
TEST:
```typescript
it('should apply discount to order total', async () => {{ '{' }}
const order = await orderService.createOrder({{ '{' }}
items: [{{ '{' }} productId: 'prod-1', quantity: 2 {{ '}' }}],
couponCode: 'SAVE10',
{{ '}' }});
expect(order.total).toBe(90); // Expected $90 after 10% discount
expect(order.discount).toBe(10);
{{ '}' }});
```
ERROR:
```
Expected: 90
Received: 100
```
IMPLEMENTATION:
```typescript
async createOrder(dto: CreateOrderDto): Promise<Order> {{ '{' }}
const items = await this.getOrderItems(dto.items);
const subtotal = items.reduce((sum, item) => sum + item.price * item.quantity, 0);
let discount = 0;
if (dto.couponCode) {{ '{' }}
const coupon = await this.couponRepository.findByCode(dto.couponCode);
if (coupon) {{ '{' }}
discount = subtotal * (coupon.percentage / 100);
{{ '}' }}
{{ '}' }}
return this.orderRepository.create({{ '{' }}
items,
subtotal,
discount,
total: subtotal - discount,
{{ '}' }});
{{ '}' }}
```
Help me:
1. Identify why the test is failing
2. Determine if it's a test bug or implementation bug
3. Provide the fix
Code Review con Claude Code
Usa Claude Code per fare code review dei test stessi.
Prompt - Review Test Quality
Review these tests for quality and completeness:
```typescript
[PASTE TESTS]
```
ANALYZE:
1. Test Coverage Gaps
- Missing happy paths
- Missing error scenarios
- Missing edge cases
2. Test Quality Issues
- Tests that test implementation vs behavior
- Flaky test patterns
- Poor isolation (shared state)
- Missing assertions
3. Maintainability Issues
- Unclear test names
- Code duplication
- Missing comments for complex scenarios
4. Best Practices Violations
- Not using AAA pattern
- Multiple assertions testing different things
- Mocking too much or too little
For each issue provide:
- Location (line/describe block)
- Problem description
- Recommended fix with code example
Test Fixtures e Factories
Fixture ben strutturate rendono i test più leggibili e manutenibili.
Il Test-Driven Development funziona ancora meglio con Claude Code.
Scrivi prima il test, poi lascia che Claude suggerisca l'implementazione.
TDD con Claude Code
Step
Tu
Claude Code
1. Red
Scrivi test che fallisce
Suggerisce casi test
2. Green
Chiedi implementazione
Genera codice minimo
3. Refactor
Chiedi miglioramenti
Propone refactoring
4. Repeat
Aggiungi nuovo test
Suggerisce edge cases
Prompt - TDD Workflow
I'm following TDD. Here's my failing test:
```typescript
describe('calculateDiscount', () => {{ '{' }}
it('should apply 10% discount for orders over $100', () => {{ '{' }}
expect(calculateDiscount(150)).toBe(15);
{{ '}' }});
it('should apply 20% discount for orders over $500', () => {{ '{' }}
expect(calculateDiscount(600)).toBe(120);
{{ '}' }});
it('should return 0 for orders under $100', () => {{ '{' }}
expect(calculateDiscount(50)).toBe(0);
{{ '}' }});
{{ '}' }});
```
1. Implement the MINIMUM code to make these tests pass
2. Don't add features not covered by tests
3. After implementation, suggest additional edge cases I should test
Test Coverage e Gap Analysis
Usa Claude Code per identificare codice non coperto e generare test mancanti.
Prompt - Coverage Gap Analysis
My coverage report shows uncovered lines:
FILE: src/services/order.service.ts
UNCOVERED LINES: 45-52, 78-85, 120-135
Here's the code at those lines:
```typescript
// Lines 45-52
if (order.status === 'cancelled') {{ '{' }}
throw new ValidationError('Cannot modify cancelled order');
{{ '}' }}
// Lines 78-85
if (items.some(item => item.quantity > item.stock)) {{ '{' }}
const outOfStock = items.filter(i => i.quantity > i.stock);
throw new ValidationError(`Insufficient stock for: #123;{ '{' }}outOfStock.map(i => i.name).join(', '){{ '}' }}`);
{{ '}' }}
// Lines 120-135
if (coupon && coupon.expiresAt < new Date()) {{ '{' }}
throw new ValidationError('Coupon has expired');
{{ '}' }}
if (coupon && coupon.usageCount >= coupon.maxUsage) {{ '{' }}
throw new ValidationError('Coupon usage limit reached');
{{ '}' }}
```
Generate unit tests to cover these scenarios. Include:
1. Test for each branch
2. Boundary conditions
3. Descriptive test names
Testing Best Practices
Anti-Pattern
Test che dipendono dall'ordine
Stato condiviso tra test
Nomi vaghi: "should work"
Multiple assertions non correlate
Test troppo granulari
Mock eccessivo (testing mocks)
Test lenti senza motivo
Ignorare test flaky
Best Practices
Test indipendenti e isolati
Setup fresh per ogni test
Nomi descrittivi
Una asserzione logica per test
Test behavior, non implementation
Mock solo le dipendenze esterne
Ottimizza setup condiviso
Fix o rimuovi test flaky
Checklist qualità dei Test
Prima di Fare Merge
Tutti i test passano localmente
Coverage >= 80% per codice critico
Nessun test flaky (esegui 3 volte)
Test names sono descrittivi
Edge cases sono coperti
Error paths sono testati
Nessun console.log nei test
Fixtures sono pulite e riutilizzabili
Mock sono realistici
Test sono veloci (unit < 10s total)
Conclusione e Prossimi Passi
Il testing è dove Claude Code brilla davvero. Può generare test completi partendo
dal codice esistente, suggerire edge cases che potresti non aver considerato,
e aiutarti a mantenere alta la coverage senza sacrificare la velocità di sviluppo.
Ricorda: i test generati da Claude Code devono sempre essere verificati.
L'AI può generare test che passano ma non testano realmente il comportamento importante,
o che sono troppo legati all'implementazione invece che al comportamento.
Nel prossimo articolo vedremo come usare Claude Code per la
documentazione professionale: README completi, API documentation
con OpenAPI, Architecture Decision Records e JSDoc.
Punti Chiave da Ricordare
Piramide: 70% unit, 20% integration, 10% E2E
Unit: Isolamento completo, mock dipendenze
Integration: Testa l'API end-to-end con DB reale
TDD: Scrivi test prima, implementa dopo
Coverage: Mira a 80%+ per codice critico
Fixtures: Factory functions per dati riutilizzabili