{"ref":"capability:abap-unit-testing","page":"/capabilities/abap-unit-testing","json":"/capabilities/abap-unit-testing.json","generated":"2026-10-26","drafted_with_ai":true,"entity":{"id":"abap-unit-testing","name":"Unit testing","domain":"developer-experience","ecosystems":["abap"],"universal":false,"description":"Testing application logic without a running business process — and the test doubles that make dependencies on the database and on framework services tractable.","short":"Testing application logic, with test doubles for its dependencies","core_coverage":{"state":"core-and-community","assessed_at":"2026-10-15","what_core_does":"ABAP Unit is part of the language and the ADT tooling, with test seams, test doubles and the CDS test double framework.","where_it_stops":"Inside an ABAP system. ABAP Unit runs where the code is deployed, so a test needs a system to run in, and a pipeline that has none cannot run it.","community_adds":"Running the same tests with no system: [@abaplint/transpiler](artifact:abaplint-transpiler) turns the source and its ABAP Unit tests into JavaScript that runs on [Node.js](external:nodejs) in CI, with [open-abap-core](artifact:open-abap-open-abap-core) supplying the standard classes the output calls. [open-steamgate](artifact:oisee-open-steamgate) and the [@abap2ui5/mcp-server](artifact:abap2ui5-mcp-server) run ABAP Unit the same way from a repository's classes, the [abap2UI5 headless frontend](artifact:abap2ui5-headless-frontend) drives a whole abap2UI5 session inside an ABAP Unit test, and [Modernization Agents for SAP on AWS](artifact:aws-modernization-agents-for-sap) generates and runs tests either side of a conversion.","sources":[{"url":"https://help.sap.com/docs/abap-cloud/abap-development-tools-user-guide/unit-testing-with-abap-unit","title":"SAP Help — Unit Testing with ABAP Unit","checked":"2026-08-31"},{"url":"https://open-abap.org","title":"open-abap.org","checked":"2026-10-15","quote":"By transpiling ABAP to Javascript, ABAP can run on Node.js."},{"url":"https://github.com/abaplint/transpiler","title":"abaplint/transpiler — README","checked":"2026-10-15","quote":"abapGit runs unit tests on every push"}],"relationship":"unassessed"},"coverage_by_flavor":{"abap-cloud":{"state":"core-and-community","assessed_at":"2026-10-15","what_core_does":"ABAP Unit and its test double frameworks run unchanged in ABAP Cloud. SAP's own RAP400 workshop writes ABAP Unit tests for a RAP business object from an ABAP Cloud project on a BTP ABAP Environment trial system, doubling its CDS entities for reads with the CDS Test Double Framework and its database tables for writes with the ABAP SQL Test Double Framework, and the [abap-cheat-sheets](artifact:sap-samples-abap-cheat-sheets) unit-testing examples target the same environment.","where_it_stops":"A test double can only stand in for an object the code under test is allowed to reference, so it inherits ABAP Cloud's general restriction to released repository objects: an unreleased table or CDS entity is as out of reach for a test double as it is for production code.","community_adds":"Test runners and test containers from outside SAP that state ABAP Cloud add to ABAP Unit here.","note":"Read from the artifacts that state abap-cloud: [abap-unit-runner](artifact:xexer-abap-unit-runner) and [abap-test-container](artifact:xexer-abap-test-container).","sources":[{"url":"https://github.com/SAP-samples/abap-platform-rap-workshops/blob/main/rap4xx/rap400/README.md","title":"SAP-samples/abap-platform-rap-workshops: RAP400","checked":"2026-09-14","quote":"Writing ABAP Unit Tests for Apps built with the ABAP RESTful Application Programming Model (RAP)... You have created a SAP Business Technology Platform (BTP) ABAP Environment Trial account and connected your ADT to the Trial Account using a ABAP Cloud Project."},{"url":"https://github.com/SAP-samples/abap-platform-rap-workshops/blob/main/rap4xx/rap400/exercises/ex3/README.md","title":"SAP-samples/abap-platform-rap-workshops: RAP400 exercise 3","checked":"2026-09-14","quote":"The CDS test doubles will be used for read operations... The database test doubles will be used for write operations."},{"url":"https://github.com/SAP-samples/abap-cheat-sheets/blob/main/14_ABAP_Unit_Tests.md","title":"SAP-samples/abap-cheat-sheets: ABAP Unit Tests","checked":"2026-09-14","quote":"The examples are designed for the SAP BTP ABAP Environment."},{"url":"https://github.com/SAP-samples/abap-cheat-sheets/blob/main/19_ABAP_for_Cloud_Development.md","title":"SAP-samples/abap-cheat-sheets: ABAP for Cloud Development","checked":"2026-09-14","quote":"Access to SAP-delivered repository objects is restricted to objects released for ABAP for Cloud Development."}],"relationship":"unassessed"}},"history":[{"date":"2026-09-14","field":"coverage_by_flavor.abap-cloud","from":null,"to":"core-only","reason":"No artifact in the abap door states abap-cloud as a provider of capability:abap-unit-testing; ABAP Unit and its test double frameworks are part of the language and ADT tooling, and SAP's own RAP400 workshop and the abap-cheat-sheets unit-test examples both exercise them from a BTP ABAP Environment ABAP Cloud project, doubling only the released CDS entities and tables a RAP business object depends on."},{"date":"2026-10-15","field":"core_coverage","from":"core-only","to":"core-and-community","reason":"Intake of @abaplint/transpiler and open-abap-core: off-stack ABAP was placed under this capability on 2026-10-15, so running ABAP Unit tests on Node.js in CI is a community answer beside ABAP Unit in the system."},{"date":"2026-10-15","field":"coverage_by_flavor.abap-cloud","from":"core-only","to":"core-and-community","reason":"Two staged options state abap-cloud and provide this capability; the gate reads them as providers once this capability is revised."},{"date":"2026-10-17","field":"description","from":"Testing ABAP logic without a running business process — and the test doubles that make dependencies on the database and on framework services tractable.","to":"Testing application logic without a running business process — and the test doubles that make dependencies on the database and on framework services tractable.","reason":"Keep the default capability wording neutral; preserve the previous wording in framing_by_ecosystem.abap. Maintainer-requested scope audit."},{"date":"2026-10-26","field":"core_coverage.community_adds","from":"Running the same tests with no system: @abaplint/transpiler ... with open-abap-core supplying the standard classes the output calls.","to":"Same text, plus open-steamgate and the @abap2ui5/mcp-server running ABAP Unit off-system, the abap2UI5 headless frontend driving a session inside a test, and Modernization Agents for SAP on AWS generating tests around a conversion.","reason":"Reassessed against the graph (check:capabilities): four providers newer than the block, none named in the text, add off-system runners, framework-session tests and generated tests."},{"date":"2026-10-26","field":"coverage_by_flavor.abap-cloud.note","from":"Read from the artifacts that state abap-cloud, both of them waiting in staging on 2026-10-15; if neither is accepted, this returns to core-only.","to":"Read from the artifacts that state abap-cloud: abap-unit-runner and abap-test-container.","reason":"Reassessed against the graph (check:capabilities): the note counted the artifacts and said they were in staging; both are in the graph now and are named."}],"drafted_with_ai":true,"framing_by_ecosystem":{"abap":{"description":"Testing ABAP logic without a running business process — and the test doubles that make dependencies on the database and on framework services tractable."}}},"sap_delivery":{"door":"abap","all":null,"by_flavor":{"standard-abap":null,"abap-cloud":null}},"edges":{"use_cases":[],"shared_tasks":[],"related_tasks":[],"options":[{"ref":"artifact:abap2ui5-mcp-server","name":"@abap2ui5/mcp-server","json":"/artifacts/abap2ui5-mcp-server.json","ecosystem":"abap","origin_ring":"community-org"},{"ref":"artifact:abaplint-transpiler","name":"@abaplint/transpiler","json":"/artifacts/abaplint-transpiler.json","ecosystem":"abap","origin_ring":"community-org"},{"ref":"artifact:marcellourbani-vscode-abap-remote-fs","name":"ABAP remote filesystem","json":"/artifacts/marcellourbani-vscode-abap-remote-fs.json","ecosystem":"abap","origin_ring":"independent"},{"ref":"artifact:bunysae-abap-db-preparator","name":"abap_db_preparator","json":"/artifacts/bunysae-abap-db-preparator.json","ecosystem":"abap","origin_ring":"independent"},{"ref":"artifact:wozjac-abap-sencha","name":"abap-sencha","json":"/artifacts/wozjac-abap-sencha.json","ecosystem":"abap","origin_ring":"independent"},{"ref":"artifact:xexer-abap-test-container","name":"abap-test-container","json":"/artifacts/xexer-abap-test-container.json","ecosystem":"abap","origin_ring":"independent"},{"ref":"artifact:xexer-abap-unit-runner","name":"abap-unit-runner","json":"/artifacts/xexer-abap-unit-runner.json","ecosystem":"abap","origin_ring":"independent"},{"ref":"artifact:endresshauser-infoserve-abap-utesthelp","name":"abap-utesthelp","json":"/artifacts/endresshauser-infoserve-abap-utesthelp.json","ecosystem":"abap","origin_ring":"independent"},{"ref":"artifact:abap2ui5-headless-frontend","name":"abap2UI5 headless frontend","json":"/artifacts/abap2ui5-headless-frontend.json","ecosystem":"abap","origin_ring":"community-org"},{"ref":"artifact:larshp-abapcov","name":"abapCov","json":"/artifacts/larshp-abapcov.json","ecosystem":"abap","origin_ring":"independent"},{"ref":"artifact:xinitrc86-adash-services","name":"adash-services","json":"/artifacts/xinitrc86-adash-services.json","ecosystem":"abap","origin_ring":"independent"},{"ref":"artifact:abapify-assert","name":"assert","json":"/artifacts/abapify-assert.json","ecosystem":"abap","origin_ring":"independent"},{"ref":"artifact:dominikpanzer-cacamber-bdd-for-abap","name":"cacamber-BDD-for-ABAP","json":"/artifacts/dominikpanzer-cacamber-bdd-for-abap.json","ecosystem":"abap","origin_ring":"independent"},{"ref":"artifact:open-abap-express-icf-shim","name":"express-icf-shim","json":"/artifacts/open-abap-express-icf-shim.json","ecosystem":"abap","origin_ring":"community-org"},{"ref":"artifact:uweku-mocka","name":"mockA","json":"/artifacts/uweku-mocka.json","ecosystem":"abap","origin_ring":"independent"},{"ref":"artifact:sbcgua-mockup-loader","name":"mockup_loader","json":"/artifacts/sbcgua-mockup-loader.json","ecosystem":"abap","origin_ring":"independent"},{"ref":"artifact:aws-modernization-agents-for-sap","name":"Modernization Agents for SAP on AWS","json":"/artifacts/aws-modernization-agents-for-sap.json","ecosystem":"abap","origin_ring":"partner"},{"ref":"artifact:open-abap-open-abap-core","name":"open-abap-core","json":"/artifacts/open-abap-open-abap-core.json","ecosystem":"abap","origin_ring":"community-org"},{"ref":"artifact:oisee-open-steamgate","name":"open-steamgate","json":"/artifacts/oisee-open-steamgate.json","ecosystem":"abap","origin_ring":"independent"},{"ref":"artifact:germanysources-regression-test","name":"regression_test","json":"/artifacts/germanysources-regression-test.json","ecosystem":"abap","origin_ring":"independent"},{"ref":"artifact:uweku-vise-for-abap","name":"Vise_for_ABAP","json":"/artifacts/uweku-vise-for-abap.json","ecosystem":"abap","origin_ring":"independent"}],"samples":[{"ref":"artifact:abap2ui5-app-template","name":"app-template","json":"/artifacts/abap2ui5-app-template.json"},{"ref":"artifact:tricktresor-gladius","name":"gladius","json":"/artifacts/tricktresor-gladius.json"},{"ref":"artifact:tobiashofmann-off-stack-abap","name":"off-stack-abap","json":"/artifacts/tobiashofmann-off-stack-abap.json"},{"ref":"artifact:sap-samples-abap-platform-rap-workshops","name":"SAP-samples/abap-platform-rap-workshops","json":"/artifacts/sap-samples-abap-platform-rap-workshops.json"},{"ref":"artifact:sap-samples-teched2025-ad162","name":"teched2025-AD162","json":"/artifacts/sap-samples-teched2025-ad162.json"}],"explained_by":[{"ref":"content:by-passing-function-modules-in-aunits","name":"By-passing function modules in aunits","json":"/content/by-passing-function-modules-in-aunits.json"}],"normative_context":[]}}