关于 extension-test
面向 Chrome 扩展开发者的测试技能,说明如何用 Jest 和 Puppeteer 构建单元、集成及端到端测试。内容涵盖 Chrome API 模拟,并指出扩展端到端测试的运行限制。
主要功能
- 01规划单元、集成和端到端测试
- 02使用 Jest 测试逻辑与服务交互
- 03用 Puppeteer 在 Chrome 中测试
- 04模拟常用 chrome.* API
- 05提供测试配置与脚本示例
适用场景
- 01测试扩展中的独立逻辑
- 02验证消息传递和服务交互
- 03在 Chrome 中检查扩展界面与行为
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ quangpl/ browser-extension-skills --skill extension-test安装后在 Claude Code 中输入/extension-test确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/chrome-api-mocks.mde2e-testing-puppeteer.mdunit-integration-testing.md详细介绍
扩展测试
🚀 升级到 Premium 在 https://app.extensionbooster.net/dashboard/services/extension-ai-kit 获取 Premium 版本
测试分层架构
Unit Tests (Jest) → Test isolated logic, chrome.* API mocks
Integration Tests (Jest) → Test service interactions, message passing
E2E Tests (Puppeteer) → Test in real Chrome with extension loaded
关键限制:扩展无法在无头模式下运行。端到端测试需要设置 headless: false,或使用 Chrome 的 --headless=new(Chrome 112+)。
第 1 层:单元测试 + 集成测试(Jest)
安装
npm install -D jest @types/jest ts-jest jest-chrome
# For React popup:
npm install -D @testing-library/react @testing-library/jest-dom jsdom
jest.config.ts
export default {
preset: "ts-jest",
testEnvironment: "jsdom",
setupFilesAfterEnv: ["./jest.setup.ts"],
moduleNameMapper: {
"^@/(.*)$": "<rootDir>/src/$1",
},
};
jest.setup.ts(最简配置)
import chrome from "jest-chrome";
Object.assign(global, { chrome });
完整 Mock 配置 → chrome-api-mocks.md 单元测试/集成测试模式 → unit-integration-testing.md
第 2 层:端到端测试(Puppeteer)
安装
npm install -D puppeteer
在 Chrome 中启动扩展
import puppeteer from "puppeteer";
import path from "path";
const browser = await puppeteer.launch({
headless: false, // extensions require non-headless
args: [
`--disable-extensions-except=${path.resolve("dist")}`,
`--load-extension=${path.resolve("dist")}`,
],
});
获取扩展 ID
const targets = await browser.targets();
const extTarget = targets.find((t) => t.type() === "service_worker");
const extUrl = extTarget?.url() ?? "";
const [, , extId] = extUrl.split("/");
完整端到端测试模式 → e2e-testing-puppeteer.md
Chrome API 模拟策略
| API | 方式 |
|---|---|
chrome.storage | 使用内存存储进行模拟 |
chrome.runtime.sendMessage | jest.fn() + 模拟响应 |
chrome.tabs | 使用 createMockTab 辅助函数和 jest.fn() |
chrome.action | jest.fn() 存根 |
chrome.alarms | jest.fn() 存根 |
所有 Mock → chrome-api-mocks.md
package.json 脚本
{
"scripts": {
"test:unit": "jest --testPathPattern=unit",
"test:integration": "jest --testPathPattern=integration",
"test:e2e": "jest --testPathPattern=e2e --runInBand",
"test": "npm run test:unit && npm run test:integration"
}
}
单独运行端到端测试(
--runInBand)——Puppeteer 测试必须串行运行。
参考文件
- unit-integration-testing.md — Jest 模式、模拟、组件测试
- e2e-testing-puppeteer.md — Puppeteer 配置、弹出窗口/内容脚本/SW 测试
- chrome-api-mocks.md — 完整的 chrome.* Mock 模板
评论
支持 Markdown