ABAP Performance Tuning in S/4HANA Series : Part 4 : ATC

Estimated read time 10 min read

ATC: Make the ABAP Test Cockpit Your Pre-Transport Quality Gate

Series: ABAP Performance Tuning in S/4HANA | Part 4 of 7 | Author: Manish Khanna

Someone transported a SELECT inside a loop to production. It ran fine in the 200-record test system. In production, with 2 million records, it ran for 6 hours and locked the batch window. A 30-second ATC check before transport would have caught it. This post is about making sure that scenario never happens in your landscape.

ATC — ABAP Test Cockpit — is SAP’s official static code analysis framework. It ships with the ABAP platform, runs in ADT and SE80, and has a REST API for CI/CD pipelines. It replaces every custom static analysis report your team has built.

What ATC Does

ATC analyzes ABAP source code without executing it. It finds:

 

Check CategoryExamplesPerformanceSELECT *, SELECT in LOOP, missing WHERE clause, FAE without IS NOT INITIAL guardSQLExpensive SQL patterns, full table scans (when DB metadata available)SecuritySQL injection risks, missing authority checks, hardcoded credentialsRobust CodeDead code, unreachable statements, potential runtime errorsABAP Cloud ReadinessDeprecated statements, non-released APIs (for BTP/S/4 migration)NamingZ/Y naming convention violations

The critical difference from tracing: you don’t need representative data, you don’t need a trace file, and it takes seconds not minutes.

Priority Levels — What Requires Action

 

Priority Label What It MeansWhat You Must Do1ErrorCritical — transport should be blockedFix before transport. No exceptions.2WarningSignificant riskFix, or create an approved exemption3InformationSuggestionFix at discretion

Priority 1 findings are not negotiable. If you’re releasing transports with Priority 1 ATC findings, you are shipping known defects.

Key Performance Checks in Detail

These are the checks you care about most. Priority 1 configuration is recommended for all of them:

 

Check What It Catches Classic Anti-PatternSELECT *Fetches all columnsSELECT * FROM vbak INTO TABLE lt_ordersSELECT in LOOPN+1 patternLOOP AT lt. SELECT SINGLE … ENDLOOP.FAE without IS NOT INITIALEmpty driver → full scanSELECT … FOR ALL ENTRIES IN lt_emptyBYPASSING BUFFERUnnecessary cache bypassSELECT … BYPASSING BUFFER FROM t001COMMIT WORK in LOOPTransactional integrity riskLOOP AT lt. UPDATE db. COMMIT WORK. ENDLOOP.NEW / CREATE OBJECT in LOOPMemory + CPU overheadLOOP AT lt. lo = NEW zcl_proc(). ENDLOOP.

Running ATC Checks

From ADT (Eclipse) — Recommended

Right-click your object or package in the Project ExplorerRun As → ABAP Test CockpitSelect your check variant (more on variants below)Results appear in the ATC Results view, grouped by priority

From SE80 (SAP GUI)

Transaction ATCEnter your program name or packageSelect check variantExecute (F8)Results grouped by message priority

💡Tip: Always run at package level before transport, not just on the changed object. Downstream programs that consume your changed code can also be affected.

Check Variants — Configure Your Quality Bar

The default ATC variant checks everything at default priorities. That’s too noisy for daily use and not strict enough for transport gates.

Create project-specific variants in ATC_CONFIG (or via ADT preferences):

Z_PERF_STRICT — for transport gates:

All PERF and SQL category checks at Priority 1Block transport on any Priority 1 findingZero tolerance for SELECT in LOOP, SELECT *, FAE guard, COMMIT WORK in LOOP

Z_PERF_STANDARD — for development reviews:

Performance checks at Priority 2Warning only — does not block transportUseful for daily development feedback

Z_CLOUD_READY — for S/4HANA migration projects:

ABAP Cloud readiness checks enabledCatches deprecated statements and non-released APIs

Exemptions — When You Can’t Fix It Right Now

Sometimes a Priority 2 finding is a known technical limitation that can’t be fixed immediately. ATC has a built-in exemption workflow:

Developer requests exemption in ADT or SE80Justification text is required — no blank exemptionsApprover (architect or lead) reviews and approves/rejectsApproved exemptions are stored and auditableSet an expiry date on all exemptions

⚠️Warning: Exemptions bypass the quality gate. Audit your exemption list quarterly. Expired exemptions that were “temporary 18 months ago” are technical debt you forgot about.

CI/CD Integration — The Right Way

If you’re using abapGit, ADT, or the SAP CI/CD service, integrate ATC as a pipeline step:

Developer commits code

Git push → CI pipeline triggers

