testing-practices
Skill218 starsChanged 7 days agoMITView on GitHub
Write, review, or refactor tests that maximize confidence per maintenance cost. Use for test strategy, unit/integration/browser/E2E tests, fixtures, mocks, flaky tests, skipped tests, brittle assertions, or deciding what behavior deserves coverage.
1 other project uses a version of this.
Adopted by
Most recently taken up by
- gray-matter/skillstheir own version, first seen Oct 4, 2026
Other versions1 project uses a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 1
- gray-matter/skills★ 0same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository21 other files it gives its agents.
- AGENTS.mdAGENTS.md
- hydrogen-analyticsSkill
- hydrogen-cart-drawerSkill
- hydrogen-cart-metafieldsSkill
- hydrogen-cart-uiSkill
- hydrogen-collection-browserSkill
- hydrogen-customer-accountSkill
- hydrogen-imageSkill
- hydrogen-local-httpsSkill
- hydrogen-marketsSkill
- hydrogen-moneySkill
- hydrogen-oxygenSkill
- hydrogen-predictive-searchSkill
- hydrogen-request-handlersSkill
- hydrogen-routingSkill
- hydrogen-setupSkill
- hydrogen-shop-paySkill
- hydrogen-smoke-testSkill
- hydrogen-storefront-clientSkill
- hydrogen-variant-formSkill
- remix-storeSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
16 rules. About 0 are common, 16 are distinctive, and 0 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈16
Distinctive · estimate
This author's own choices. Worth a look.
0
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 19
Test the normal path and the important failure/edge states—not every branch.
- Distinctive: line 30
Do not impose fixed percentages.
- Distinctive: line 40
Avoid asserting private state, helper calls, component names, generated classes, exact serialization, incidental DOM nesting, query text, …
- Distinctive: line 46
Do not mock code owned by the unit under test merely to make setup easier.
- Distinctive: line 48
Prefer a small fake server, in-memory adapter, or injected dependency over module-level mock webs.
- Distinctive: line 50
If fixture setup starts reimplementing production behavior, move the test outward or simplify the seam.
- Distinctive: line 59
create state per test and clean it up.
- Distinctive: line 60
never depend on execution order or another test’s output.
- Distinctive: line 62
keep live-service smoke tests separate from required deterministic tests.
- Distinctive: line 63
never perform real destructive or billable actions without explicit approval.
- Distinctive: line 71
Prefer Arrange–Act–Assert without nested ceremony.
- Distinctive: line 73
Keep scenario-specific values and overrides in the test.
- Distinctive: line 75
Do not add tests for trivial framework/library behavior already guaranteed elsewhere.
- Distinctive: line 76
Do not use code-coverage targets as a goal.
- Distinctive: line 88
Validation: Run the narrow test first, then the repository’s relevant full checks.
- Distinctive: line 90
When reviewing a suite, prioritize false confidence, implementation coupling, flaky synchronization, skipped tests, and missing critical …
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Testing Practices
Optimize for confidence per unit of maintenance, not test count or line coverage:
The more tests resemble how software is used, the more confidence they provide.
“Write tests. Not too many. Mostly integration.” Integration means multiple owned units exercising a real contract together; exact labels matter less than useful, reliable failures.
Choose the test from the risk
- Name the regression that would matter to a user or consumer.
- Identify the public boundary where that regression is observable.
- Choose the lowest-cost test that faithfully crosses that boundary.
- Test the normal path and the important failure/edge states—not every branch.
| Test | Use when | Exercise |
| Static analysis | Baseline; run checks per repository policy and change risk | Types, lint, schemas, builds |
| Unit | Dense pure logic or combinatorial cases | Public input/output; real cheap collaborators |
| Integration | Default for application behavior | Real owned modules across HTTP, rendering, storage, routing, or state boundaries |
| UI integration | Behavior needs rendered UI but not a full app | Real rendering, state, and user events |
| Real browser | Behavior depends on browser APIs or browser/runtime integration | DOM, focus, navigation, browser events |
| E2E | A few critical journeys or runtime wiring risks | App through public UI/API with as little substitution as practical |
Do not impose fixed percentages. A parser, UI app, and distributed service need different shapes.
Test contracts, not construction
Assert what a real user or developer consumer can observe:
- status, headers, response body, persisted state;
- accessible roles/names, visible content, navigation, focus, disabled/loading/error state;
- documented callback/module output or side effect.
Avoid asserting private state, helper calls, component names, generated classes, exact serialization, incidental DOM nesting, query text, or asset hashes unless one is itself a documented contract. A good refactor that preserves behavior should usually preserve the test.
For UI, interact through the rendered DOM. Prefer role/name/label, then stable text, then a test ID when no user-facing locator exists. CSS/XPath selectors are a last resort. Use retrying/web-first assertions for asynchronous UI rather than sleeps.
Keep real code inside the boundary
- Do not mock code owned by the unit under test merely to make setup easier.
- Substitute external, destructive, nondeterministic, slow, or unavailable boundaries: payment, email, clocks, random values, third-party APIs.
- Prefer a small fake server, in-memory adapter, or injected dependency over module-level mock webs.
- Model both success and meaningful failure responses at the boundary.
- If fixture setup starts reimplementing production behavior, move the test outward or simplify the seam.
A mock interaction assertion is valid only when the interaction is the public contract. Otherwise assert the resulting behavior.
Make failures trustworthy
Tests must be deterministic, isolated, and independently runnable:
- control time, randomness, network, external data, and environment;
- create state per test and clean it up;
- never depend on execution order or another test’s output;
- synchronize on promises, events, or observable state—not arbitrary delays;
- keep live-service smoke tests separate from required deterministic tests;
- never perform real destructive or billable actions without explicit approval.
Do not skip or quarantine tests as routine maintenance. Do not keep placeholder tests for speculative or abandoned behavior; tests may lead implementation when they specify an approved contract. A flaky test is a defect: fix its synchronization/isolation or delete it if it protects no meaningful contract.
Keep the suite small and readable
- One test should express one behavior, though it may contain several assertions proving that behavior.
- Name tests as use cases: action/condition → observable result.
- Prefer Arrange–Act–Assert without nested ceremony.
- Share mechanics (app creation, valid fixture builders, external boundary adapters), not the facts central to the scenario.
- Keep scenario-specific values and overrides in the test.
- Accept small duplication when abstraction would hide intent.
- Do not add tests for trivial framework/library behavior already guaranteed elsewhere.
- Do not use code-coverage targets as a goal. Review important use-case coverage instead.
Required review
Before finishing, verify:
- Regression: What real breakage makes this test fail?
- Boundary: Does it use a public/user-observable contract?
- Sensitivity: Would a behavior-preserving refactor still pass? Would the intended bug fail?
- Fidelity: Are owned collaborators real where practical?
- Determinism: Are external data, time, randomness, and async completion controlled?
- Value: Is this behavior important and not already proven more effectively elsewhere?
- Validation: Run the narrow test first, then the repository’s relevant full checks.
When reviewing a suite, prioritize false confidence, implementation coupling, flaky synchronization, skipped tests, and missing critical journeys over raw test or coverage counts.
Sources
- Kent C. Dodds, The Testing Trophy and Testing Classifications
- Kent C. Dodds, Write tests. Not too many. Mostly integration.
- Kent C. Dodds, Testing Implementation Details
- Kent C. Dodds, How to know what to test
- Testing Library guiding principles
- Playwright best practices
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

