While Vitest is the default test runner for new Angular projects, Karma is still a supported and widely used test runner. This guide provides instructions for testing your Angular application using the Karma test runner with the Jasmine testing framework.
Setting Up Karma and Jasmine
You can set up Karma and Jasmine for a new project or add it to an existing one.
For New Projects
To create a new project with Karma and Jasmine pre-configured, run the ng new command with the --test-runner=karma option:
ng new my-karma-app --test-runner=karma
For Existing Projects
To add Karma and Jasmine to an existing project, follow these steps:
Install the necessary packages:
pnpm
pnpm add -D karma karma-chrome-launcher karma-coverage karma-jasmine karma-jasmine-html-reporter jasmine-core @types/jasminenpm
npm install --save-dev karma karma-chrome-launcher karma-coverage karma-jasmine karma-jasmine-html-reporter jasmine-core @types/jasmineyarn
yarn add --dev karma karma-chrome-launcher karma-coverage karma-jasmine karma-jasmine-html-reporter jasmine-core @types/jasmineConfigure the test runner in
angular.json:In your
angular.jsonfile, find thetesttarget and set therunneroption tokarma:{ // ... "projects": { "your-project-name": { // ... "architect": { "test": { "builder": "@angular/build:unit-test", "options": { "runner": "karma", // ... other options } } } } }}Update
tsconfig.spec.jsonfor Jasmine types:To ensure TypeScript recognizes global testing functions like
describeandit, add"jasmine"to thetypesarray in yourtsconfig.spec.json:{ // ... "compilerOptions": { // ... "types": [ "jasmine" ] }, // ...}
Running Tests
Once your project is configured, run the tests using the ng test command:
ng test
The ng test command builds the application in watch mode and launches the Karma test runner.
The console output looks like below:
02 11 2022 09:08:28.605:INFO [karma-server]: Karma v6.4.1 server started at http://localhost:9876/02 11 2022 09:08:28.607:INFO [launcher]: Launching browsers Chrome with concurrency unlimited02 11 2022 09:08:28.620:INFO [launcher]: Starting browser Chrome02 11 2022 09:08:31.312:INFO [Chrome]: Connected on socket -LaEYvD2R7MdcS0-AAAB with id 31534482Chrome: Executed 3 of 3 SUCCESS (0.193 secs / 0.172 secs)TOTAL: 3 SUCCESS
The test output is displayed in the browser using Karma Jasmine HTML Reporter.
Click on a test row to re-run just that test or click on a description to re-run the tests in the selected test group ("test suite").
Meanwhile, the ng test command is watching for changes. To see this in action, make a small change to a source file and save. The tests run again, the browser refreshes, and the new test results appear.
Configuration
The Angular CLI takes care of Jasmine and Karma configuration for you. It constructs the full configuration in memory, based on options specified in the angular.json file.
Customizing Karma Configuration
If you want to customize Karma, you can create a karma.conf.js by running the following command:
ng generate config karma
HELPFUL: Read more about Karma configuration in the Karma configuration guide.
Setting the Test Runner in angular.json
To explicitly set Karma as the test runner for your project, locate the test target in your angular.json file and set the runner option to karma:
{ // ... "projects": { "your-project-name": { // ... "architect": { "test": { "builder": "@angular/build:unit-test", "options": { "runner": "karma", // ... other options } } } } }}
Code coverage enforcement
To enforce a minimum code coverage level, you can use the check property in the coverageReporter section of your karma.conf.js file.
For example, to require a minimum of 80% coverage:
coverageReporter: { dir: require('path').join(__dirname, './coverage/<project-name>'), subdir: '.', reporters: [ { type: 'html' }, { type: 'text-summary' } ], check: { global: { statements: 80, branches: 80, functions: 80, lines: 80 } }}
This will cause the test run to fail if the specified coverage thresholds are not met.
Testing in continuous integration
To run your Karma tests in a CI environment, use the following command:
ng test --no-watch --no-progress --browsers=ChromeHeadless
NOTE: The --no-watch and --no-progress flags are crucial for Karma in CI environments to ensure tests run once and exit cleanly. The --browsers=ChromeHeadless flag is also essential for running tests in a browser environment without a graphical interface.