mirror of
https://github.com/angular/angular.git
synced 2026-09-14 13:54:52 +08:00
470cf430ce
Optimization Goals:
The primary goals of this optimization are to dramatically reduce the execution time of the language-service test suite and stabilize the mock file system infrastructure. Previously, the suite suffered from significant overhead due to recreating the `MockFileSystem`, `MockServerHost`, and TypeScript `ProjectService` for every single test block, leading to redundant parsing operations, slow test initialization, and reduced spec performance.
How the Goals Were Achieved:
1. **Mock File System Optimizations (Shared State)**:
- Evaluated that standard test files (e.g., TS/Angular lib definitions) are immutable across tests.
- Introduced and utilized `lockMockFileSystem()` to initialize the mock `FileSystem` with `loadStandardTestFiles()` only once per test suite run rather than repeatedly per test.
- Refactored `LanguageServiceTestEnv.setup()` to reuse the singleton file system, completely skipping redundant module loading by eagerly flagging `fsInitialized = true`.
2. **Language Service Test Environment Enhancements (TypeScript Project Reuse)**:
- Implemented partial configuration reloads in the `Project` class via the `update()` method, removing the need to tear down and rebuild the entire `MockServerHost` and TypeScript `ProjectService` from scratch when minimal file changes (like HTML templates or local TS edits) are made dynamically by a test.
- Applied `projectService.reloadProjects()` and `scriptInfo.reloadFromFile()` to synchronously push mock file tree invalidations to the active TS program, skipping expensive environment initialization and saving considerable latency across tests.
- Added `projectName` identifiers inside complex isolate tests (e.g. module alias aliasing) so custom environment injections can sandbox safely without invalidating the global default environment cache.
3. **Test Suite Unification**:
- Flattened fragmented test groups (`grp1`, `grp3`, `grp4`) into a cohesive single directory at `packages/language-service/test/`. This simplifies execution config, improves test runner concurrency, and unifies local development targeting.
- Cleaned out broken inline debug logging and unneeded config reloading loops.
4. **Maintaining Test Isolation**:
- **Explicit TypeScript Configuration**: While the underlying `MockFileSystem` ("disk") is aggressively reused across tests, the TypeScript `ProjectService` and its execution environment are entirely recreated for every test run to ensure isolated ASTs and module resolution caches.
- **Strict tsconfig.json Files Array**: When a project is initialized, it explicitly defines its boundary using the strict `files: [ ... ]` array in `tsconfig.json`. This ensures that any leftover files physically on the mock disk from an older test run are completely invisible to the TS Compiler.
- **Namespace Sandboxing**: For tests doing custom modifications (e.g., overriding module resolution paths), they utilize localized `projectName` arguments (like `"test_alias_completions"`) to configure sandboxed working directories.
32 lines
964 B
Python
32 lines
964 B
Python
load("//tools:defaults.bzl", "jasmine_test", "ts_project")
|
|
|
|
ts_project(
|
|
name = "test_lib",
|
|
testonly = True,
|
|
srcs = glob(["*.ts"]),
|
|
deps = [
|
|
"//:node_modules/typescript",
|
|
"//packages/compiler",
|
|
"//packages/compiler-cli/src/ngtsc/core:api",
|
|
"//packages/compiler-cli/src/ngtsc/diagnostics",
|
|
"//packages/compiler-cli/src/ngtsc/file_system",
|
|
"//packages/compiler-cli/src/ngtsc/file_system/testing",
|
|
"//packages/compiler-cli/src/ngtsc/testing",
|
|
"//packages/compiler-cli/src/ngtsc/typecheck/api",
|
|
"//packages/language-service/src",
|
|
"//packages/language-service/src/utils",
|
|
"//packages/language-service/testing",
|
|
],
|
|
)
|
|
|
|
jasmine_test(
|
|
name = "test",
|
|
data = [
|
|
":test_lib",
|
|
"//:node_modules/rxjs",
|
|
"//packages/compiler-cli/src/ngtsc/testing/fake_common:npm_package",
|
|
"//packages/core:npm_package",
|
|
],
|
|
shard_count = 4,
|
|
)
|