Angular v11 Library项目如何正确配置Stryker变异测试?
Angular 库项目 Stryker 配置解决方案
Stryker 完全支持 Angular 库项目,你遇到的两类问题均为配置缺失导致:
- 使用 Karma 运行器挂起:Stryker 默认的
angular-cli项目适配仅针对 Angular 应用,未兼容库项目的测试路径规则,导致浏览器无法加载测试代码 - Command 运行器编译报错:Stryker 插桩时会注入变异跟踪变量,Angular 库默认开启的严格类型检查会将未声明的插桩变量判定为非法
推荐方案:使用 Command 运行器(稳定性更高)
步骤1:修改 stryker.conf.json 配置
新增缺失的核心配置项,完整配置参考如下:
{ "mutate": [ "projects/ecc-lib/src/**/*.ts", "!projects/ecc-lib/src/**/*.spec.ts", "!projects/ecc-lib/src/test.ts", "!projects/ecc-lib/src/environments/*.ts" ], "checkers": ["typescript"], "tsconfigFile": "projects/ecc-lib/tsconfig.spec.json", "testRunner": "command", "commandRunner": { "command": "npm run test-stryker" }, // 新增以下配置 "disableTypeChecks": "projects/**/*.ts", "coverageAnalysis": "all", "tempDirName": ".stryker-tmp" }
disableTypeChecks:自动为插桩后的文件添加// @ts-nocheck注释,跳过类型检查,解决插桩变量未声明的报错coverageAnalysis:Command 运行器不支持单测试用例粒度的覆盖率分析,统一设置为all即可tempDirName:指定沙箱目录位置,避免 Angular CLI 构建时路径解析错误
步骤2:修改 package.json 测试命令
添加 --no-cache 参数禁用 Angular 构建缓存,确保每次运行都读取插桩后的最新代码:
"test-stryker": "ng test ecc-lib --codeCoverage=true --watch=false --browsers=ChromeHeadless --no-cache"
配置完成后重新运行 Stryker 即可正常执行变异测试。
可选方案:适配 Karma 运行器
如果需要使用 Karma 运行器的能力,可通过手动对齐测试配置解决挂起问题:
步骤1:修改 karma.stryker.conf.js
完全对齐 angular.json 中库项目的 test 配置,手动指定测试入口和预处理规则,示例参考:
module.exports = function (config) { config.set({ basePath: '', frameworks: ['jasmine', '@angular-devkit/build-angular'], plugins: [ require('karma-jasmine'), require('karma-chrome-launcher'), require('karma-jasmine-html-reporter'), require('karma-coverage'), require('@angular-devkit/build-angular/plugins/karma') ], client: { jasmine: {}, clearContext: false }, jasmineHtmlReporter: { suppressAll: true }, coverageReporter: { dir: require('path').join(__dirname, '../../coverage/ecc-lib'), subdir: '.', reporters: [ { type: 'html' }, { type: 'text-summary' } ] }, reporters: ['progress', 'kjhtml'], port: 9876, colors: true, logLevel: config.LOG_INFO, autoWatch: false, browsers: ['ChromeHeadless'], singleRun: true, restartOnFileChange: false, // 关键配置:指定要测试的库项目 angularCli: { environment: 'dev', project: 'ecc-lib' } }); };
步骤2:精简 stryker.conf.json 中的 Karma 配置
避免重复配置导致冲突:
"karma": { "configFile": "projects/ecc-lib/karma.stryker.conf.js", "projectType": "angular-cli" }
内容的提问来源于stack exchange,提问作者Jeffrey P
相关产品推荐
相关产品推荐

