Skip to content

Commit 97c7025

Browse files
authored
docs: overhaul unit testing overview guide
This commit introduces a series of improvements to the unit testing overview guide to enhance clarity, organization, and accuracy.
1 parent fba0c88 commit 97c7025

1 file changed

Lines changed: 84 additions & 39 deletions

File tree

adev/src/content/guide/testing/overview.md

Lines changed: 84 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@
22

33
Testing your Angular application helps you check that it is working as you expect. Unit tests are crucial for catching bugs early, ensuring code quality, and facilitating safe refactoring.
44

5-
NOTE: This guide focuses on the default testing setup for new Angular CLI projects. If you are migrating an existing project from Karma to Vitest, see the [Migrating from Karma to Vitest guide](guide/testing/migrating-to-vitest). While Vitest is the default test runner, Karma is still fully supported. For information on testing with Karma, see the [Karma testing guide](guide/testing/karma).
5+
NOTE: This guide covers the default testing setup for new Angular CLI projects, which uses Vitest. If you are migrating an existing project from Karma, see the [Migrating from Karma to Vitest guide](guide/testing/migrating-to-vitest). Karma is still supported; for more information, see the [Karma testing guide](guide/testing/karma).
66

77
## Set up for testing
88

9-
The Angular CLI downloads and installs everything you need to test an Angular application with the [Vitest testing framework](https://vitest.dev). By default, new projects include `vitest` and `jsdom`.
9+
The Angular CLI downloads and installs everything you need to test an Angular application with the [Vitest testing framework](https://vitest.dev). New projects include `vitest` and `jsdom` by default.
1010

11-
Vitest runs your unit tests in a Node.js environment, using `jsdom` to emulate the DOM. This allows for faster test execution by avoiding the overhead of launching a browser. You can also use `happy-dom` as an alternative by installing it and removing `jsdom`. The CLI will automatically detect and use `happy-dom` if it is present.
11+
Vitest runs your unit tests in a Node.js environment. To simulate the browser's DOM, Vitest uses a library called `jsdom`. This allows for faster test execution by avoiding the overhead of launching a browser. You can swap `jsdom` for an alternative like `happy-dom` by installing it and uninstalling `jsdom`. Currently, `jsdom` and `happy-dom` are the supported DOM emulation libraries.
1212

13-
The project you create with the CLI is immediately ready to test. Just run the [`ng test`](cli/test) CLI command:
13+
The project you create with the CLI is immediately ready to test. Run the [`ng test`](cli/test) command:
1414

1515
```shell
1616
ng test
@@ -31,26 +31,28 @@ The console output looks like this:
3131
Duration 2.46s (transform 615ms, setup 2ms, collect 2.21s, tests 5ms)
3232
```
3333

34-
The `ng test` command also watches for changes. To see this in action, make a small change to `app.ts` and save it. The tests run again, and the new results appear in the console.
34+
The `ng test` command also watches your files for changes. If you modify a file and save it, the tests will run again.
3535

3636
## Configuration
3737

38-
The Angular CLI handles most of the Vitest configuration for you. For many common use cases, you can adjust the test behavior by modifying options directly in your `angular.json` file.
38+
The Angular CLI handles most of the Vitest configuration for you. You can customize the test behavior by modifying the `test` target options in your `angular.json` file.
3939

40-
### Built-in configuration options
41-
42-
You can change the following options in the `test` target of your `angular.json` file:
40+
### Angular.json options
4341

4442
- `include`: Glob patterns for files to include for testing. Defaults to `['**/*.spec.ts', '**/*.test.ts']`.
4543
- `exclude`: Glob patterns for files to exclude from testing.
4644
- `setupFiles`: A list of paths to global setup files (e.g., polyfills or global mocks) that are executed before your tests.
4745
- `providersFile`: The path to a file that exports a default array of Angular providers for the test environment. This is useful for setting up global test providers which are injected into your tests.
4846
- `coverage`: A boolean to enable or disable code coverage reporting. Defaults to `false`.
49-
- `browsers`: An array of browser names to run tests in (e.g., `["chromium"]`). Requires a browser provider to be installed.
47+
- `browsers`: An array of browser names to run tests in a real browser (e.g., `["chromium"]`). Requires a browser provider to be installed. See the [Running tests in a browser](#running-tests-in-a-browser) section for more details.
48+
49+
### Global test setup and providers
50+
51+
The `setupFiles` and `providersFile` options are particularly useful for managing global test configuration.
5052

5153
For example, you could create a `src/test-providers.ts` file to provide `provideHttpClientTesting` to all your tests:
5254

53-
```typescript
55+
```typescript {header: "src/test-providers.ts"}
5456
import { Provider } from '@angular/core';
5557
import { provideHttpClient } from '@angular/common/http';
5658
import { provideHttpClientTesting } from '@angular/common/http/testing';
@@ -73,11 +75,7 @@ You would then reference this file in your `angular.json`:
7375
"test": {
7476
"builder": "@angular/build:unit-test",
7577
"options": {
76-
"include": ["src/**/*.spec.ts"],
77-
"setupFiles": ["src/test-setup.ts"],
78-
"providersFile": "src/test-providers.ts",
79-
"coverage": true,
80-
"browsers": ["chromium"]
78+
"providersFile": "src/test-providers.ts"
8179
}
8280
}
8381
}
@@ -86,13 +84,15 @@ You would then reference this file in your `angular.json`:
8684
}
8785
```
8886

89-
### Advanced: Custom Vitest configuration
87+
HELPFUL: When creating new TypeScript files for test setup or providers, like `src/test-providers.ts`, ensure they are included in your project's test TypeScript configuration file (typically `tsconfig.spec.json`). This allows the TypeScript compiler to properly process these files during testing.
9088

91-
For advanced use cases, you can provide a custom Vitest configuration file.
89+
### Advanced Vitest configuration
9290

93-
IMPORTANT: While using a custom configuration enables advanced options, the Angular team does not provide direct support for the specific contents of the configuration file or for any third-party plugins used within it. The CLI will also override certain properties (`test.projects`, `test.include`) to ensure proper operation.
91+
For advanced use cases, you can provide a custom Vitest configuration file using the `configFile` option in `angular.json`.
9492

95-
You can create a Vitest configuration file (e.g., `vitest-base.config.ts`) and reference it in your `angular.json` using the `runnerConfig` option.
93+
IMPORTANT: While using a custom configuration enables advanced options, the Angular team does not provide support for the contents of the configuration file or for any third-party plugins. The CLI will also override certain properties (`test.projects`, `test.include`) to ensure proper integration.
94+
95+
You can create a Vitest configuration file (e.g., `vitest-base.config.ts`) and reference it in your `angular.json`:
9696

9797
```json
9898
{
@@ -119,24 +119,41 @@ ng generate config vitest
119119

120120
This creates a `vitest-base.config.ts` file that you can customize.
121121

122-
HELPFUL: Read more about Vitest configuration in the [Vitest configuration guide](https://vitest.dev/config/).
122+
HELPFUL: Read more about Vitest configuration in the [official Vitest documentation](https://vitest.dev/config/).
123123

124124
## Code coverage
125125

126-
You can generate code coverage reports by adding the `--coverage` flag to the `ng test` command. The report is generated in the `coverage/` directory.
126+
You can generate a code coverage report by adding the `--coverage` flag to the `ng test` command. The report is generated in the `coverage/` directory.
127127

128-
For more detailed information on prerequisites, enforcing coverage thresholds, and advanced configuration, see the [Code coverage guide](guide/testing/code-coverage).
128+
For more detailed information, see the [Code coverage guide](guide/testing/code-coverage).
129129

130130
## Running tests in a browser
131131

132132
While the default Node.js environment is faster for most unit tests, you can also run your tests in a real browser. This is useful for tests that rely on browser-specific APIs (like rendering) or for debugging.
133133

134-
To run tests in a browser, you must first install a browser provider.
134+
To run tests in a browser, you must first install a browser provider. Read more about Vitest's browser mode in the [official documentation](https://vitest.dev/guide/browser).
135+
136+
Once the provider is installed, you can run your tests in the browser by configuring the `browsers` option in `angular.json` or by using the `--browsers` CLI flag. Tests run in a headed browser by default. If the `CI` environment variable is set, headless mode is used instead. To explicitly control headless mode, you can suffix the browser name with `Headless` (e.g., `chromiumHeadless`).
137+
138+
```bash
139+
# Example for Playwright (headed)
140+
ng test --browsers=chromium
141+
142+
# Example for Playwright (headless)
143+
ng test --browsers=chromiumHeadless
144+
145+
# Example for WebdriverIO (headed)
146+
ng test --browsers=chrome
147+
148+
# Example for WebdriverIO (headless)
149+
ng test --browsers=chromeHeadless
150+
```
151+
135152
Choose one of the following browser providers based on your needs:
136153

137-
- **Playwright**: `@vitest/browser-playwright` for Chromium, Firefox, and WebKit.
138-
- **WebdriverIO**: `@vitest/browser-webdriverio` for Chrome, Firefox, Safari, and Edge.
139-
- **Preview**: `@vitest/browser-preview` for Webcontainer environments (like StackBlitz).
154+
### Playwright
155+
156+
[Playwright](https://playwright.dev/) is a browser automation library that supports Chromium, Firefox, and WebKit.
140157

141158
<docs-code-multifile>
142159
<docs-code header="npm" language="shell">
@@ -153,33 +170,61 @@ Choose one of the following browser providers based on your needs:
153170
</docs-code>
154171
</docs-code-multifile>
155172

156-
Once the provider is installed, you can run your tests in the browser using the `--browsers` flag:
173+
### WebdriverIO
157174

158-
```bash
159-
# Example for Playwright
160-
ng test --browsers=chromium
175+
[WebdriverIO](https://webdriver.io/) is a browser and mobile automation test framework that supports Chrome, Firefox, Safari, and Edge.
161176

162-
# Example for WebdriverIO
163-
ng test --browsers=chrome
164-
```
177+
<docs-code-multifile>
178+
<docs-code header="npm" language="shell">
179+
npm install --save-dev @vitest/browser-webdriverio webdriverio
180+
</docs-code>
181+
<docs-code header="yarn" language="shell">
182+
yarn add --dev @vitest/browser-webdriverio webdriverio
183+
</docs-code>
184+
<docs-code header="pnpm" language="shell">
185+
pnpm add -D @vitest/browser-webdriverio webdriverio
186+
</docs-code>
187+
<docs-code header="bun" language="shell">
188+
bun add --dev @vitest/browser-webdriverio webdriverio
189+
</docs-code>
190+
</docs-code-multifile>
191+
192+
### Preview
193+
194+
The `@vitest/browser-preview` provider is designed for Webcontainer environments like StackBlitz and is not intended for use in CI/CD.
195+
196+
<docs-code-multifile>
197+
<docs-code header="npm" language="shell">
198+
npm install --save-dev @vitest/browser-preview
199+
</docs-code>
200+
<docs-code header="yarn" language="shell">
201+
yarn add --dev @vitest/browser-preview
202+
</docs-code>
203+
<docs-code header="pnpm" language="shell">
204+
pnpm add -D @vitest/browser-preview
205+
</docs-code>
206+
<docs-code header="bun" language="shell">
207+
bun add --dev @vitest/browser-preview
208+
</docs-code>
209+
</docs-code-multifile>
165210

166-
Headless mode is enabled automatically if the `CI` environment variable is set. Otherwise, tests will run in a headed browser.
211+
HELPFUL: For more advanced browser-specific configuration, see the [Advanced Vitest configuration](#advanced-vitest-configuration) section.
167212

168213
## Other test frameworks
169214

170-
You can also unit test an Angular application with other testing libraries and test runners. Each library and runner has its own distinctive installation procedures, configuration, and syntax.
215+
You can also unit test an Angular application with other testing libraries and test runners. Each library and runner has its own installation procedures, configuration, and syntax.
171216

172217
## Testing in continuous integration
173218

174-
A robust test suite is a key part of a continuous integration (CI) pipeline. CI servers let you set up your project repository so that your tests run on every commit and pull request.
219+
A robust test suite is a key part of a continuous integration (CI) pipeline. CI servers let you automate your tests to run on every commit and pull request.
175220

176-
To test your Angular application in a continuous integration (CI) server, you can typically run the standard test command:
221+
To test your Angular application in a CI server, run the standard test command:
177222

178223
```shell
179224
ng test
180225
```
181226

182-
Most CI servers set a `CI=true` environment variable, which `ng test` detects. This automatically runs your tests in the appropriate non-interactive, single-run mode.
227+
Most CI servers set a `CI=true` environment variable, which `ng test` detects. This automatically configures your tests to run in a non-interactive, single-run mode.
183228

184229
If your CI server does not set this variable, or if you need to force single-run mode manually, you can use the `--no-watch` and `--no-progress` flags:
185230

0 commit comments

Comments
 (0)