mcpField
E
extension-test

extension-test

github.com/quangplTesting & quality64212 installsUpdated 7w ago
Repository

About extension-test

A testing skill for Chrome extension developers, covering unit, integration, and end-to-end testing with Jest and Puppeteer. It includes Chrome API mocking guidance and notes constraints for running extension E2E tests.

Key features

  1. 01Plan unit, integration, and E2E tests
  2. 02Test logic and service interactions with Jest
  3. 03Run Chrome extension tests with Puppeteer
  4. 04Mock common chrome.* APIs
  5. 05Provide configuration and script examples

Use cases

  1. 01Test isolated extension logic
  2. 02Verify messaging and service interactions
  3. 03Check extension UI and behavior in Chrome

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/quangpl/browser-extension-skills --skill extension-test

After installing, type/extension-testin Claude Code to confirm it loaded.

Bundled files

References and scripts installed along with SKILL.md.

references/
chrome-api-mocks.md
e2e-testing-puppeteer.md
unit-integration-testing.md

Details

From the project README

Extension Testing

🚀 Upgrade to Premium Get the Premium version at https://app.extensionbooster.net/dashboard/services/extension-ai-kit

Testing Layer Architecture

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

Critical constraint: Extensions CANNOT run in headless mode. E2E requires headless: false or Chrome's --headless=new (Chrome 112+).


Layer 1: Unit + Integration (Jest)

Install
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 (minimal)
import chrome from "jest-chrome";
Object.assign(global, { chrome });

Full mock setup → chrome-api-mocks.md Unit/integration patterns → unit-integration-testing.md


Layer 2: E2E (Puppeteer)

Install
npm install -D puppeteer
Launch extension in 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")}`,
  ],
});
Get extension ID
const targets = await browser.targets();
const extTarget = targets.find((t) => t.type() === "service_worker");
const extUrl = extTarget?.url() ?? "";
const [, , extId] = extUrl.split("/");

Full E2E patterns → e2e-testing-puppeteer.md


Chrome API Mocking Strategy

APIApproach
chrome.storageMock with in-memory store
chrome.runtime.sendMessagejest.fn() + mock response
chrome.tabsjest.fn() with createMockTab helper
chrome.actionjest.fn() stubs
chrome.alarmsjest.fn() stubs

All mocks → chrome-api-mocks.md


package.json Scripts

{
  "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"
  }
}

Run E2E separately (--runInBand) — Puppeteer tests must run serially.


Reference Files

Comments

Markdown supported