hermes

Test-writing rules

Standing rules for tests an assistant writes, covering behaviour over implementation, no sleeps, deterministic data, mocks only at boundaries and one reason to fail per test.

When you write or change tests in this project:

What to test

  • Test observable behaviour through the public interface: return values, state others can see, emitted events, HTTP responses, rendered output. Do not assert on private functions, internal call order or intermediate variables.
  • Cover the cases that break code: empty input, a single item, boundaries, invalid input, error paths and concurrency where it applies, not just the happy path.
  • Every bug fix comes with a test that fails without the fix.

Shape

  • Each test checks one behaviour and has one reason to fail. Several assertions are fine when they describe the same behaviour.
  • Name tests after the behaviour and the condition, such as "returns 404 when the order does not exist", not "test_get_2".
  • Structure tests as arrange, act, assert, and set up only the data the test needs, using builders or factories with clear defaults.
  • Make assertions specific: exact values, specific error types and messages. Avoid snapshot assertions of large output unless someone reviews the snapshot.

Determinism

  • Never use sleeps to wait for something. Wait on the condition or event with a timeout, or use the framework's async utilities.
  • Control time with a fake clock, randomness with a fixed seed, and time zone and locale explicitly. Never depend on the current date.
  • Tests must not depend on execution order or on state left by other tests. Clean up files, records and global state, and give each test its own data.
  • No real network calls to third parties in unit tests.

Test doubles

  • Mock or fake only at the boundaries you do not own or cannot run cheaply: network, clock, file system, third-party services. Do not mock the unit under test or its internal collaborators.
  • Prefer simple fakes and stubs to mocks with strict call expectations, which break on harmless refactors.

Integrity

  • Follow the project's test framework, file layout and helpers. Do not add a new test library without asking.
  • Keep unit tests fast, and mark slow or integration tests the way the project does.
  • Run the tests you wrote and report the real result. If you could not run them, say so.
  • Fix the behaviour, not the test. Never special-case test inputs, weaken assertions or skip tests to make a check pass.
  • If a test looks wrong, explain why and ask before changing it.

details

kind
Rule: standing instructions for everything the assistant does
domain
Software engineering
category
Testing
made for
Software engineer, QA / test engineer, Backend engineer, Frontend engineer
risk
read-only
version
v1.0.0 · experimental
reviewed
2026-10-02
works in
Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, Antigravity, OpenCode, Windsurf, Zed, Continue, AGENTS.md, ChatGPT, claude.ai

Edit on GitHubReport a problem

use in

Hodios CLI
npx @hermes-hq/hodios install test-writing-rules --target claude-code
Agent Skills
npx skills add hermes-hq/hodios-dist --skill test-writing-rules -a claude-code

Rules are always-on instructions, so they are not in the plugins: add the skill, or paste the text into CLAUDE.md.

pairs well with

All of Testing
RuleConventions

Python style rules

Standing rules for Python an assistant writes, covering type hints, pathlib, logging over print, explicit exceptions, safe subprocess calls, project layout and the project's own tooling.

python-style-rules
RuleConventions

Go style rules

Standing rules for Go an assistant writes, covering wrapped errors, context propagation, small consumer-side interfaces, table-driven tests and no goroutines without an owner.

go-style-rules
RuleConventions

Rust style rules

Standing rules for Rust an assistant writes, covering ownership-first APIs, Result over panic, clippy-clean code, typed errors, async hygiene and minimal, justified unsafe.

rust-style-rules
RuleConventions

React component rules

Standing rules for React code an assistant writes, covering function components, the rules of hooks, colocated state, stable list keys, accessible markup and no effect-driven derived state.

react-component-rules
PromptTesting

Review test quality

Reviews a test suite or diff for weak assertions, over-mocking, hidden coupling, sleeps, nondeterminism and tests that cannot fail, with a concrete rewrite for each problem. Use when reviewing tests.

review-test-quality
PromptTesting

Write a test plan

Writes a risk-based test plan for a feature or release covering scope, risks, test levels, environments, data, manual checks automation misses and exit criteria. Use before testing a release.

write-test-plan