1. abapGit pull to ATC system
2. ATC run via REST API — check variant Z_PERF_STRICT
POST /sap/bc/adt/atc/runs
3. Parse JSON results
4. Priority 1 findings > 0?
→ YES: FAIL pipeline. Block merge. Notify developer.
→ NO: Continue
5. Priority 2 findings > 0?
→ YES: WARNING. Notify reviewer.
→ NO: PASS. Allow merge and transport.

The REST API endpoint: POST /sap/bc/adt/atc/runs Authentication: Basic Auth or OAuth2 with a dedicated technical user. Response: XML (ADT format) or JSON — parse the priority and message fields.

This means no Priority 1 performance defect can reach production without a human decision to override the pipeline. That’s the quality gate.

ATC vs. Custom Static Analysis Tools

If your team has built a custom ABAP report to scan for performance anti-patterns (25 rules, custom scoring, manual maintenance), here’s the honest comparison:

 

Capability Custom ToolATCRule updatesManual development effortSAP delivers with kernel/basis updatesIDE integrationUsually SE38 onlyADT, SE80, BAS — full IDE supportCI/CDTypically noneREST API, pipeline-readyCheck scopeWhatever you codedPerformance + security + quality + cloud (hundreds of checks)Multi-line statement analysisOften single-line scannerFull ABAP parserExemption workflowNoneBuilt-in approval + audit trailTransport blockingNoneConfigurable transport release check

Retire your custom scanner. Maintain your check variants in ATC instead.

Recommended Workflow

Run ATC with Z_PERF_STRICT before raising a transport requestFix all Priority 1 findings — mandatoryFix Priority 2 findings or create approved exemptions with documented justificationIf the change touches CDS views: run CDS-specific ATC checks tooAfter ATC is clean: proceed to ST05/SAT trace with representative data

ATC is Step 0, not an optional extra. It saves hours of trace analysis by eliminating the basics upfront.

 

 

Key Takeaways

ATC is SAP’s official static analyzer — it ships with the platform, no custom tooling neededPriority 1 findings must be fixed before transport. No exceptions.Create project-specific check variants (Z_PERF_STRICT) — don’t rely on the defaultIntegrate ATC into your CI/CD pipeline via the REST API (/sap/bc/adt/atc/runs)Audit exemptions quarterly — stale exemptions are hidden technical debt

Next in this series: S/4HANA Performance: CDS Views, Pushdown, and Entity Buffers — why “just move to HANA” is not a performance strategy, and what CDS pushdown actually means in practice.

Series Home Page  

 

​ ATC: Make the ABAP Test Cockpit Your Pre-Transport Quality GateSeries: ABAP Performance Tuning in S/4HANA | Part 4 of 7 | Author: Manish KhannaSomeone transported a SELECT inside a loop to production. It ran fine in the 200-record test system. In production, with 2 million records, it ran for 6 hours and locked the batch window. A 30-second ATC check before transport would have caught it. This post is about making sure that scenario never happens in your landscape.ATC — ABAP Test Cockpit — is SAP’s official static code analysis framework. It ships with the ABAP platform, runs in ADT and SE80, and has a REST API for CI/CD pipelines. It replaces every custom static analysis report your team has built.What ATC DoesATC analyzes ABAP source code without executing it. It finds: Check CategoryExamplesPerformanceSELECT *, SELECT in LOOP, missing WHERE clause, FAE without IS NOT INITIAL guardSQLExpensive SQL patterns, full table scans (when DB metadata available)SecuritySQL injection risks, missing authority checks, hardcoded credentialsRobust CodeDead code, unreachable statements, potential runtime errorsABAP Cloud ReadinessDeprecated statements, non-released APIs (for BTP/S/4 migration)NamingZ/Y naming convention violationsThe critical difference from tracing: you don’t need representative data, you don’t need a trace file, and it takes seconds not minutes.Priority Levels — What Requires Action Priority Label What It MeansWhat You Must Do1ErrorCritical — transport should be blockedFix before transport. No exceptions.2WarningSignificant riskFix, or create an approved exemption3InformationSuggestionFix at discretionPriority 1 findings are not negotiable. If you’re releasing transports with Priority 1 ATC findings, you are shipping known defects.Key Performance Checks in DetailThese are the checks you care about most. Priority 1 configuration is recommended for all of them: Check What It Catches Classic Anti-PatternSELECT *Fetches all columnsSELECT * FROM vbak INTO TABLE lt_ordersSELECT in LOOPN+1 patternLOOP AT lt. SELECT SINGLE … ENDLOOP.FAE without IS NOT INITIALEmpty driver → full scanSELECT … FOR ALL ENTRIES IN lt_emptyBYPASSING BUFFERUnnecessary cache bypassSELECT … BYPASSING BUFFER FROM t001COMMIT WORK in LOOPTransactional integrity riskLOOP AT lt. UPDATE db. COMMIT WORK. ENDLOOP.NEW / CREATE OBJECT in LOOPMemory + CPU overheadLOOP AT lt. lo = NEW zcl_proc(). ENDLOOP.Running ATC ChecksFrom ADT (Eclipse) — RecommendedRight-click your object or package in the Project ExplorerRun As → ABAP Test CockpitSelect your check variant (more on variants below)Results appear in the ATC Results view, grouped by priorityFrom SE80 (SAP GUI)Transaction ATCEnter your program name or packageSelect check variantExecute (F8)Results grouped by message priority💡Tip: Always run at package level before transport, not just on the changed object. Downstream programs that consume your changed code can also be affected.Check Variants — Configure Your Quality BarThe default ATC variant checks everything at default priorities. That’s too noisy for daily use and not strict enough for transport gates.Create project-specific variants in ATC_CONFIG (or via ADT preferences):Z_PERF_STRICT — for transport gates:All PERF and SQL category checks at Priority 1Block transport on any Priority 1 findingZero tolerance for SELECT in LOOP, SELECT *, FAE guard, COMMIT WORK in LOOPZ_PERF_STANDARD — for development reviews:Performance checks at Priority 2Warning only — does not block transportUseful for daily development feedbackZ_CLOUD_READY — for S/4HANA migration projects:ABAP Cloud readiness checks enabledCatches deprecated statements and non-released APIsExemptions — When You Can’t Fix It Right NowSometimes a Priority 2 finding is a known technical limitation that can’t be fixed immediately. ATC has a built-in exemption workflow:Developer requests exemption in ADT or SE80Justification text is required — no blank exemptionsApprover (architect or lead) reviews and approves/rejectsApproved exemptions are stored and auditableSet an expiry date on all exemptions⚠️Warning: Exemptions bypass the quality gate. Audit your exemption list quarterly. Expired exemptions that were “temporary 18 months ago” are technical debt you forgot about.CI/CD Integration — The Right WayIf you’re using abapGit, ADT, or the SAP CI/CD service, integrate ATC as a pipeline step:Developer commits code

