Cb Build Test
BlkLeg/CircuitBreaker
How Circuit Breaker is built, tested, packaged, and kept secret-safe — the make dev/verify/test targets, the PostgreSQL integration test database and its fixtures, the mono Docker image and native…
Design environment strategy for testing across dev, CI, preview, staging, and production — Docker Compose test infrastructure, multi-stage Dockerfiles, seed-data lifecycle, per-PR preview…
$ npx skills add petrkindlmann/qa-skills --skill test-environments -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install petrkindlmann/qa-skills test-environments --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/test-environments .claude/skills/test-environments && 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 "test-environments" agent skill from https://github.com/petrkindlmann/qa-skills/tree/main/skills/test-environments into .claude/skills/test-environments/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "test-environments", 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/test-environmentsType 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 test-environments -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install petrkindlmann/qa-skills test-environments --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/test-environments .agents/skills/test-environments && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "test-environments" agent skill from https://github.com/petrkindlmann/qa-skills/tree/main/skills/test-environments into .agents/skills/test-environments/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "test-environments", 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 test-environments -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install petrkindlmann/qa-skills test-environments --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/test-environments .cursor/skills/test-environments && 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 "test-environments" agent skill from https://github.com/petrkindlmann/qa-skills/tree/main/skills/test-environments into .cursor/skills/test-environments/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "test-environments", 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/test-environments--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 test-environments -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install petrkindlmann/qa-skills test-environments --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/test-environments .gemini/skills/test-environments && 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 "test-environments" agent skill from https://github.com/petrkindlmann/qa-skills/tree/main/skills/test-environments into .gemini/skills/test-environments/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "test-environments", 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 test-environmentsInstalls 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 test-environments -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/test-environments .github/skills/test-environments && 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 "test-environments" agent skill from https://github.com/petrkindlmann/qa-skills/tree/main/skills/test-environments into .github/skills/test-environments/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "test-environments", 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 test-environments -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 test-environments --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/test-environments .opencode/skills/test-environments && 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 "test-environments" agent skill from https://github.com/petrkindlmann/qa-skills/tree/main/skills/test-environments into .opencode/skills/test-environments/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "test-environments", 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.
test-environmentsDesign environment strategy for testing across dev, CI, preview, staging, and production — Docker Compose test infrastructure, multi-stage Dockerfiles, seed-data lifecycle, per-PR preview…
Test Environments is an agent skill from petrkindlmann/qa-skills. Design environment strategy for testing across dev, CI, preview, staging, and production — Docker Compose test infrastructure, multi-stage Dockerfiles, seed-data lifecycle, per-PR preview environments, production parity, and external-dependency stubbing at the HTTP boundary. Use when: "set up test environment," "docker-compose for tests," "per-PR preview environment," "staging parity," "spin up test infra," "environment tiers." Not for: choosing mock-vs-stub-vs-fake per dependency — use service-virtualization…
Its SKILL.md is about 4.6k tokens, which your agent loads only when the skill is triggered. The skill folder holds 3 other files, including reference files (for example `references/docker-compose.md` and `references/stubbing.md`).
It sits in DevOps & Cloud, covering Containers, Test data and fixtures and Integration testing. It works with Docker. 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.
5 steps, taken from the first numbered list 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:
npmdockerpsqlcurlFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use npm, docker and curl, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
POSTGRES_PASSWORDFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Test Environments loads about 4.6k tokens when it runs, and up to ~6.5k if it reads all its reference files. Until then it costs about 184 tokens; SKILL.md has 2,078 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). 2,078 words, ~4,606 tokens.
.claude/skills/test-environments/SKILL.md (or your agent's skills folder). This skill also uses 2 other files; get the full folder from GitHub.<objective>
Staging on SQLite passes tests that break on prod Postgres; a shared staging box becomes a
queue where one broken deploy blocks the whole team; an unmocked Stripe call flakes CI at
random. This skill prevents those by designing environment tiers that mirror production where
it matters, isolate per-PR, and stub external dependencies at the HTTP boundary. It delivers a
working `docker compose up` local/CI stack, a parity checklist, and a stubbing strategy keyed
to dependency type.
</objective>
Check .agents/qa-project-context.md first — if it exists, use it and skip anything already
answered there. Then:
Dockerfile, docker-compose.yml, or compose.yaml. If yes, multi-stage targets and compose come for free; if not, that is the first deliverable.1. Staging must mirror production where bugs hide. If staging uses SQLite and production uses PostgreSQL, staging tests prove nothing about prod behavior. Match the database engine and version, the queue system, the cache layer, and the auth provider — those are where environment-specific bugs live.
2. Ephemeral environments beat long-lived ones. A shared staging environment becomes a bottleneck where one broken deploy blocks the entire team. Per-PR preview environments give isolation and parallel testing; keep staging only for final pre-release validation.
3. Deterministic seed data, not production copies. Production snapshots carry PII, stale
references, and non-reproducible state. Build seed data from factories that generate
consistent, valid, minimal datasets. (For factory patterns, see test-data-management.)
4. Stub external dependencies at the boundary, not deep inside. Third-party APIs are unreliable, rate-limited, and expensive. Stub them at the HTTP boundary with MSW or WireMock — never by mocking internal service classes, which hides integration bugs between your own code.
5. Environment config is code. Every environment difference (URLs, flags, credentials, resource limits) must be version-controlled and reviewable. No manual setup that cannot be reproduced from the repo.
| Environment | Purpose | Data | External Deps | Lifecycle |
|---|---|---|---|---|
| Local dev | Fast inner loop | Seeded fixtures, minimal | Stubbed (MSW/WireMock) | Developer-managed |
| CI | Automated validation | Seeded per-run, ephemeral | Stubbed or containerized | Created/destroyed per pipeline |
| Preview | PR-level review & E2E | Seeded from factories | Stubbed or sandbox | Created on PR, destroyed on close |
| Staging | Pre-production validation | Anonymized production-like | Real integrations (sandbox accounts) | Long-lived, regularly reset |
| Production | Live users | Real | Real | Permanent |
Fast feedback, zero shared state. Developers must be able to run the full stack locally in under two minutes:
docker compose -f docker-compose.test.yml up -d
npm run db:seed
npm run devUse Docker Compose for infrastructure deps (database, cache, queue) but run the application natively for fast reload. External APIs are stubbed with MSW handlers loaded in dev mode.
Fully containerized, created fresh per pipeline run, destroyed after. The block below is the
services: fragment of a job — nest it under jobs.<id>.services alongside runs-on
and steps; on its own it is not a valid workflow file.
# .github/workflows/test.yml — fragment: nest under jobs.test.services
services:
postgres:
image: postgres:18-alpine
env:
POSTGRES_DB: testdb
POSTGRES_USER: test
POSTGRES_PASSWORD: test
ports: ['5432:5432']
options: >-
--health-cmd="pg_isready -U test"
--health-interval=5s
--health-timeout=3s
--health-retries=5
redis:
image: redis:8-alpine
ports: ['6379:6379']
options: >-
--health-cmd="redis-cli ping"
--health-interval=5s
--health-timeout=3s
--health-retries=5Two ways to give tests real infrastructure. Pick by where the lifecycle should live:
docker compose up --wait) and tear down after, usually via a trap-guarded script. Best for local dev, a
shared CI stack, and E2E where many tests share one set of services.trap to maintain. Best for
integration tests that need isolated, programmatic infra (a throwaway Postgres per test
class). The 2026 default for "ephemeral infra owned by the test," and a strong alternative
to hand-rolled compose + trap scripts.Reach for Compose when humans and many tests share the stack; reach for Testcontainers when each test (or suite) wants its own disposable copy.
Each pull request gets its own isolated environment; reviewers click a link and test the exact changes without interfering with other PRs.
Hosting options (2026), pick by stack:
For each preview, pair the env lifecycle with a database branch (Neon, Supabase,
PlanetScale-style): create a branch on PR open, drop it on close. That gives every preview a
cheap, instant, isolated DB copy instead of a shared staging DB. (See test-data-management.)
For local-dev parity with CI:
.devcontainer/devcontainer.json) — VS Code, Codespaces, JetBrains. The
standard for "everyone gets the same Docker-backed dev env."Tiltfile) — Kubernetes-first local dev with hot reload and multi-service
orchestration. Pick when staging itself is K8s.A frontend preview with E2E against the generated URL is a few lines:
- name: Run E2E against preview
env:
BASE_URL: ${{ steps.deploy.outputs.preview-url }}
run: npx playwright test --project=chromiumA custom Docker preview keyed to a per-PR namespace, auto-torn-down on close:
- name: Deploy preview
run: |
NAMESPACE="pr-${{ github.event.number }}"
docker compose -f docker-compose.preview.yml -p "$NAMESPACE" up -d
echo "preview-url=https://${NAMESPACE}.preview.example.com" >> "$GITHUB_OUTPUT"
- name: Teardown preview
if: github.event.action == 'closed'
run: |
NAMESPACE="pr-${{ github.event.number }}"
docker compose -p "$NAMESPACE" down -vLong-lived environment that mirrors production infrastructure. Reset weekly or on-demand to prevent drift:
#!/bin/bash
# scripts/reset-staging.sh
set -euo pipefail
echo "Resetting staging database..."
psql "$STAGING_DATABASE_URL" -c "DROP SCHEMA public CASCADE; CREATE SCHEMA public;"
echo "Running migrations..." # migrations MUST recreate extensions + grants (see caveat below)
npm run db:migrate -- --env staging
echo "Seeding anonymized data..."
npm run db:seed -- --env staging --dataset production-anonymized
echo "Verifying staging health..."
curl -sf https://staging.example.com/health || exit 1
echo "Staging reset complete."Caveat: DROP SCHEMA public CASCADE also drops the schema's default privileges and any
installed extensions (uuid-ossp, pgcrypto, …). Your migration pipeline must recreate them
(CREATE EXTENSION IF NOT EXISTS …, re-grant defaults) or the migrate step fails. Don't assume
a bare CREATE SCHEMA public restores the prior grants — it does not.
A production-quality docker-compose.test.yml spins up the full stack (app, Postgres, Redis,
a one-shot seed container, Mailpit) for integration and E2E tests. Two details that matter:
depends_on. Without a healthcheck + condition: service_healthy,
depends_on only waits for the container to start, not for the service to accept
connections — tests then race the database and fail with connection errors.depends_on: condition: service_completed_successfully, so the app starts only after seeding exits 0.
Teams that model seed as a long-running service get a race where the app boots mid-seed.See references/docker-compose.md for the full docker-compose.test.yml, the
trap-guarded integration test runner, the multi-stage Dockerfile (with the production
target), and the MinIO block.
One base layer installs deps once; development, test, and seed stages reuse it; and a
slim production stage runs prod deps only (npm ci --omit=dev) with build artifacts copied
from the test stage. The split keeps test dependencies and source out of the shipped image
while giving each environment its own entrypoint. Use npm ci --include=dev in base — the
modern flag; --production=false is legacy --omit/--include syntax. Full Dockerfile in
references/docker-compose.md.
| Dependency Type | Local/CI Strategy | Staging Strategy |
|---|---|---|
| Payment (Stripe) | MSW handler returning mock responses | Stripe test mode with sk_test_ keys |
| Email (SendGrid) | Mailpit capturing SMTP (web UI on :8025, SMTP on :1025) | SendGrid sandbox mode |
| Auth (Auth0) | Local JWT issuer with test keys | Auth0 dev tenant |
| Storage (S3) | MinIO container (S3-compatible) | Dedicated test bucket with lifecycle policy |
| Search (Elasticsearch) | Testcontainers Elasticsearch | Dedicated test index with reset script |
| SMS (Twilio) | MSW handler | Twilio test credentials |
Avoid: MailHog — unmaintained, last release 2020. Use Mailpit (axllent/mailpit); it is a
drop-in on the same ports (1025 SMTP / 8025 UI).
Stub external APIs at the HTTP boundary with MSW 2.x: http + HttpResponse from msw,
setupServer from msw/node, lifecycle wired through beforeAll/afterEach/afterAll. Set
onUnhandledRequest: "error" so an unmocked external call fails the test loudly instead of
leaking a real network request. See references/stubbing.md for the Stripe/SendGrid/geocoding
handlers and the server lifecycle.
Run S3-compatible storage in a container instead of hitting real AWS in local/CI tests. Point
the AWS SDK S3Client at it with endpoint, env-var credentials, and forcePathStyle: true
(required for MinIO). Compose service + client config in references/docker-compose.md.
Stubs drift from reality. Pair every stub with a contract test that verifies the stub matches
the real API shape. For details, see contract-testing.
Run this when setting up or auditing a non-production environment.
| Dimension | Question | Red Flag |
|---|---|---|
| Database engine | Same engine and version as production? | SQLite in test, PostgreSQL in prod |
| Database schema | Same migration pipeline applied? | Manual schema changes in staging |
| Data shape | Seed data covers all entity states? | Only "happy path" records, no edge cases |
| Infrastructure | Same container orchestration? | Docker Compose in CI, Kubernetes in prod |
| Network | Same internal service topology? | Monolith in test, microservices in prod |
| Config | Env vars documented and version-controlled? | Undocumented env vars, manual setup |
| Auth | Same auth provider/flow? | Bypassed auth in test with hardcoded tokens |
| Feature flags | Same flag evaluation engine? | Hardcoded flags in test, LaunchDarkly in prod |
| TLS/HTTPS | Same certificate handling? | HTTP in staging, HTTPS in prod |
| Timeouts/Limits | Same rate limits, pools, timeouts? | Infinite timeouts in test hide perf issues |
For factory-based seed data patterns, see test-data-management.
Shared staging as the only test environment. One developer's broken deploy blocks everyone. Use ephemeral per-PR environments for isolation and keep staging for final pre-release validation only.
Production database copies for test data. PII risk, non-reproducible state, massive datasets that slow tests. Build minimal seed data from factories with deterministic values.
Environment-specific code paths. if (process.env.NODE_ENV === "test") { skipAuth(); }
means you are not testing the real auth flow. Swap implementations via dependency injection or
config, not environment conditionals.
Manual environment setup. If setup needs a 15-step wiki page, it will be wrong within a
week. Script everything: docker compose up -d && npm run db:seed should be the only steps.
Stubbing internal services instead of external ones. Stub at the HTTP boundary where your system talks to the outside world. Stubbing internal modules hides integration bugs between your own services.
No health checks in Docker Compose. depends_on without a healthcheck waits only for the
container to start, not for the service to be ready — tests race the database and fail with
connection errors.
Long-lived preview environments. Previews that persist after merge waste resources and
accumulate stale state. Automate teardown on PR close (if: github.event.action == 'closed').
Run these against the artifacts you produce, smallest check first:
docker compose -f docker-compose.test.yml config -q exits 0
(catches YAML and schema errors before you ever pull an image).docker compose -f docker-compose.test.yml up -d --wait --wait-timeout 60 exits 0; a non-zero exit means a healthcheck never went green.docker compose exec postgres pg_isready -U test -d testdb reports accepting connections.docker build --target production -t app:prod . succeeds, and docker run --rm app:prod npm ls --omit=dev --depth=0 shows no dev deps.onUnhandledRequest: "error"; any real outbound
call should error the test, not pass silently.docker compose -f docker-compose.test.yml config -q exits 0 and docker compose up -d --wait brings every service to a passing healthcheck (exit 0).production target with --omit=dev (no dev dependencies in the shipped image).onUnhandledRequest: "error"; no real third-party credentials in non-prod.if: github.event.action == 'closed').references/)docker-compose.test.yml (Postgres 18, Redis 8, one-shot seed, Mailpit), the trap-guarded integration test runner, the multi-stage Dockerfile (base/development/test/seed/production), and the MinIO service + S3 client config.setupServer lifecycle with onUnhandledRequest: "error".© 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 2 other files (references) in skills/test-environments of petrkindlmann/qa-skills.
Open the folder on GitHubat commit b3bb61b
Test Environments 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 |
|---|---|---|---|---|---|---|
| Test Environments this skillpetrkindlmann/qa-skills | 165 | — | ~4.6k | Automated safety check: Pass | MIT | |
| Cb Build TestBlkLeg/CircuitBreaker | 201 | — | ~1.9k | Automated safety check: Pass | MIT | |
| Plugin Testapache/skywalking-python | 219 | — | ~2.3k | Automated safety check: Pass | Apache-2.0 | |
| Code PatternsAedelon/claude-code-blueprint | 120 | — | ~1.2k | Automated safety check: Pass | Custom licence | |
| Model Download Devopen-edge-platform/edge-ai-libraries | 169 | — | ~2k | Automated safety check: Pass | Apache-2.0 | |
| Senior DevOps Toolkitmaslennikov-ig/claude-code-orchestrator-kit | 260 | 6 repos | ~1.1k | Automated safety check: Notes | Custom licence |
BlkLeg/CircuitBreaker
How Circuit Breaker is built, tested, packaged, and kept secret-safe — the make dev/verify/test targets, the PostgreSQL integration test database and its fixtures, the mono Docker image and native…
apache/skywalking-python
Build Docker test images and run SkyWalking Python plugin/unit/e2e tests locally, mirroring the CI pipeline
Aedelon/claude-code-blueprint
Reference patterns for REST APIs, pytest/vitest testing, Docker multi-stage builds, GitHub Actions CI/CD, PostgreSQL, TypeScript generics, Python async, and React Server Components.
open-edge-platform/edge-ai-libraries
Extend, test, debug, or integrate the Model Download microservice codebase.
maslennikov-ig/claude-code-orchestrator-kit
Comprehensive DevOps skill for CI/CD, infrastructure automation, containerization, and cloud platforms (AWS, GCP, Azure). Includes pipeline setup…
FNOSP/FlyNarwhal
A skill your agent uses when the user wants to create, generate, or set up a GitHub Actions workflow.
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…
Works with
Categories
Design environment strategy for testing across dev, CI, preview, staging, and production — Docker Compose test infrastructure, multi-stage Dockerfiles, seed-data lifecycle, per-PR preview…. Test Environments is an agent skill from petrkindlmann/qa-skills. Design environment strategy for testing across dev, CI, preview, staging, and production — Docker Compose test infrastructure, multi-stage Dockerfiles, seed-data lifecycle, per-PR preview environments, production parity, and external-dependency stubbing at the HTTP boundary.
Test Environments fits situations like: : set up test environment; Docker-compose for tests; per-PR preview environment; spin up test infra.
Run `npx skills add petrkindlmann/qa-skills --skill test-environments -a claude-code`. Or copy the skill folder (skills/test-environments in petrkindlmann/qa-skills) into .claude/skills/test-environments in your project. Claude Code loads it when a task matches its description.
Run `npx skills add petrkindlmann/qa-skills --skill test-environments -a codex`. Or copy the skill folder (skills/test-environments in petrkindlmann/qa-skills) into .agents/skills/test-environments 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 test-environments -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/test-environments, .gemini/skills/test-environments, .github/skills/test-environments and .opencode/skills/test-environments in your project.
Going by SKILL.md and its folder, Test Environments needs the command-line tools its instructions call (npm, docker, psql and curl) and credentials named POSTGRES_PASSWORD. Our summary lists: Python 3; Node.js; Docker.
SKILL.md contains no URLs. Its commands use npm, docker and curl, 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.
Test Environments 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.6k tokens (SKILL.md is roughly 18k 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 1.9k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Test Environments: Cb Build Test (BlkLeg/CircuitBreaker, 201 stars), Plugin Test (apache/skywalking-python, 219 stars), Code Patterns (Aedelon/claude-code-blueprint, 120 stars) and Model Download Dev (open-edge-platform/edge-ai-libraries, 169 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 165 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.