
testing-best-practices
Choose and write the right test type (Playwright integration unit) against isolated Neon branches. Use when adding, running, or debugging tests for a feature.
- Installs
- 101
- Last 24h
- —
- Trending rank
- —
- Security
- Not audited
Install
Works with every agent the skills CLI supports.
npx skills add https://github.com/andrelandgraf/fullstackrecipes --skill testing-best-practices- 01
Install
Run the command in your project. The CLI asks which agents to install for.
- 02
Describe the task
Ask your agent for something this skill covers. It loads testing-best-practices automatically when relevant.
- 03
Review the result
The agent follows the SKILL.md steps, scripts and references bundled with the skill.
SKILL.md
The instructions your agent reads when the skill is triggered.
Testing Best Practices
Choose the right test type, isolate data per suite, and run against a disposable Neon branch.
Prerequisites
Complete these setup recipes first:
- Browser Tests with Playwright
- Integration Tests
- Unit Tests with Bun
Choosing a Test Type
Ask "how would a user verify this works?" and pick the highest applicable tier:
- Playwright (default) — UI interactions, visual feedback, form validation, multi-step flows, protected routes, accessibility.
- Integration — API responses (status, JSON shape), DB state after operations, server logic without UI, or when Playwright is too slow/complex.
- Unit — pure functions with complex logic, many edge cases, or type narrowing/assertions with no external dependencies.
Running
All tests run against an isolated, schema-only Neon branch that auto-deletes after 1 hour.
bun run test # all tests
bun run test:playwright # browser only
bun run test:integration # integration only
bun run test:unit # unit only
Folder Structure
Unit tests are co-located; Playwright and integration tests live under tests/.
src/lib/<domain>/<file>.test.ts # unit (co-located)
tests/integration/<feature>.test.ts
tests/playwright/<feature>.spec.ts
tests/playwright/lib/ # Playwright helpers
Writing Tests
Playwright spec:
import { test, expect } from "@playwright/test";
test.describe("Feature Name", () => {
test("should do expected behavior", async ({ page }) => {
await page.goto("/feature");
});
});
Integration — import the route handler directly instead of going over HTTP:
import { describe, it, expect } from "bun:test";
import { GET } from "@/app/api/feature/route";
describe("GET /api/feature", () => {
it("returns expected response", async () => {
const response = await GET();
expect(response.status).toBe(200);
const data = await response.json();
expect(data.value).toBeDefined();
});
});
Unit (co-located):
import { describe, it, expect } from "bun:test";
import { myFunction } from "./my-file";
describe("myFunction", () => {
it("returns expected value", () => {
expect(myFunction()).toBe("expected");
});
});
Test Data Isolation
Tests run in parallel against the shared branch, so each suite must own its data. Generate unique users per spec (e.g. auth-test-${uuid}@example.com), avoid shared resources, and rely on the branch TTL for cleanup — never assume data from another test exists.
const testUser = await createTestUser({
email: `auth-test-${uuid}@example.com`,
});
Common Patterns
// Protected route (Playwright)
test("redirects unauthenticated user", async ({ page }) => {
await page.goto("/protected-page");
await expect(page).toHaveURL(/sign-in/);
});
// Error state (Playwright)
test("shows error for invalid input", async ({ page }) => {
await page.goto("/form");
await page.getByRole("button", { name: /submit/i }).click();
await expect(page.getByText(/error|required/i)).toBeVisible({
timeout: 5000,
});
});
Debugging
bunx playwright test --headed # watch the browser
bunx playwright test --debug # step through
bunx playwright show-report # HTML report
bun test --only "test name" # run a single test
bun test --watch # re-run on change
Failed Playwright runs save screenshots and traces to test-results/ — check there when CI fails.
FAQ
What does the testing-best-practices skill do?
Choose and write the right test type (Playwright integration unit) against isolated Neon branches. Use when adding, running, or debugging tests for a feature.
How do I install testing-best-practices?
Run npx skills add https://github.com/andrelandgraf/fullstackrecipes --skill testing-best-practices in your project. The skills CLI detects the agents you use and copies the skill into the right folder. For Claude Code you can also place the skill folder at ~/.claude/skills/testing-best-practices/ (personal) or .claude/skills/testing-best-practices/ (project).
Which AI agents can use testing-best-practices?
Any agent that supports the open Agent Skills format (a folder with a SKILL.md file), including Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, Windsurf, Cline, OpenCode and more.
Is testing-best-practices safe to install?
No partner security audit is available yet. Skills can run commands and scripts, so read the SKILL.md and any bundled files before installing.
Who maintains testing-best-practices?
It is published by andrelandgraf in andrelandgraf/fullstackrecipes. It has 101 recorded installs.
More from andrelandgraf/fullstackrecipes
ralph-loop
andrelandgraf/fullstackrecipes
Complete setup for automated agent-driven development. Define features as user stories with testable acceptance criteria, then run AI agents in a loop until all stories pass.
ralph-loop-workflow
andrelandgraf/fullstackrecipes
Run a coding agent in an autonomous loop via a /ralph command, gated by a preflight check that every CLI is installed, linked, and authenticated. Use when driving long-running autonomous development from a wide, outcome-focused prompt.
observability-monitoring
andrelandgraf/fullstackrecipes
Complete observability stack with structured logging, error tracking, and web analytics.
stripe-subscriptions
andrelandgraf/fullstackrecipes
Open the skill to read its SKILL.md instructions.
og-image-generation
andrelandgraf/fullstackrecipes
Generate dynamic social preview images using Next.js file conventions and the next/og library. Server-rendered JSX images cached at build time.
shiki-code-blocks
andrelandgraf/fullstackrecipes
Open the skill to read its SKILL.md instructions.
Popular testing & qa skills
tdd
mattpocock/skills
Test-driven development. Use when the user wants to build features or fix bugs test-first, mentions "red-green-refactor", or wants integration tests.
grilling
mattpocock/skills
Grill the user relentlessly about a plan, decision, or idea. Use when the user wants to stress-test their thinking, or uses any 'grill' trigger phrases.
migrate-to-shoehorn
mattpocock/skills
Migrate test files from as type assertions to @total-typescript/shoehorn. Use when user mentions shoehorn, wants to replace as in tests, or needs partial test data.
run-train
lllllllama/rigorpilot-skills
Rigor Train skill for deep learning research repositories. Use when a documented or selected training command should be run conservatively for startup verification, short-run verification, full kickoff, or resume, with command, config, seed, log, checkpoint, status, and metric evidence written to standardized trainoutputs/. Do not use for environment setup, exploratory sweeps, speculative idea implementation, or end-to-end orchestration.
test-driven-development
obra/superpowers
Use when implementing any feature or bugfix, before writing implementation code
finishing-a-development-branch
obra/superpowers
Use when implementation is complete, all tests pass, and you need to decide how to integrate the work