Where Angular Testing Stands Today
Angular applications are typically verified with two distinct categories of tooling: unit and component tests run alongside end-to-end suites. For E2E, teams gravitate toward Cypress, Playwright, or browser automation tools built on WebDriver such as Selenium or WebDriverIO.
Component-level testing has some overlap, as Cypress covers that territory too.
For unit and component tests, the field narrows to Jasmine or Jest. The Angular CLI's official backing has always been Jasmine. Opting for Jest generally meant adopting Nx or wiring up the builder offered by just-jeb/angular-builders.

Jasmine vs. Jest: The Core Contrast
Within Angular, Jasmine and Karma are tightly coupled. Karma acts as the launcher that runs Jasmine suites inside a browser. That browser-based environment gives tests full access to Web APIs and browser features. The flip side is added runtime overhead.
Jest presents a different approach. Its roots trace back to Facebook, where the team took Jasmine, forked it, and focused on performance gains.
Instead of launching a browser, Jest relies on jsdom—a simulated DOM environment that implements parts of the Web API sufficient for manipulating and inspecting the page. This lighter-weight emulation dramatically cuts overhead. The trade-off is reduced API coverage. Audio playback through an audio element or persisting to local storage, for instance, isn't supported. Admittedly, such scenarios rarely surface in typical tests.
Jest also ships with built-in parallel execution and a powerful watch mode. The watch feature selectively runs tests affected by recent edits. With a suite of 10,000 tests where only 10 are impacted by your last change, Jest will only run those 10.
These advantages helped Jest gain dominance throughout the JavaScript ecosystem, not just within Angular.

Where Jest Struggles: ES Modules
Recent years brought headaches like "import is not defined" errors and noticeable slowdowns.
The underlying issue was that Jest's integration with Angular never matched the seamlessness of Jasmine's. Jest executes its own compilation pipeline. It takes the source of your tests and, for Angular projects, compiles it to JavaScript.
The Angular compiler—built on top of TypeScript's compiler—performs this transformation, and it's the compiler that knows the metadata and how it affects the final output.
So how does Jest handle this? The answer lies in the jest-angular-preset project. That library houses the essential logic and is what Nx and just-jeb/angular-builders depend upon.

Despite the preset, not every challenge in Jest's build pipeline was resolved.
The next obstacle was ECMAScript Modules, or ESM—the official spec for loading JavaScript and the logical successor to CommonJS (CJS). Numerous third-party libraries adopted ESM as their exclusive distribution format. Angular pushed especially hard for libraries to output ESM.
Jest was unprepared. It could only consume CJS natively. Compiling user code and tests to CJS was manageable. The trouble emerged inside node_modules, where Angular and many libraries no longer ship CJS builds.
Jest was forced to convert massive dependency graphs from ESM to CJS. That compiling burden took a real toll on speed. It's little surprise that Jasmine—where Angular owns the build—ended up being faster than Jest.
The maintainer situation added more strain. Just one developer was managing Jest. Facebook/Meta's contributions had stopped years prior, leaving Simen Bekkhen alone to carry the project. Frustrated further by the pace of ESM standardisation, he took a break.
Fast-forward to today, and the picture has shifted. Jest now lives under the OpenSource Foundation with a larger contributor base. Simen is actively developing native ESM support. It remains experimental, yet Angular community plugins already adopt it by default.
Conditions have improved significantly, but performance pitfalls still exist. Tomas Trajan goes deep into this subject in a dedicated write-up.
Jest Support Lands in the Angular CLI (Experimental)
Looking at where things stand now, Jest is regaining momentum—and that's precisely when the Angular team decided to get involved.
The Angular Developer survey flagged testing as an area needing work. After surveying the landscape, the team chose to officially back Jest.
That backing is currently experimental. Approach it cautiously—this isn't the developer preview we had with Standalone Components in Angular 14. Think of it more as a proof of concept.
The official Jest integration avoids the route taken by Nx and similar tools. Jest no longer handles the build. Angular does.
Jest now receives precompiled *.mjs files. There's no crawling through node_modules and transpiling each package. Jest can skip straight to running tests.
That's just one piece. Angular has swapped webpack for the newer esbuild bundler. Esbuild is reported to beat webpack by a 50–100x margin in certain scenarios. Its track record is solid—Vitest and Vite both rely on it internally and are renowned for their speed, largely thanks to esbuild.
Here's a snapshot of Angular testing as it currently stands:

Trying Jest in Your Angular Project
If you'd like to experiment, these are the steps.
- Go to
angular.jsonand swap the builder undertestfrom@angular-devkit/build-angular:karmato@angular-devkit/build-angular:jest. - Add required packages:
npm install -D jest @types/jest jest-environment-jsdom. - Open
tsconfig.spec.jsonand change thetypesentry fromjasminetojest.
Then run npx ng test. You'll see a test-out directory created under dist, containing your tests with the .mjs extension. That's where Jest does its work.
Steering clear of production for this setup is wise. Watch mode isn't wired up, IDE integrations won't pick up your tests, and there's no way to configure Jest through a jest.config.ts.
The Future of Jasmine: Introducing ModernWeb
Karma's deprecation warrants some clarity. Karma's job is spinning up a browser and injecting Jasmine tests. Removing Karma from the picture doesn't mean Jasmine is being discarded.
Karma remains fully operational in Angular 16, so existing tests keep running exactly as before.
In an upcoming version—maybe as soon as Angular 17—Angular will swap Karma for the web-test-runner built by ModernWeb. That project is itself a contemporary community initiative that runs tests within a real browser.
Switching from Karma to ModernWeb might go unnoticed. No migration work should be required on our part. Well, at least that's the plan for now.
The more compelling question is why take this step at all?
Karma has been around since the days of AngularJS. Misko Hevery, often called the "father of Angular", co-authored it, and the tool became nearly synonymous with Angular.
That was a long time ago. The ecosystem has since evolved. With community alternatives like web-test-runner, the Angular team no longer has a reason to hold onto Karma.
Looking ahead, the likely testing setup for Angular is a two-pronged one: Jasmine combined with WebTestRunner from ModernWeb, plus Jest.

Wrapping Up
Angular made significant headway in 2023 with features like Signals and Hydration. Testing hasn't been neglected either. Jest is being integrated so Angular produces the full build and Jest merely executes the tests. Community-driven setups had Jest building from source, which was at the root of recurring issues.
Jasmine remains a fully supported framework. Its browser context is being modernised though—web-test-runner is taking over from Karma.
Across the board, Angular is moving in promising directions.
A GitHub repository containing all Angular 16 variations is available if you want to dig into the concrete examples.
Reference Repository
The accompanying monorepo that demonstrates the current state of testing in Angular (16) is available at:
- Repository:
rainerhahnekamp/angular-testing-status
Purpose of the Monorepo
This project is a collection of examples and patterns that reflect how testing works in Angular version 16. It serves as a practical companion to the full article, which you can read at Angular Testing in 2023 – Past, Present, and Future.

If you prefer a recorded presentation over written content, the embedded video above covers the same ground.
For those who want to go deeper into testing, we also run dedicated training sessions.
German-language workshops:

Professional Angular Testing Schulung — offered by ANGULARarchitects.
English-language workshops:

Professional Angular Testing Workshop — offered by ANGULARarchitects.
