El ABAP Test Cockpit (ATC) es la herramienta central de SAP para el análisis de calidad del código ABAP. Detecta problemas de rendimiento, seguridad, mantenibilidad y compatibilidad con ABAP Cloud.
Ejecución de ATC
En ADT (Eclipse)
- Clic derecho en el objeto o paquete
- Seleccionar Run As -> ABAP Test Cockpit
- Seleccionar perfil de comprobación
- Ver resultados en la vista ATC Problems
En SE80/Transacción ATC
Transacción: ATC1. Introducir objeto o paquete2. Seleccionar variante de comprobación3. Ejecutar4. Analizar resultadosMediante código
" Ejecutar ATC programáticamenteDATA(lo_atc) = cl_satc_adt_ch_factory=>create_check_run( ).
lo_atc->set_check_profile( 'ABAP_CLOUD_DEVELOPMENT' ).lo_atc->add_object( VALUE satc_s_obj_key( obj_type = 'CLAS' obj_name = 'ZCL_MY_CLASS' )).
lo_atc->execute( ).
DATA(lt_findings) = lo_atc->get_findings( ).Perfiles de comprobación
Perfiles estándar
| Perfil | Descripción |
|---|---|
ABAP_CLOUD_DEVELOPMENT | Para desarrollo ABAP Cloud |
SLIN_SEC | Comprobaciones de seguridad |
PERFORMANCE | Análisis de rendimiento |
DEFAULT | Comprobaciones estándar |
Crear perfil personalizado
Transacción: ATC-> Administración -> Definir perfiles de comprobación
Perfil: Z_MY_PROFILEDescripción: Perfil de comprobación del proyecto
Comprobaciones incluidas:- Comprobación de sintaxis extendida- Comprobaciones de rendimiento- Comprobaciones de seguridad- Comprobaciones de Clean ABAPCategorías de hallazgos
Prioridad 1 (Error)
Problemas críticos que deben corregirse:
" Error: SQL Injection potencialSELECT * FROM (lv_table_name) INTO TABLE @lt_data.
" Corrección: Usar tabla fija o whitelistIF lv_table_name = 'ZTABLE1' OR lv_table_name = 'ZTABLE2'. SELECT * FROM (lv_table_name) INTO TABLE @lt_data.ENDIF.Prioridad 2 (Advertencia)
Problemas que deberían revisarse:
" Advertencia: SELECT * en tabla grandeSELECT * FROM vbak INTO TABLE @DATA(lt_orders).
" Corrección: Especificar camposSELECT vbeln, kunnr, netwr FROM vbak INTO TABLE @DATA(lt_orders).Prioridad 3 (Información)
Sugerencias de mejora:
" Info: Variable no utilizadaDATA: lv_unused TYPE string.
" Corrección: Eliminar variable" (o usar si es necesaria)Comprobaciones importantes
Comprobaciones de rendimiento
" MALO: SELECT en loopLOOP AT lt_customers INTO DATA(ls_customer). SELECT * FROM vbak INTO TABLE @DATA(lt_orders) WHERE kunnr = @ls_customer-kunnr.ENDLOOP.
" BIEN: JOIN o FOR ALL ENTRIESSELECT * FROM vbak INTO TABLE @DATA(lt_all_orders) FOR ALL ENTRIES IN @lt_customers WHERE kunnr = @lt_customers-kunnr.Comprobaciones de seguridad
" MALO: Hardcoded passwordDATA(lv_password) = 'secret123'.
" BIEN: Usar Secure StoreDATA(lo_ssf) = cl_ssf_kms_lib=>read_credential( ).Comprobaciones ABAP Cloud
" MALO: API no liberadaDATA(lv_uname) = sy-uname.
" BIEN: API liberadaDATA(lv_user) = cl_abap_context_info=>get_user_technical_name( ).Exempciones
Crear exempción
En ADT:1. Clic derecho en el hallazgo2. "Request Exemption"3. Justificar4. Enviar para aprobación
En transacción:ATC -> Gestión de exempcionesTipos de exempción
| Tipo | Descripción | Validez |
|---|---|---|
| Falso positivo | El hallazgo es incorrecto | Permanente |
| Aceptación de riesgo | Riesgo conocido y aceptado | Temporal/Permanente |
| Postergación | Se corregirá más tarde | Temporal |
Exempción en el código
" Suprimir hallazgo específico (no recomendado)" Mejor solicitar exempción formal
" Pragma para suprimir (usar con precaución)DATA(lv_value) = sy-uname ##NEEDED.Integración en CI/CD
abapLint
{ "global": { "files": "/src/**/*.*" }, "syntax": { "version": "Cloud", "errorNamespace": "^(Z|Y)" }, "rules": { "avoid_use": { "define": true, "endselect": true, "statics": true }, "line_length": { "length": 120 } }}Pipeline de GitHub Actions
name: ATC Check
on: [push, pull_request]
jobs: atc: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3
- name: abaplint uses: abaplint/abaplint-action@v1 with: config: '.abaplint.json'Configuración de proyecto
Variante de comprobación por paquete
Transacción: ATC-> Administración -> Asignar variante a paquete
Paquete: ZPROJECTVariante: Z_PROJECT_CHECKSComprobación automática antes del transporte
Transacción: ATC-> Administración -> Configuración de transporte
Activar: Comprobación ATC obligatoriaPrioridad mínima para bloqueo: 2Resolver hallazgos comunes
SELECT INTO CORRESPONDING
" Hallazgo: SELECT INTO CORRESPONDING puede ser lentoSELECT * FROM ztable INTO CORRESPONDING FIELDS OF TABLE @lt_data.
" Corrección: Especificar campos explícitamenteSELECT field1, field2, field3 FROM ztable INTO TABLE @DATA(lt_data).Nombres demasiado cortos
" Hallazgo: Nombre de variable demasiado cortoDATA: x TYPE i.
" Corrección: Nombre descriptivoDATA: lv_counter TYPE i.Missing return
" Hallazgo: Método sin RETURN en todos los pathsMETHOD get_value. IF condition. rv_value = 1. ENDIF. " Falta RETURN para el ELSEENDMETHOD.
" CorrecciónMETHOD get_value. IF condition. rv_value = 1. ELSE. rv_value = 0. ENDIF.ENDMETHOD.Métricas de calidad
Dashboard de ATC
Transacción: ATC-> Evaluación -> Dashboard
Métricas mostradas:- Número de hallazgos por prioridad- Tendencia en el tiempo- Hallazgos por desarrollador- Hallazgos por paqueteKPIs recomendados
| KPI | Objetivo |
|---|---|
| Hallazgos P1 | 0 |
| Hallazgos P2 | < 10 por objeto |
| Hallazgos P3 | < 50 por objeto |
| Exempciones | < 5% de hallazgos |
Notas importantes / Mejores prácticas
- Ejecuta ATC regularmente durante el desarrollo.
- Usa el perfil ABAP_CLOUD_DEVELOPMENT para código cloud.
- Corrige hallazgos P1 siempre, P2 cuando sea posible.
- Documenta exempciones con justificación clara.
- Integra ATC en el pipeline CI/CD.
- Configura comprobación antes del transporte.
- Usa ABAP Cleaner para correcciones automáticas.
- Combina con ABAP Unit para cobertura de tests.