ABAP Test Cockpit (ATC): Análisis de calidad de código

Kategorie
ABAP-Statements
Veröffentlicht
Autor
Johannes

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)

  1. Clic derecho en el objeto o paquete
  2. Seleccionar Run As -> ABAP Test Cockpit
  3. Seleccionar perfil de comprobación
  4. Ver resultados en la vista ATC Problems

En SE80/Transacción ATC

Transacción: ATC
1. Introducir objeto o paquete
2. Seleccionar variante de comprobación
3. Ejecutar
4. Analizar resultados

Mediante código

" Ejecutar ATC programáticamente
DATA(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

PerfilDescripción
ABAP_CLOUD_DEVELOPMENTPara desarrollo ABAP Cloud
SLIN_SECComprobaciones de seguridad
PERFORMANCEAnálisis de rendimiento
DEFAULTComprobaciones estándar

Crear perfil personalizado

Transacción: ATC
-> Administración -> Definir perfiles de comprobación
Perfil: Z_MY_PROFILE
Descripción: Perfil de comprobación del proyecto
Comprobaciones incluidas:
- Comprobación de sintaxis extendida
- Comprobaciones de rendimiento
- Comprobaciones de seguridad
- Comprobaciones de Clean ABAP

Categorías de hallazgos

Prioridad 1 (Error)

Problemas críticos que deben corregirse:

" Error: SQL Injection potencial
SELECT * FROM (lv_table_name) INTO TABLE @lt_data.
" Corrección: Usar tabla fija o whitelist
IF 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 grande
SELECT * FROM vbak INTO TABLE @DATA(lt_orders).
" Corrección: Especificar campos
SELECT vbeln, kunnr, netwr
FROM vbak
INTO TABLE @DATA(lt_orders).

Prioridad 3 (Información)

Sugerencias de mejora:

" Info: Variable no utilizada
DATA: lv_unused TYPE string.
" Corrección: Eliminar variable
" (o usar si es necesaria)

Comprobaciones importantes

Comprobaciones de rendimiento

" MALO: SELECT en loop
LOOP 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 ENTRIES
SELECT * FROM vbak INTO TABLE @DATA(lt_all_orders)
FOR ALL ENTRIES IN @lt_customers
WHERE kunnr = @lt_customers-kunnr.

Comprobaciones de seguridad

" MALO: Hardcoded password
DATA(lv_password) = 'secret123'.
" BIEN: Usar Secure Store
DATA(lo_ssf) = cl_ssf_kms_lib=>read_credential( ).

Comprobaciones ABAP Cloud

" MALO: API no liberada
DATA(lv_uname) = sy-uname.
" BIEN: API liberada
DATA(lv_user) = cl_abap_context_info=>get_user_technical_name( ).

Exempciones

Crear exempción

En ADT:
1. Clic derecho en el hallazgo
2. "Request Exemption"
3. Justificar
4. Enviar para aprobación
En transacción:
ATC -> Gestión de exempciones

Tipos de exempción

TipoDescripciónValidez
Falso positivoEl hallazgo es incorrectoPermanente
Aceptación de riesgoRiesgo conocido y aceptadoTemporal/Permanente
PostergaciónSe corregirá más tardeTemporal

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

.abaplint.json
{
"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: ZPROJECT
Variante: Z_PROJECT_CHECKS

Comprobación automática antes del transporte

Transacción: ATC
-> Administración -> Configuración de transporte
Activar: Comprobación ATC obligatoria
Prioridad mínima para bloqueo: 2

Resolver hallazgos comunes

SELECT INTO CORRESPONDING

" Hallazgo: SELECT INTO CORRESPONDING puede ser lento
SELECT * FROM ztable INTO CORRESPONDING FIELDS OF TABLE @lt_data.
" Corrección: Especificar campos explícitamente
SELECT field1, field2, field3
FROM ztable
INTO TABLE @DATA(lt_data).

Nombres demasiado cortos

" Hallazgo: Nombre de variable demasiado corto
DATA: x TYPE i.
" Corrección: Nombre descriptivo
DATA: lv_counter TYPE i.

Missing return

" Hallazgo: Método sin RETURN en todos los paths
METHOD get_value.
IF condition.
rv_value = 1.
ENDIF.
" Falta RETURN para el ELSE
ENDMETHOD.
" Corrección
METHOD 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 paquete

KPIs recomendados

KPIObjetivo
Hallazgos P10
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.