@ui5/middleware-code-coverage
UI5 CLI server middleware that instruments a project's JavaScript files with Istanbul as the dev server sends them, and generates the coverage report from the records the OpenUI5 QUnit tests send back.
Client-side code coverage needs the source instrumented before the browser runs the tests. This middleware intercepts every .js file before it is sent to the client and instruments it on the fly with Istanbul, creating a source map as it does. A test page swaps the QUnit coverage module qunit-coverage.js for qunit-coverage-istanbul.js, a file of the sap.ui.core library that collects the coverage records while the tests run and sends them to the middleware, which generates the report. Its options set the report type (html by default) and directory (./tmp/coverage-reports), the watermarks thresholds, excludePatterns and the instrumenter's settings. It is entered under server/customMiddleware in ui5.yaml, needs @ui5/cli@ui5/cliThe UI5 Tooling command line for project setup, the local dev server and the build, which defines a UI5 project's shape and its two extension points, custom middleware and custom tasks.sap official, ui5 v3 and is meant for UI5 1.113 and above; @ui5/sample-app@ui5/sample-appAn OpenUI5 sample app set up with the UI5 CLI: ESLint, UI5 linter and UI5 Test Runner checks, a standard and a self-contained build, and a UI5 workspace for developing against local UI5 libraries.sap official, ui5 lists it as a development dependency.
Facts
Where it sits
Who is behind it
In the atlas: maintains 8@UI5maintainerFrank WeigelContributes to this
In the atlas: contributes to 10@codeworriorYavor IvanovContributes to this
In the atlas: contributes to 17@d3xter666Tommy VinhContributes to this
In the atlas: contributes to 4@devtomtomFlorian VogtContributes to this
In the atlas: contributes to 50, wrote 2@flovogtMatthias OßwaldContributes to this
In the atlas: contributes to 29@matz3Max ReichmannContributes to this
In the atlas: contributes to 10@maxreichmannOpenUI5 BotContributes to this
In the atlas: contributes to 5@openui5botMerlin BeutlbergerContributes to this
In the atlas: contributes to 18, wrote 1@RandomByteGianluca BeilContributes to this
In the atlas: contributes to 6@werwolf23039 contributors
What it declares
Every artifact
- Type
- Build tool
- Origin
- By SAP
- Runtime
- Node.js
As a build tool
- Distributed through
- npm
Connections
Serving an app locally and building it for deployment
Unit, integration and end-to-end tests for UI5 apps
UI5 Tooling command line for project setup, dev server and build
Download
Install
npm add @ui5/middleware-code-coverageDerived from the package name. No recipe recorded; the README has the configuration.
README
quoted from UI5/cli-extensions under Apache-2.0, readUI5 Middleware Code Coverage
This UI5 CLI Server Middleware offers code instrumentation powered by Istanbul. This makes it easy to enable client-side coverage determination.
Sample
You find this middleware in action in the OpenUI5 Sample App.
Requirements
This middleware requires UI5 CLI v3 and is meant for UI5 1.113 and above.
Limitations
Note that this middleware is currently not compatible with TypeScript based projects, see TypeScript support #189.
Install
npm install @ui5/middleware-code-coverage --save-dev
Usage
-
Configure it in
$yourapp/ui5.yaml:The configuration for the custom middleware:
server: customMiddleware: - name: "@ui5/middleware-code-coverage" afterMiddleware: compression configuration: report: reporter: ["html"] "report-dir": "./tmp/coverage-reports" watermarks: { statements: [50, 80], functions: [50, 80], branches: [50, 80], lines: [50, 80] } instrument: produceSourceMap: true coverageGlobalScope: "window.top" coverageGlobalScopeFunc: false cwd: "./" excludePatterns: - "lib/" - "another/dir/in/webapp" - "yet/another/dir" -
Change the qunit coverage module
qunit-coverage.jstoqunit-coverage-istanbul.jsin your test html filesOld:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Unit tests for OpenUI5 App</title> <script id="sap-ui-bootstrap" src="../../resources/sap-ui-core.js" data-sap-ui-theme="sap_horizon" data-sap-ui-resourceroots='{ "ui5.sample": "../../" }' data-sap-ui-language="EN" data-sap-ui-async="true"> </script> <link rel="stylesheet" type="text/css" href="../../resources/sap/ui/thirdparty/qunit-2.css"> <script src="../../resources/sap/ui/thirdparty/qunit-2.js"></script> <script src="../../resources/sap/ui/qunit/qunit-junit.js"></script> <script src="../../resources/sap/ui/qunit/qunit-coverage.js" data-sap-ui-cover-only="ui5/sample/" data-sap-ui-cover-never="ui5/sample/test/"></script> <script src="../../resources/sap/ui/thirdparty/sinon.js"></script> <script src="../../resources/sap/ui/thirdparty/sinon-qunit.js"></script> <script src="unitTests.qunit.js"></script> </head> <body> <div id="qunit"></div> <div id="qunit-fixture"></div> </body> </html>New:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Unit tests for OpenUI5 App</title> <script id="sap-ui-bootstrap" src="../../resources/sap-ui-core.js" data-sap-ui-theme="sap_horizon" data-sap-ui-resourceroots='{ "ui5.sample": "../../" }' data-sap-ui-language="EN" data-sap-ui-async="true"> </script> <link rel="stylesheet" type="text/css" href="../../resources/sap/ui/thirdparty/qunit-2.css"> <script src="../../resources/sap/ui/thirdparty/qunit-2.js"></script> <script src="../../resources/sap/ui/qunit/qunit-junit.js"></script> - <script src="../../resources/sap/ui/qunit/qunit-coverage.js" + <script src="../../resources/sap/ui/qunit/qunit-coverage-istanbul.js" data-sap-ui-cover-only="ui5/sample/" data-sap-ui-cover-never="ui5/sample/test/"></script> <script src="../../resources/sap/ui/thirdparty/sinon.js"></script> <script src="../../resources/sap/ui/thirdparty/sinon-qunit.js"></script> <script src="unitTests.qunit.js"></script> </head> <body> <div id="qunit"></div> <div id="qunit-fixture"></div> </body> </html> -
Execute
ui5 servein the project root folder -
Open "http://localhost:8080/test/unit/unitTests.qunit.html?coverage" in a browser of your choice
-
Check the code coverage

