karma start 顯示 PhantomJS 已連接。// karma.conf.js 關鍵字段
module.exports = function(config) {
config.set({
frameworks: ['mocha', 'chai'], // 或 jasmine
files: [
// 1. 順序:庫 -> 源碼 -> 測試
'node_modules/jquery/dist/jquery.js',
'src/**/*.js',
'test/**/*.spec.js' // **確保 glob 匹配到文件**
],
preprocessors: {
'src/**/*.js': ['coverage'], // 可選
'test/**/*.spec.js': ['webpack', 'babel'] // 若用 ES6/TS
},
webpack: { /* webpack 配置 */ },
reporters: ['progress', 'coverage'],
browsers: ['PhantomJS'], // 或 ChromeHeadless
singleRun: true,
// 2. 關鍵:autoWatch 若為 true,singleRun 應為 false
autoWatch: false,
// 3. PhantomJS 2.1+ 需 polyfill
client: {
captureConsole: true
}
});
};
| 原因 | 現象 | 修復 |
|---|---|---|
files glob 未匹配到測試文件 | PhantomJS 空跑,無 "EXECUTING" 日誌 | 用 karma start --log-level debug 看 resolved files 列表,調整 glob 路徑 |
| 預處理器報錯靜默失敗 | Webpack/Babel 編譯錯誤但 Karma 不退出 | 啟用 webpack: { stats: 'errors-only' },查看預處理器輸出 |
| 框架適配器未載入 | Mocha/Chai 全局變量未定義 | 確認 frameworks: ['mocha', 'chai'] 且 karma-mocha/karma-chai 已安裝 |
| PhantomJS 版本過老不支援 ES6 | 語法錯誤導致測試文件不執行 | 加 babel-polyfill 或遷移至 ChromeHeadless(推薦) |
singleRun: true 但 autoWatch: true | 進程掛起不退出 | 單次運行設 autoWatch: false |
karma start --log-level debug 2>&1 | head -50 看 Resolved files 是否包含測試文件。console.log('TEST LOADED'),觀察 PhantomJS 控制台輸出。karma run(需先 karma start &)或直接 npx karma start --single-run。ChromeHeadless**:npm i -D karma-chrome-launcher,配置 browsers: ['ChromeHeadless'],穩定性高得多。browsers: ['ChromeHeadless'],
customLaunchers: {
ChromeHeadlessNoSandbox: {
base: 'ChromeHeadless',
flags: ['--no-sandbox', '--disable-gpu'] // CI 環境必需
}
},
90% 的「測試不跑」是 **files glob 路徑錯** 或 **預處理器靜默報錯**。開啟 debug 日誌、檢查 resolved files、遷移到 ChromeHeadless 可快速定位並解決。