Git push → CI pipeline triggers

1. abapGit pull to ATC system
2. ATC run via REST API — check variant Z_PERF_STRICT
POST /sap/bc/adt/atc/runs
3. Parse JSON results
4. Priority 1 findings > 0?
→ YES: FAIL pipeline. Block merge. Notify developer.
→ NO: Continue
5. Priority 2 findings > 0?
→ YES: WARNING. Notify reviewer.
→ NO: PASS. Allow merge and transport.The REST API endpoint: POST /sap/bc/adt/atc/runs Authentication: Basic Auth or OAuth2 with a dedicated technical user. Response: XML (ADT format) or JSON — parse the priority and message fields.This means no Priority 1 performance defect can reach production without a human decision to override the pipeline. That’s the quality gate.ATC vs. Custom Static Analysis ToolsIf your team has built a custom ABAP report to scan for performance anti-patterns (25 rules, custom scoring, manual maintenance), here’s the honest comparison: Capability Custom ToolATCRule updatesManual development effortSAP delivers with kernel/basis updatesIDE integrationUsually SE38 onlyADT, SE80, BAS — full IDE supportCI/CDTypically noneREST API, pipeline-readyCheck scopeWhatever you codedPerformance + security + quality + cloud (hundreds of checks)Multi-line statement analysisOften single-line scannerFull ABAP parserExemption workflowNoneBuilt-in approval + audit trailTransport blockingNoneConfigurable transport release checkRetire your custom scanner. Maintain your check variants in ATC instead.Recommended WorkflowRun ATC with Z_PERF_STRICT before raising a transport requestFix all Priority 1 findings — mandatoryFix Priority 2 findings or create approved exemptions with documented justificationIf the change touches CDS views: run CDS-specific ATC checks tooAfter ATC is clean: proceed to ST05/SAT trace with representative dataATC is Step 0, not an optional extra. It saves hours of trace analysis by eliminating the basics upfront.  Key TakeawaysATC is SAP’s official static analyzer — it ships with the platform, no custom tooling neededPriority 1 findings must be fixed before transport. No exceptions.Create project-specific check variants (Z_PERF_STRICT) — don’t rely on the defaultIntegrate ATC into your CI/CD pipeline via the REST API (/sap/bc/adt/atc/runs)Audit exemptions quarterly — stale exemptions are hidden technical debtNext in this series: S/4HANA Performance: CDS Views, Pushdown, and Entity Buffers — why “just move to HANA” is not a performance strategy, and what CDS pushdown actually means in practice.Series Home Page     Read More Technology Blog Posts by Members articles 

#SAP

#SAPTechnologyblog

You May Also Like

More From Author