Configuration
cwd [String]: Root folder. Defaults to "./" of the project consuming the middleware.
excludePatterns [Array]: Patterns to exclude from instrumenting. Defaults to [].
report [Object]: Settings for the reporter.
report.reporter [Array]: The report type(s) that would be generated. A list of all the available reports could be found here. Defaults to ["html"].
report["report-dir"] [String]: Where the reports would be generated. Relative to cwd. Defaults to "./tmp/coverage-reports".
report.watermarks [Object]: Coverage thresholds. See High and Low Watermarks for further details.
Defaults to:
{
statements: [50, 80],
functions: [50, 80],
branches: [50, 80],
lines: [50, 80]
}
instrument [Object]: Settings for the instrumenter. A full set of properties could be seen here.
Defaults to:
{
produceSourceMap: true,
coverageGlobalScope: "window.top",
coverageGlobalScopeFunc: false
}
Front-End Configuration
You can override watermarks (since UI5 1.119.0) via data attributes in the script tag for qunit-coverage-istanbul.js':
...
<script src="../../resources/sap/ui/qunit/qunit-coverage-istanbul.js"
data-sap-ui-cover-only="ui5/sample/"
data-sap-ui-cover-never="ui5/sample/test/"
+ data-sap-ui-cover-watermarks-statements="[90,95]"
+ data-sap-ui-cover-watermarks-functions="[90,95]"
+ data-sap-ui-cover-watermarks-branches="[90,95]"
+ data-sap-ui-cover-watermarks-lines="[90,95]"></script>
...
How It Works
The middleware adds an HTTP endpoint to the development server. For more information about the endpoints, see the API document.
The custom middleware intercepts every .js-file before it is sent to the client. The file is then instrumented on the fly, which includes the dynamic creation of a sourcemap.
The instrumented code and the sourcemap are subsequently delivered to the client instead of the original .js-file.
Integration
The middleware is integrated into OpenUI5 out of the box, but you are not limited by this. With the configuration and the public API, you can set up the middleware to suit your projects' needs.
OpenUI5 QUnit Integration
The qunit-coverage-istanbul.js (part of sap.ui.core library) file requests the instrumented source files by the middleware. While the tests are running, qunit-coverage-istanbul.js takes care of collecting and storing the coverage records into the window.__coverage__ global variable. After the tests are executed, qunit-coverage-istanbul.js sends this data to the middleware, which then generates the code coverage report. Afterwards, the code coverage is displayed on the test page.
Code of Conduct
Please check our Code of Conduct.
Contributing
Please check our Contribution Guidelines.
Support
Please follow our Contribution Guidelines on how to report an issue. Or chat with us in the #tooling channel of the OpenUI5 Community Slack. For public Q&A, use the ui5-cli tag on Stack Overflow.
Licensing
Copyright 2026 SAP SE or an SAP affiliate company and UI5 CLI Extensions contributors. Please see our LICENSE.txt for copyright and license information. Detailed information including third-party components and their licensing/copyright information is available via the REUSE tool.
History
Fixes 1, Dependencies 2
Notes
Breaking 1, Features 1, Dependencies 2
Notes
⚠ BREAKING CHANGES
- Support for older Node.js has been dropped. Only Node.js 20.11.x and >=22.0.0 as well as npm v8 or higher are supported.
Features
Dependencies
Features 1, Dependencies 4
Notes
Features
Dependencies
Others providing
- ui5-test-runnerui5-test-runnerA standalone command line that runs a UI5 project's QUnit and OPA test pages in parallel browser instances, written for suites too large for one browser, and merges their coverage into one report.independent, ui5Command line running UI5 QUnit and OPA tests in parallelfrom UI5
- ui5-middleware-odata-recorderui5-middleware-odata-recorderA UI5 server middleware that records the OData traffic a running app makes against a real backend and writes entity JSON files and metadata.xml that the Fiori elements mock server can replay.independent, ui5UI5 middleware recording OData traffic as mock server datasetsfrom UI5
- jest-environment-ui5jest-environment-ui5A Jest test environment named ui5 that boots UI5 from a local HTML file into jsdom, so UI5 unit tests run in Node.js with no web server and no browser.independent, ui5Jest environment running UI5 unit tests in Node.jsfrom UI5
- openui5-smart-mockserveropenui5-smart-mockserverAn extended UI5 MockServer that generates meaningful mock data with Faker.js, from the metadata's sap:semantics annotations or from rules that map an OData property to a Faker method.independent, ui5UI5 MockServer extension generating mock data with Faker.jsfrom UI5
- vitest-environment-ui5vitest-environment-ui5A Vitest environment named ui5 that boots UI5 from a local HTML file into jsdom, so UI5 unit tests run in Node.js with no web server and no browser.independent, ui5Vitest environment running UI5 unit tests in Node.jsfrom UI5
- wdio-qunit-servicewdio-qunit-serviceA WebdriverIO service that runs QUnit HTML test pages in a browser and reports the results as WebdriverIO test suites, presented as a drop-in replacement for Karma-based QUnit setups.independent, ui5WebdriverIO service running QUnit test pagesfrom UI5
- @openui5/sap.ui.core@openui5/sap.ui.coreThe OpenUI5 core: the module loader, the MVC runtime, data binding, routing, theming and the test stack, which is everything a UI5 app does before a single community package is added.sap official, ui5Framework core: module loader, MVC runtime, binding, routing, themingfrom UI5
- karma-ui5-transpilekarma-ui5-transpileA Karma preprocessor that transpiles a UI5 project's sources with the ui5-tooling-transpile configuration in its ui5.yaml.community org, ui5Karma preprocessor transpiling UI5 sources via ui5-tooling-transpilefrom UI5
- ui5-journey-recorderui5-journey-recorderA Chrome extension that records clicks and inputs against a running UI5 app and generates OPA5 or wdi5 end-to-end test code from the recorded journey.community org, ui5Chrome extension generating OPA5 or wdi5 tests from recorded journeysfrom UI5
- wdi5-cucumberwdi5-cucumberA wdi5 plugin that extends wdi5's end-to-end testing with Cucumber-style BDD scenarios, run against UI5 Fiori Elements apps.community org, ui5wdi5 plugin for Cucumber-style BDD tests on Fiori Elements appsfrom UI5
- wdi5-fe-selectorswdi5-fe-selectorsA set of wdi5-flavoured control selectors tuned for locating controls in Fiori Elements apps, extending the selectors wdi5 itself provides.community org, ui5wdi5 selectors for locating controls in Fiori Elements appsfrom UI5
- wdio-ui5-servicewdio-ui5-serviceEnd-to-end testing for UI5 as a WebdriverIO service that drives a real browser through UI5's own test API, so a test addresses controls with OPA5-compatible selectors rather than DOM nodes.community org, ui5End-to-end testing for UI5 on WebdriverIO with UI5 control selectorsfrom UI5
- vscode-ui5-odata-mock-generatorvscode-ui5-odata-mock-generatorVS Code extension that generates JSON mock data files for an OData service from its metadata, with faker.js values, per-set sizes, value lists and values tied to other properties.independent, ui5VS Code extension generating OData mock data from service metadatafrom UI5
- UI5 ToolsUI5 ToolsA VS Code extension for UI5 developers that serves, proxies, builds and deploys UI5 projects from one workspace-wide configuration, with live reload, a Gateway deployer and a BSP importer.independent, ui5VS Code extension to serve, proxy, build and deploy UI5 projectsfrom UI5
- ui5-middleware-route-proxyui5-middleware-route-proxyA UI5 server middleware that forwards requests matching a route prefix to a backend host, configured per route in ui5.yaml, with credentials read from a .env file rather than the yaml.independent, ui5UI5 server middleware proxying route prefixes to a backendfrom UI5
- ui5-task-cachebuster-indexingui5-task-cachebuster-indexingA UI5 builder task that copies the build output into a timestamped folder inside dist so the UI5 cachebuster can resolve it; it supports timestamps only, not the hash mode.independent, ui5UI5 builder task preparing build output for the cachebusterfrom UI5
- ui5-task-transpile-genui5-task-transpile-genA UI5 builder task that transpiles ES6 to ES5, including async/await, with Babel at build time, registered in ui5.yaml with a bundle definition that includes the regenerator runtime.independent, ui5UI5 builder task transpiling ES6 to ES5 with Babelfrom UI5
- ui5-middleware-odata-recorderui5-middleware-odata-recorderA UI5 server middleware that records the OData traffic a running app makes against a real backend and writes entity JSON files and metadata.xml that the Fiori elements mock server can replay.independent, ui5UI5 middleware recording OData traffic as mock server datasetsfrom UI5
- ui5-plugin-loaderui5-plugin-loaderA UI5 Tooling v4 extension that registers a project's other extensions itself: one entry in ui5.yaml, and every dependency carrying a ui5-plugin-loader.json manifest is mounted as middleware and as a build task.independent, ui5UI5 Tooling v4 extension that registers other extensionsfrom UI5
- ui5-deployerui5-deployerA custom module for UI5 Tooling that deploys Fiori/UI5 apps to SAP NetWeaver ABAP, SAP Cloud Platform Neo or Cloud Foundry, configured in a deployer section of ui5.yaml.independent, ui5UI5 Tooling module deploying Fiori/UI5 apps to SAP systemsfrom UI5
- ui5-task-dts-generatorui5-task-dts-generatorA UI5 builder task that generates d.ts files, TypeScript type declarations, during the build of a UI5 library written in JavaScript, by wrapping @ui5/dts-generator.independent, ui5UI5 builder task generating d.ts type declarationsfrom UI5
- ui5-task-minifierui5-task-minifierA UI5 builder task that minifies the HTML, CSS and JSON files the UI5 builder leaves as they are, with one switch per file type, using html-minifier-terser and clean-css.independent, ui5UI5 builder task minifying HTML, CSS and JSON filesfrom UI5
- ui5-middleware-oidcui5-middleware-oidcA UI5 Tooling server middleware that puts an OpenID Connect login in front of the UI5 dev server, built on express-openid-connect, which receives its configuration block as written.independent, ui5UI5 dev server middleware adding an OpenID Connect loginfrom UI5
- generator-ui5-library-af-deploygenerator-ui5-library-af-deployA Yeoman generator that writes the SAP BTP Application Frontend deployment configuration, mta.yaml, ui5-deploy.yaml, xs-app.json and xs-security.json, into an existing UI5 library project.independent, ui5Yeoman generator for Application Frontend config in UI5 librariesfrom UI5
- ui5-middleware-destinationui5-middleware-destinationA UI5 Tooling server middleware that proxies requests to backends named in WebIDE-style destination files and serves the routes of a neo-app.json, with Basic Authentication only.independent, ui5UI5 Tooling middleware proxying destinations and neo-app.json routesfrom UI5
- ui5-task-check-eocpui5-task-check-eocpA UI5 builder task that matches the UI5 version in ui5.yaml against the versions retrieved from ui5.sap.com and warns during the build once that version's End of Cloud Provisioning quarter has been reached.independent, ui5UI5 build task warning when the app's UI5 version reaches EOCPfrom UI5
- @ui5/cli@ui5/cliThe UI5 Tooling command line for project setup, the local dev server and the build, which defines a UI5 project's shape and its two extension points, custom middleware and custom tasks.sap official, ui5UI5 Tooling command line for project setup, dev server and buildfrom UI5
- ui5-task-btp-manifestui5-task-btp-manifestA UI5 Tooling custom task that writes the surrounding app's sap.cloud service name into the bundled Spreadsheet Importer's manifest at build time, so the two match on SAP BTP.community org, ui5UI5 Tooling task writing the service name into the importer manifestfrom UI5
- ui5-middleware-approuterui5-middleware-approuterA UI5 CLI middleware that puts @sap/approuter in front of the UI5 dev server, proxying it to Cloud Foundry or XS Advanced destinations during development.community org, ui5UI5 CLI middleware proxying the dev server through @sap/approuterfrom UI5
- ui5-middleware-capui5-middleware-capA UI5 CLI middleware that runs a CDS server inside the UI5 dev server, mounted at a path the UI5 project configures, so one command serves the app and its CAP services.community org, ui5UI5 CLI middleware running a CDS server inside the UI5 dev serverfrom UI5
- ui5-middleware-hmrui5-middleware-hmrAn experimental UI5 middleware for hot module replacement, swapping a changed module in during development instead of reloading the whole page.community org, ui5Experimental UI5 middleware for hot module replacementfrom UI5
- ui5-middleware-iasyncui5-middleware-iasyncA UI5 dev-server middleware built on browsersync.io that syncs user interactions across connected browsers over a websocket, replaying an action from one browser in the others for manual testing.community org, ui5UI5 middleware syncing interactions across browsers over websocketfrom UI5
- ui5-middleware-indexui5-middleware-indexA UI5 dev-server middleware that delivers a configured welcome page, index.html by default, for the root path instead of the ui5-server directory listing.community org, ui5UI5 middleware serving a chosen welcome page at the root pathfrom UI5
- ui5-middleware-livereloadui5-middleware-livereloadA dev-server middleware that adds live reload to the UI5 dev server, reloading the page when the sources in the app's webapp folder change.community org, ui5Live reload middleware for the UI5 dev serverfrom UI5
- ui5-middleware-oneloginui5-middleware-oneloginA UI5 dev-server middleware that logs into a system such as SAP Gateway with headless Playwright on the first request and reuses the session cookie for every later request.community org, ui5UI5 middleware logging in with Playwright and reusing the sessionfrom UI5
- ui5-middleware-serveframeworkui5-middleware-serveframeworkA UI5 middleware that serves a UI5 framework built on the local machine to the dev server, in place of a framework version resolved another way.community org, ui5UI5 middleware serving a locally built UI5 frameworkfrom UI5
- ui5-middleware-servestaticui5-middleware-servestaticA UI5 dev-server middleware that serves static resources from a filesystem path or an installed npm package path, built on serve-static, with either path settable through an environment variable.community org, ui5UI5 middleware serving static resources from a path or npm packagefrom UI5
- ui5-middleware-simpleproxyui5-middleware-simpleproxyA UI5 dev-server middleware that proxies requests from the local dev server to a backend system, so the app can reach the backend's services during development.community org, ui5Dev-server middleware proxying requests to a backend systemfrom UI5
- ui5-middleware-ui5ui5-middleware-ui5A UI5 middleware that lets one UI5 application be included as a dependency of another and served through that application's dev server.community org, ui5UI5 middleware including one UI5 application in anotherfrom UI5
- ui5-middleware-webjarsui5-middleware-webjarsA UI5 dev-server middleware that loads JAR files from a configured path and serves the static resources bundled inside them, following the WebJars convention of META-INF/resources/.community org, ui5UI5 middleware serving static resources from JAR files (WebJars)from UI5
- ui5-middleware-websocketui5-middleware-websocketUI5 middleware utilities that add WebSocket support to Express-based dev servers such as the UI5 server, which has no WebSocket channel of its own.community org, ui5WebSocket support for Express-based dev servers such as UI5'sfrom UI5
- ui5-task-cachebusterui5-task-cachebusterA UI5 builder task that cachebusts a standalone UI5 application by moving its build output into a timestamped subfolder and pointing index.html's resource roots at it.community org, ui5UI5 builder task cachebusting standalone UI5 applicationsfrom UI5
- ui5-task-copyrightui5-task-copyrightA UI5 builder task that appends copyright headers to TypeScript, JavaScript and XML files on every build, so the header is not added to each source file by hand.community org, ui5UI5 builder task appending copyright headers to source filesfrom UI5
- ui5-task-flatten-libraryui5-task-flatten-libraryA UI5 builder task that flattens a library's build output, removing the project namespace and resources folder for deployment to SAP NetWeaver, now also offered by the UI5 CLI itself.community org, ui5UI5 builder task flattening library output for SAP NetWeaverfrom UI5
- ui5-task-i18ncheckui5-task-i18ncheckA UI5 builder task that cross-checks every XML view against the app's i18n properties files and logs a warning where a translation is missing; views created in JavaScript are not checked.community org, ui5UI5 builder task checking XML views for missing i18n textsfrom UI5
- ui5-task-minify-xmlui5-task-minify-xmlA UI5 builder task that minifies XML resources such as views and fragments, which a plain UI5 build otherwise ships unminified.community org, ui5UI5 builder task minifying XML views and fragmentsfrom UI5
- ui5-task-pwa-enablerui5-task-pwa-enablerA UI5 builder task that turns a UI5 application into a progressive web app by generating a web manifest and a service worker under one of five caching strategies.community org, ui5UI5 builder task turning a UI5 app into a progressive web appfrom UI5
- ui5-task-zipperui5-task-zipperA build task for the UI5 tooling that packages the UI5 build result, the webapp, as a zip archive at the end of the build.community org, ui5Build task packaging the UI5 build result as a zip archivefrom UI5
- ui5-tooling-lessui5-tooling-lessA UI5 CLI extension, a build task and a dev-server middleware, that compiles an app's Less files into CSS at build time and live while the UI5 server runs.community org, ui5UI5 CLI extension compiling Less files into CSSfrom UI5
- ui5-tooling-modulesui5-tooling-modulesA set of UI5 tooling extensions that load and convert plain npm packages into UI5 AMD-like modules, so the UI5 module loader can consume them.community org, ui5UI5 tooling extensions loading npm packages as UI5 modulesfrom UI5
- ui5-tooling-stringreplaceui5-tooling-stringreplaceA UI5 CLI extension for string replacement during the build, for placeholders or tokens in source files that have to be replaced at build time.community org, ui5UI5 CLI extension for string replacement during the buildfrom UI5
- ui5-tooling-transpileui5-tooling-transpileA UI5 CLI extension that transpiles modern JavaScript or TypeScript during the UI5 build, with a transformJSX option that handles JSX and TSX in the same step.community org, ui5UI5 CLI extension transpiling code during the UI5 buildfrom UI5
- @ui5/logger@ui5/loggerUI5 CLI's internal logger, described by its own readme as internal — it appears here because other UI5 tooling depends on it.sap official, ui5Internal logger of the UI5 CLIfrom UI5
- @ui5/tooling-webc@ui5/tooling-webcDeprecated UI5 Tooling extensions that generate UI5 library wrapper projects for UI5 Web Components and serve them during development; the README points to ui5-tooling-modules instead.sap official, ui5Deprecated UI5 Tooling extensions for UI5 Web Components wrappersfrom UI5
Details
Sources
Sources are graph entities: the same page may back several entries, and an unreachable source flags every row that rests on it.
Compatibility and provenance
Contributors
History in the atlas
- First seen.
For your agent
- Ref
artifact:ui5-middleware-code-coverage- JSON
- /artifacts/ui5-middleware-code-coverage.json
- MCP
- Connecting an agent