Airbyte Postgres Source E2E Tests
airbytehq/airbyte
Starts a local PostgreSQL 16 container, loads SQL fixtures and runs the Airbyte spec, check, discover and read commands against a chosen source-postgres image.
Decision framework for isolating every external dependency in a test suite: when to use in-process mocks, HTTP stubs (MSW, WireMock), record-replay, fault injection (Toxiproxy), or ephemeral real…
$ npx skills add petrkindlmann/qa-skills --skill service-virtualization -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install petrkindlmann/qa-skills service-virtualization --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/petrkindlmann/qa-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/service-virtualization .claude/skills/service-virtualization && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "service-virtualization" agent skill from https://github.com/petrkindlmann/qa-skills/tree/main/skills/service-virtualization into .claude/skills/service-virtualization/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "service-virtualization", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/petrkindlmann/qa-skills/tree/main/skills/service-virtualizationType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add petrkindlmann/qa-skills --skill service-virtualization -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install petrkindlmann/qa-skills service-virtualization --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/petrkindlmann/qa-skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/service-virtualization .agents/skills/service-virtualization && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "service-virtualization" agent skill from https://github.com/petrkindlmann/qa-skills/tree/main/skills/service-virtualization into .agents/skills/service-virtualization/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "service-virtualization", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add petrkindlmann/qa-skills --skill service-virtualization -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install petrkindlmann/qa-skills service-virtualization --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/petrkindlmann/qa-skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/service-virtualization .cursor/skills/service-virtualization && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "service-virtualization" agent skill from https://github.com/petrkindlmann/qa-skills/tree/main/skills/service-virtualization into .cursor/skills/service-virtualization/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "service-virtualization", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/petrkindlmann/qa-skills.git --path skills/service-virtualization--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add petrkindlmann/qa-skills --skill service-virtualization -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install petrkindlmann/qa-skills service-virtualization --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/petrkindlmann/qa-skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/service-virtualization .gemini/skills/service-virtualization && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "service-virtualization" agent skill from https://github.com/petrkindlmann/qa-skills/tree/main/skills/service-virtualization into .gemini/skills/service-virtualization/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "service-virtualization", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install petrkindlmann/qa-skills service-virtualizationInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add petrkindlmann/qa-skills --skill service-virtualization -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/petrkindlmann/qa-skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/service-virtualization .github/skills/service-virtualization && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "service-virtualization" agent skill from https://github.com/petrkindlmann/qa-skills/tree/main/skills/service-virtualization into .github/skills/service-virtualization/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "service-virtualization", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add petrkindlmann/qa-skills --skill service-virtualization -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install petrkindlmann/qa-skills service-virtualization --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/petrkindlmann/qa-skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/service-virtualization .opencode/skills/service-virtualization && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "service-virtualization" agent skill from https://github.com/petrkindlmann/qa-skills/tree/main/skills/service-virtualization into .opencode/skills/service-virtualization/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "service-virtualization", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
service-virtualizationDecision framework for isolating every external dependency in a test suite: when to use in-process mocks, HTTP stubs (MSW, WireMock), record-replay, fault injection (Toxiproxy), or ephemeral real…
Service Virtualization is an agent skill from petrkindlmann/qa-skills. Decision framework for isolating every external dependency in a test suite: when to use in-process mocks, HTTP stubs (MSW, WireMock), record-replay, fault injection (Toxiproxy), or ephemeral real services (Testcontainers), and how to enforce that no real calls escape in CI. Use when: "mock service," "stub API," "fake service," "WireMock," "MSW," "Toxiproxy," "test isolation," "dependency management," "stub an external API in CI." Not for: consumer-driven contract verification (Pact, broker) — use…
Its SKILL.md is about 4.1k tokens, which your agent loads only when the skill is triggered. The skill folder holds 7 other files, including reference files (for example `references/ci.md`, `references/msw.md` and `references/record-replay.md`).
It sits in Testing & QA, covering Chaos engineering, Integration testing and Test data and fixtures. It works with Docker and Stripe. The repository describes itself as: 50 QA and test-automation skills for Claude Code, Codex, Cursor, and any Agent Skills Standard runtime. The licence is MIT.
7 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit b3bb61b. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
dockernpmFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use docker and npm, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Service Virtualization loads about 4.1k tokens when it runs, and up to ~10k if it reads all its reference files. Until then it costs about 196 tokens; SKILL.md has 1,886 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from petrkindlmann/qa-skills at commit b3bb61b, republished under its MIT licence (© petrkindlmann). 1,886 words, ~4,134 tokens.
.claude/skills/service-virtualization/SKILL.md (or your agent's skills folder). This skill also uses 6 other files; get the full folder from GitHub.<objective>
Mock Stripe at the SDK layer and your tests pass green while production 500s the moment Stripe
changes a response field — because the stub was never tied to a contract. This skill picks the
right isolation strategy per dependency (in-process mock, HTTP stub, record-replay, fault
injection, or ephemeral real service), stubs at the HTTP layer so tests survive SDK upgrades, and
makes the CI run fail when any real call escapes the stubs.
</objective>
| Situation | Go to |
|---|---|
| Node/browser test hitting an external HTTP API | MSW → references/msw.md |
| Polyglot CI, complex matching, or you need a standalone stub server | WireMock → references/wiremock.md |
| Dependency is a DB / cache / queue | Testcontainers → references/testcontainers.md |
| Testing timeouts, latency, connection resets | Toxiproxy → references/toxiproxy.md |
| Bootstrapping stubs from a real API, or a multi-step baseline | Record-replay → references/record-replay.md |
| Wiring any of these into GitHub Actions | references/ci.md |
| Not sure which to reach for | Decision Tree (below) |
Check .agents/qa-project-context.md first — if it exists, use it, respect existing mocking
conventions, and skip anything answered there. Then:
contract-testing. If no, mocking what you don't own is a known risk (Core Principle 3).1. Match the isolation level to the confidence you need. Unit tests can mock aggressively — they test internal logic. Integration tests should use realistic stubs or real services because they test boundaries. E2E should run the closest thing to production that is still reliable.
2. Real services beat fakes when they're fast, free, and reliable. A local PostgreSQL container gives more confidence than a fake and costs little — prefer it. Reserve fakes for dependencies that are slow, unreliable, or paid.
3. Never mock what you don't own without a contract — and prefer the provider's test mode. If
you stub Stripe and Stripe changes its response shape, your tests stay green while production
breaks. In order of preference: use the provider's official test mode/sandbox (Stripe test mode,
Twilio test creds) → an HTTP stub validated by a contract test for drift → a bare stub only when
nothing better exists. See contract-testing.
4. Stubs must fail realistically. A stub that always returns 200 never exercises error handling. Every stub needs error variants: 429 rate limits, 500s, timeouts, malformed bodies.
5. One abstraction layer between test and tool. Wrap MSW handlers, WireMock stubs, and Testcontainers setup behind a consistent interface so switching tools doesn't mean rewriting tests.
| Strategy | Speed | Fidelity | Complexity | Best for |
|---|---|---|---|---|
| In-process mock | Fastest | Lowest | Trivial | Unit tests, isolating internal modules |
| HTTP stub (MSW) | Fast | Medium | Low | Frontend/Node tests hitting external APIs |
| HTTP stub (WireMock) | Fast | Medium-High | Medium | Language-agnostic, complex matching rules |
| Record-replay | Fast after first run | High initially, decays | Medium | Bootstrapping stubs from real APIs quickly |
| Service fake | Medium | High | High | Stateful dependencies (in-memory DB, fake auth) |
| Ephemeral real (Testcontainers) | Slower | Highest | Medium | Databases, message queues, caches |
| Shared real service | Slow | Production-level | Low (to set up) | Staging validation, final pre-deploy check |
Is the dependency internal to your codebase?
├─ Yes → In-process mock (vi.mock / jest.mock / monkeypatch)
└─ No → Is it a database, cache, or message queue?
├─ Yes → Testcontainers (ephemeral real instance)
└─ No → Is it a third-party HTTP API?
├─ Yes → Does the provider offer a test/sandbox mode?
│ ├─ Yes → Use sandbox in staging, MSW/WireMock in CI
│ └─ No → MSW or WireMock + contract test for drift detection
└─ No → Is it an internal microservice?
├─ Yes → Contract test (Pact) + stub for consumer tests
└─ No → Evaluate case by casePick MSW as the default for in-process Node/browser tests; WireMock for cross-language CI
or standalone stub servers; Prism when the OpenAPI spec is the contract; Mockoon for
dev-time exploratory mocking. Heavy code for each lives in references/ — pointers below.
MSW 2.x intercepts HTTP at the network layer (Service Worker in the browser, request interception
in Node). The default for JS/TS projects. Stub at the HTTP layer (POST /v1/payment_intents),
never at the SDK method — that decouples the test from the SDK version.
The strongest enforcement seam this skill offers: setupServer(...).listen({ onUnhandledRequest }).
Set it to "error" in CI so any escaped real call fails the run; "warn" is fine locally while
iterating.
See references/msw.md for centralized stateful handlers (payments), the Vitest setup with the
CI/local onUnhandledRequest switch, per-test timeout/retry overrides, and a full stateful auth
flow (create / verify / refresh / revoke via http.delete) keyed on a Bearer token.
Language-agnostic HTTP stub server (current stable 3.13.2 — 4.0 is beta-only as of mid-2026, stay on 3.x for CI). Runs standalone or as a Docker container. Best for polyglot environments or complex matching rules.
Use priority-based mappings for error scenarios: a priority: 1 mapping that matches an
opt-in header (X-Test-Scenario: rate-limit) and returns 429 shadows the default happy-path
mapping only when the test asks for it. WireMock also exposes an admin API for programmatic stub
creation (POST /__admin/mappings), verification (POST /__admin/requests/count), and reset
(POST /__admin/mappings/reset).
See references/wiremock.md for the Docker setup, a response-templated paginated mapping, the
priority error mapping JSON, and the drift-detection seam to contract-testing (replay a Pact or
validate the stub against the OpenAPI spec via Prism).
| Tool | Strengths | When to use |
|---|---|---|
| Mockoon | Desktop UI + CLI; OpenAPI import; rule-based responses; lightweight | Dev-time mocking and quick CLI mocks in CI |
| Hoverfly | Capture-replay (record real traffic, replay deterministically); capture/simulate/modify/synthesize modes | Migrating from a real dependency to a mock — record once, replay forever |
| Prism | OpenAPI-driven mock server (Stoplight); validates requests + generates responses from spec | OpenAPI-first projects with a published spec |
| MockServer | Java-based; rich expectation matching; multi-protocol | JVM teams already on MockServer |
Spin up real services in Docker for integration tests — containers start before the suite and
are destroyed after. Use @testcontainers/postgresql 11.x and friends. Ports are random;
always read them via getMappedPort() / getConnectionUri(), never hardcode 5432/6379.
See references/testcontainers.md for parallel PostgreSQL + Redis + Elasticsearch startup with
wait strategies, the Vitest globalSetup wiring (process.env.DATABASE_URL, testTimeout: 30_000),
and the note on refreshing aging image tags (elasticsearch:8.12.0 is behind Elastic 9.x).
ghcr.io/shopify/toxiproxy:2.12.0 sits between your app and a dependency as a TCP proxy and
injects latency, bandwidth limits, and connection resets. Point your app at the proxy port,
not the real service. Always remove toxics in afterEach — they leak across tests otherwise.
See references/toxiproxy.md for the compose port mapping, the createProxy(name, listen, upstream) wiring (including how the compose 15432/16379 proxy ports map to the real upstream),
the helpers with response.ok checks on every call, and a latency + connection-reset usage example.
For broad resilience/game-day work, go to chaos-engineering instead.
Record-replay captures real API responses once and replays them deterministically — good for bootstrapping stubs and for a regression baseline of a multi-step interaction. Implement it with a record-replay library (Hoverfly, Polly.JS, or VCR-style cassettes), not a hand-rolled recorder.
It breaks on dynamic data (timestamps, UUIDs), stateful sequences, and age — recordings go stale
within weeks. Always stamp a recordedAt and fail the test when a recording is older than 30
days, forcing a re-record.
See references/record-replay.md for the cassette format, the assertFresh() 30-day expiry check,
and a replay harness driving a multi-step flow (create order → add items → apply coupon → checkout).
MSW needs zero infrastructure — it intercepts in-process, so CI runs exactly like local; the only
rule is to set onUnhandledRequest: error in CI (quoted "error" in JS) so an escaped real call
hard-fails the run. WireMock and Testcontainers need Docker.
Two incompatible port models coexist and must not be mixed in one suite: the docker-compose
model publishes fixed ports (a hardcoded DATABASE_URL=...localhost:5432... works), while the
Testcontainers model uses random ports read via getMappedPort() and injected into
process.env. Pick one per suite.
See references/ci.md for the MSW step, the docker-compose GitHub Actions job (up -d --wait --wait-timeout 120, if: always() teardown), and the tool-by-constraint table.
If every dependency is mocked, your tests verify that your mocks work, not that your system works. Use real services for databases and caches (via Testcontainers); only stub external HTTP APIs.
One test stubs Stripe as { id: "pi_123" }, another as { paymentIntentId: "pi_123" } — now you
have two conflicting versions of reality. Centralize handlers and reuse one response shape across
the whole suite (see the shared shape in references/msw.md).
Your mapping says Stripe returns { amount: 1000 } but the real API now returns
{ amount: 1000, currency: "usd" }. Tests pass, production fails. Use contract tests to detect
drift — see contract-testing and the drift seam in references/wiremock.md.
Mocking stripe.paymentIntents.create (the SDK method) couples the test to the SDK version. Stub
at the HTTP layer (POST /v1/payment_intents) so the test works regardless of HTTP client or SDK
version.
Stubs that always return 200 never exercise retry logic, timeout handling, rate-limit backoff, or error parsing. Every stub needs a corresponding error variant.
A shared WireMock instance that multiple CI jobs hit introduces coupling and state leakage. Each test run starts its own isolated stub server.
Recordings from six months ago reflect an API that no longer exists. Stamp recordedAt and fail
the test when recordings exceed 30 days, forcing a re-record (see references/record-replay.md).
Prove no real call escaped, smallest check first:
# 1. MSW: any unhandled request must hard-fail the suite in CI
CI=1 npm run test:integration # onUnhandledRequest:"error" → exit 0 means nothing escaped
# 2. WireMock/Testcontainers: confirm containers are reachable, then teardown leaves nothing
docker compose -f docker-compose.test.yml up -d --wait --wait-timeout 120 && echo OK
docker compose -f docker-compose.test.yml down -v
# 3. Grep CI logs for outbound calls to the real provider's host (should print nothing)
grep -iE "api\.stripe\.com|api\.twilio\.com" ci-run.log && echo "LEAK" || echo "clean"A green run under CI=1 with onUnhandledRequest:"error" plus an empty grep for the real host is
the proof that the suite ran fully virtualized.
onUnhandledRequest: "error" (or the WireMock equivalent), and a
grep of CI logs for the real provider host returns nothing.recordedAt stamp and a 30-day expiry check that fails the
test when stale.references/)onUnhandledRequest
switch, per-test timeout/retry overrides, and the full create/verify/refresh/revoke auth flow.globalSetup wiring,
and the image-tag refresh note.createProxy upstream wiring, helpers with response.ok
checks, and a latency + reset usage example.assertFresh check, and
a multi-step replay harness.© petrkindlmann, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 6 other files (references) in skills/service-virtualization of petrkindlmann/qa-skills.
Open the folder on GitHubat commit b3bb61b
Service Virtualization next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Service Virtualization this skillpetrkindlmann/qa-skills | 168 | — | ~4.1k | Automated safety check: Pass | MIT | |
| Airbyte Postgres Source E2E Testsairbytehq/airbyte | 22k | — | ~2.5k | Automated safety check: Pass | Custom licence | |
| Source MySQL CDC Test Harnessairbytehq/airbyte | 22k | — | ~1.8k | Automated safety check: Pass | Custom licence | |
| Clickhouse Local Dev Loopjeremylongshore/tons-of-skills-marketplace | 2.8k | — | ~1.5k | Automated safety check: Notes | MIT | |
| Remote Executor Integration Testsopeninterpreter/openinterpreter | 69k | 2 repos | ~842 | Automated safety check: Pass | Apache-2.0 | |
| MongoDB Source Connector E2E Harnessairbytehq/airbyte | 22k | — | ~1.9k | Automated safety check: Pass | Custom licence |
airbytehq/airbyte
Starts a local PostgreSQL 16 container, loads SQL fixtures and runs the Airbyte spec, check, discover and read commands against a chosen source-postgres image.
airbytehq/airbyte
Reproduces MySQL binlog change-data-capture behavior for the Airbyte source-mysql connector on a local MySQL backend, with fixtures, a catalog and smoke cases.
jeremylongshore/tons-of-skills-marketplace
Run ClickHouse locally with Docker, configure test fixtures, and iterate fast.
openinterpreter/openinterpreter
Explains how to run agent integration tests against remote executors, using Docker for Linux or Wine for Windows, and how to opt tests in or skip them.
airbytehq/airbyte
Starts a throwaway MongoDB 7.0 replica set and runs the Airbyte spec, check, discover and read commands against source-mongodb-v2 images for local end-to-end testing.
github/copilot-sdk
Creates a Java SDK end-to-end test for the Copilot SDK that runs against a recorded YAML snapshot through a replay proxy, so CI needs no real authentication.
petrkindlmann/qa-skills
Test for WCAG 2.2 AA compliance with axe-core + Playwright, keyboard navigation audits, screen reader testing, ARIA pattern validation, and legal compliance mapping (ADA, EAA, Section 508).
petrkindlmann/qa-skills
Goal-driven E2E testing where a browser agent (Playwright MCP / computer-use) reads a natural-language goal and explores the app via the accessibility tree to assert outcomes — no pre-written script.
petrkindlmann/qa-skills
Use AI to write NEW test code from specs, PRDs, user stories, code diffs, bug reports, or OpenAPI specs.
petrkindlmann/qa-skills
Test REST and GraphQL APIs with Playwright APIRequestContext, Supertest, or standalone HTTP clients.
petrkindlmann/qa-skills
Design CI/CD pipelines that run test suites. An agent skill from petrkindlmann/qa-skills.
petrkindlmann/qa-skills
Test for regulatory compliance: GDPR/CMP consent verification, Google Consent Mode v2, Global Privacy Control (GPC), CCPA/US state opt-out, EU AI Act Article 50 transparency, Better Ads Standards…
Categories
Decision framework for isolating every external dependency in a test suite: when to use in-process mocks, HTTP stubs (MSW, WireMock), record-replay, fault injection (Toxiproxy), or ephemeral real…. Service Virtualization is an agent skill from petrkindlmann/qa-skills. Decision framework for isolating every external dependency in a test suite: when to use in-process mocks, HTTP stubs (MSW, WireMock), record-replay, fault injection (Toxiproxy), or ephemeral real services (Testcontainers), and how to enforce that no real calls escape in CI.
Service Virtualization fits situations like: dependency management; stub an external API in CI. Not for: consumer-driven contract verification (Pact; broker) — use contract-testing; standing up a full Docker Compose env.
Run `npx skills add petrkindlmann/qa-skills --skill service-virtualization -a claude-code`. Or copy the skill folder (skills/service-virtualization in petrkindlmann/qa-skills) into .claude/skills/service-virtualization in your project. Claude Code loads it when a task matches its description.
Run `npx skills add petrkindlmann/qa-skills --skill service-virtualization -a codex`. Or copy the skill folder (skills/service-virtualization in petrkindlmann/qa-skills) into .agents/skills/service-virtualization in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add petrkindlmann/qa-skills --skill service-virtualization -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/service-virtualization, .gemini/skills/service-virtualization, .github/skills/service-virtualization and .opencode/skills/service-virtualization in your project.
Going by SKILL.md and its folder, Service Virtualization needs the command-line tools its instructions call (docker and npm). Our summary lists: Docker.
SKILL.md contains no URLs. Its commands use docker and npm, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Service Virtualization is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.1k tokens (SKILL.md is roughly 17k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 5.8k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Service Virtualization: Airbyte Postgres Source E2E Tests (airbytehq/airbyte, 22k stars), Source MySQL CDC Test Harness (airbytehq/airbyte, 22k stars), Clickhouse Local Dev Loop (jeremylongshore/tons-of-skills-marketplace, 2.8k stars) and Remote Executor Integration Tests (openinterpreter/openinterpreter, 69k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
petrkindlmann (a GitHub user) maintains it in petrkindlmann/qa-skills, which has 168 GitHub stars. The repository holds 45 skills in this directory. The repository was last updated on June 10, 2026.
Source: petrkindlmann/qa-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.