Estado Actual de Testing¶
Este documento describe el estado actual de la cobertura de tests en mcp-scan.
Resumen Ejecutivo¶
| Metrica | Valor | Objetivo |
|---|---|---|
| Archivos de test | 18 | - |
| Tests totales | ~150 | 200+ |
| Cobertura estimada | ~70% | 80%+ |
| Benchmarks | 8 | 15+ |
Cobertura por Paquete¶
Alta Cobertura (>80%)¶
| Paquete | Archivo Test | Tests | Estado |
|---|---|---|---|
internal/pattern |
engine_test.go |
50+ | Excelente |
internal/callgraph |
graph_test.go |
15 | Buena |
internal/ml |
classifier_test.go |
12 | Buena |
internal/imports |
resolver_test.go |
12 | Buena |
internal/typeinfo |
types_test.go |
8 | Buena |
Cobertura Media (50-80%)¶
| Paquete | Archivo Test | Tests | Gaps |
|---|---|---|---|
internal/parser |
parser_test.go |
15 | Falta Go parser |
internal/taint |
engine_test.go |
12 | Interprocedural parcial |
pkg/scanner |
scanner_test.go |
8 | Mas integracion |
internal/surface |
surface_test.go |
6 | Mas frameworks |
internal/catalog |
catalog_test.go |
6 | Validar completitud |
Baja Cobertura (<50%)¶
| Paquete | Archivo Test | Tests | Necesita |
|---|---|---|---|
internal/reporter |
reporter_test.go |
4 | SARIF validation |
internal/baseline |
baseline_test.go |
3 | Diff testing |
internal/msss |
msss_test.go |
2 | Scoring validation |
internal/config |
config_test.go |
3 | Edge cases |
Analisis por Componente¶
1. Parser (internal/parser/)¶
Estado: Parcial
Lo que esta testeado: - Parsing Python basico - Parsing TypeScript basico - Extraccion de funciones - Deteccion de decoradores MCP - Funciones async - Imports - Clases y metodos - Parametros tipados
Lo que falta: - Parser Go (no implementado) - Parser JavaScript (parcial) - Herencia de clases - Closures y lambdas complejas - Type annotations avanzadas - Error recovery
Prioridad: Alta - Go parser necesario
2. Motor de Patrones (internal/pattern/)¶
Estado: Excelente
Lo que esta testeado:
| Detector | Tests | Estado |
|---|---|---|
| PromptInjectionDetector | 8 | Completo |
| UnicodeDetector | 6 | Completo |
| HardcodedSecretDetector | 10 | Completo |
| DirectShellDetector | 8 | Completo |
| DangerousFunctionDetector | 6 | Completo |
| SQLConcatDetector | 8 | Completo |
| SecretLoggingDetector | 6 | Completo |
| WeakJWTDetector | 6 | Completo |
| OAuthStateDetector | 4 | Bueno |
| ToolShadowingDetector | 6 | Completo |
| UntrustedDependencyDetector | 6 | Completo |
| PathTraversalPatternDetector | 6 | Completo |
| InsecureCookieDetector | 6 | Completo |
| UnvalidatedURLDetector | 4 | Bueno |
Lo que falta: - Tests de combinaciones de detectores - Tests de performance bajo carga - Mas casos de edge cases
Prioridad: Baja - bien cubierto
3. Motor de Taint (internal/taint/)¶
Estado: Parcial
Lo que esta testeado: - Flujo directo source → sink - Propagacion por asignacion - Propagacion por concatenacion - Llamadas a funciones (basico) - Sanitizadores
Lo que falta: - Analisis interprocedural completo - Flujos a traves de callbacks - Flujos a traves de closures - Propagacion en estructuras de datos - Context sensitivity - Taint en retornos de funciones externas
Prioridad: Alta - core del analisis
4. Grafo de Llamadas (internal/callgraph/)¶
Estado: Bueno
Lo que esta testeado: - Creacion y manipulacion del grafo - Agregar/remover nodos y aristas - Busqueda de callees/callers - Alcanzabilidad (BFS) - Deteccion de ciclos - Funciones por archivo - Estadisticas
Lo que falta: - Callbacks y funciones de orden superior - Virtual calls (metodos de clases) - Resolucion dinamica
Prioridad: Media
5. Clasificador ML (internal/ml/)¶
Estado: Bueno
Lo que esta testeado: - Clasificador basado en reglas - Clasificador con pesos - Clasificador ensemble - Carga de pesos desde JSON - Niveles de confianza - Serializacion JSON - Benchmarks de performance
Lo que falta: - Tests con datasets grandes - Validacion de precision/recall - Tests de robustez (adversarial) - Cross-validation
Prioridad: Media
6. Scanner (pkg/scanner/)¶
Estado: Parcial
Lo que esta testeado: - Creacion con opciones - Escaneo de archivo individual - Escaneo de directorio - Patrones de exclusion - Deteccion de superficie MCP - Generacion de findings
Lo que falta: - Tests E2E completos - Modo deep vs fast - Integracion con todos los detectores - Performance con proyectos grandes - Multiples lenguajes mezclados
Prioridad: Alta
7. Reporter (internal/reporter/)¶
Estado: Bajo
Lo que esta testeado: - Generacion JSON basica - Generacion SARIF basica
Lo que falta: - Validacion de schema SARIF - Evidence bundle - Formatos de salida adicionales - Pretty printing - Streaming output
Prioridad: Media
Fixtures¶
Estado por Clase¶
| Clase | Vulnerables | Benignos | Python | TS | Go | Estado |
|---|---|---|---|---|---|---|
| A (RCE) | 4 | 2 | Si | Si | No | Bueno |
| B (Path) | 3 | 1 | Si | Si | No | Bueno |
| C (SSRF) | 2 | 1 | Si | No | No | Parcial |
| D (SQLi) | 4 | 2 | Si | Si | No | Bueno |
| E (Secrets) | 5 | 1 | Si | Si | No | Bueno |
| F (Auth) | 4 | 2 | Si | Si | No | Bueno |
| G (Poisoning) | 4 | 1 | Si | No | No | Bueno |
| H (Decl/Behav) | 2 | 1 | Si | No | No | Parcial |
| I (Multi-tool) | 2 | 0 | Si | No | No | Minimo |
| J (Memory) | 1 | 0 | Si | No | No | Minimo |
| K (Task) | 1 | 0 | Si | No | No | Minimo |
| L (Lifecycle) | 1 | 0 | Si | No | No | Minimo |
| M (Network) | 1 | 0 | Si | No | No | Minimo |
| N (Supply) | 2 | 1 | Si | No | No | Parcial |
Necesidades¶
- TypeScript: Agregar fixtures TS para clases C, G-N
- Go: Agregar fixtures Go para todas las clases
- Benignos: Agregar mas fixtures benignos para validar FP rate
- Edge cases: Casos limite para cada clase
DVMCP¶
Estado de Deteccion¶
| Challenge | Esperado | Detectado | Estado |
|---|---|---|---|
| 1 (Prompt Inj) | 1-2 | 2 | OK |
| 2 (Poisoning) | 1-2 | 1 | OK |
| 3 (Permissions) | 1 | 0 | FALTA |
| 4 (Rug Pull) | 1 | 0 | FALTA |
| 5 (Shadowing) | 1-2 | 1 | OK |
| 6 (Indirect) | 1-2 | 1 | PARCIAL |
| 7 (Token) | 2-3 | 2 | OK |
| 8 (Code Exec) | 2-3 | 2 | OK |
| 9 (Backdoor) | 2-3 | 1 | PARCIAL |
| 10 (Multi) | 5+ | 3 | PARCIAL |
Tasa de deteccion: ~65%
Benchmarks¶
Existentes¶
| Benchmark | Paquete | ns/op | Memoria |
|---|---|---|---|
| RuleBasedClassifier | ml | ~500 | ~1KB |
| FeatureExtraction | ml | ~200 | ~512B |
Necesarios¶
| Benchmark | Paquete | Razon |
|---|---|---|
| Parser_Python | parser | Baseline parsing |
| Parser_TypeScript | parser | Baseline parsing |
| TaintEngine_Simple | taint | Performance taint |
| TaintEngine_Complex | taint | Scaling |
| Scanner_SmallProject | scanner | E2E baseline |
| Scanner_MediumProject | scanner | E2E scaling |
| Scanner_LargeProject | scanner | Limits |
Plan de Mejora¶
Corto Plazo (Sprint actual)¶
- Aumentar cobertura taint:
- Agregar tests interprocedurales
-
Tests de callbacks y closures
-
Completar fixtures TypeScript:
-
Clases C, G, H, I
-
Scanner E2E:
- Tests de integracion completos
- Validar todos los detectores
Mediano Plazo (Proximo mes)¶
- Go parser y fixtures:
- Implementar parser Go
-
Fixtures Go para clases principales
-
Reporter completo:
- Validacion SARIF schema
-
Evidence bundle testing
-
Benchmarks completos:
- Parser benchmarks
- Scanner benchmarks
Largo Plazo (Trimestre)¶
- DVMCP cobertura 90%:
- Detectar challenges 3, 4
-
Mejorar deteccion multi-vector
-
ML validation:
- Dataset de validacion
-
Metricas precision/recall
-
Fuzzing:
- Fuzzing del parser
- Fuzzing de detectores
Metricas de Calidad¶
Actuales¶
| Metrica | Valor | Target |
|---|---|---|
| Cobertura lineas | ~70% | 80% |
| Tests por paquete | 8-50 | 15+ |
| Tiempo CI | ~2min | <3min |
| Flaky tests | 0 | 0 |
Tracking¶
# Generar reporte de cobertura
go test -coverprofile=coverage.out ./...
go tool cover -func=coverage.out | tail -1
# Contar tests
go test -v ./... 2>&1 | grep -c "=== RUN"
# Verificar flaky
for i in {1..10}; do go test ./... || echo "FLAKY"; done
Contribuir¶
Para mejorar la cobertura de tests:
- Identificar gaps en este documento
- Priorizar segun la tabla de prioridades
- Crear issue describiendo los tests a agregar
- Implementar siguiendo patrones existentes
- Actualizar este documento
Template de Issue¶
## Agregar tests para [componente]
### Contexto
[Descripcion del gap identificado]
### Tests a agregar
- [ ] Test 1: descripcion
- [ ] Test 2: descripcion
- [ ] Test 3: descripcion
### Fixtures necesarios
- [ ] Fixture vulnerable
- [ ] Fixture benigno
### Criterio de aceptacion
- Cobertura del componente >= 80%
- Todos los tests pasan
- Documentacion actualizada
Ultima actualizacion: Enero 2026