mcpField
N
ns-code-backend-tests

ns-code-backend-tests

github.com/nextstage-brasilTesting & quality054 installsUpdated 6d ago
Repository

About ns-code-backend-tests

A skill for implementing backend PHPUnit tests in PHP projects. It discovers or bootstraps the test root, follows existing project patterns, and requires test execution inside the documented Docker test container.

Key features

  1. 01Locate or bootstrap PHPUnit setup
  2. 02Inspect code and existing tests
  3. 03Write unit and HTTP feature tests
  4. 04Run tests in Docker container
  5. 05Report results and blockers

Use cases

  1. 01Adding tests for backend changes
  2. 02Testing authenticated and tenant-scoped endpoints
  3. 03Bootstrapping tests in a backend package

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/nextstage-brasil/skills --skill ns-code-backend-tests

After installing, type/ns-code-backend-testsin Claude Code to confirm it loaded.

Bundled filesevals/evals.jsonreferences/backend-testing-architecture.md

Details

From the project README

Create Backend Tests

Execution-phase PHPUnit implementation. Planning-phase: ns-pm-unit-test-task-generator.

Harness discovery

Load {harness_root}/rules/backend-tests-rules.mdc and backend-rules.mdc when present. See references/backend-testing-architecture.md for layout, run contract, and bootstrap summary.

Phase 0 — Resolve or bootstrap backend test root

Before any test class code, locate the PHPUnit project or create minimal structure.

0.1 — Detect existing tests (brownfield)

Search {product_root} in this order:

  1. backend/phpunit.xml
  2. phpunit.xml at {product_root}/
  3. tests/Unit/ or tests/Feature/ under the directory that contains composer.json with PHPUnit

Record the directory containing phpunit.xml as {backend_root}. All paths below are relative to {backend_root}.

0.2 — Bootstrap when nothing exists (greenfield)

If backend application code exists (app/, src/, or equivalent) but no phpunit.xml and no tests/:

RuleDetail
Location{product_root}/backend/ when monorepo; else {product_root}/
TreePer references/backend-testing-architecture.md — phpunit.xml, tests/TestCase.php, tests/Unit/, tests/Feature/
DependenciesPHPUnit via existing composer.json — never add to frontend or unrelated packages

Then set {backend_root} to that directory.

Forbidden on greenfield: assuming tests exist, running PHPUnit on the host, or scaffolding tests outside the backend package.

0.3 — Post-bootstrap documentation

When {product_root}/docs/context/stack-confirmed.md or architecture-rules.md exists, add or update the backend test row: {backend_root}, docker test container, and the PHPUnit run command from Phase 5.

Do not proceed to Phase 1 until {backend_root} is confirmed and phpunit.xml is readable.

Phase 1 — Discovery (before feature code)

  1. Code under test — read implementation files (Service, FormRequest, Controller, etc.)
  2. Existing tests — read matching files under tests/Unit/ and tests/Feature/; extend, do not duplicate
  3. Project patterns — factories, RefreshDatabase, response envelope, multitenancy helpers from harness rules
  4. Task contract — when implementing a ns-pm-unit-test-task-generator task, follow its scenario checklist

Phase 2 — Write tests

  • Unit: mock dependencies — no real DB/queue/cache I/O
  • Feature: HTTP tests with auth, 401/403, cross-tenant P0 when applicable
  • Naming: {Component}Test.php, descriptive snake_case method names
  • Match module paths: tests/Unit/Modules/{Domain}/, tests/Feature/Modules/{Domain}/

Phase 3 — Run (mandatory contract)

See also ../ns-harness/references/docker-and-testing.md.

  1. Run docker ps — confirm the documented test container (ask once if undocumented)
  2. Execute inside the test container at {backend_root} workdir:
timeout 120 docker exec -w {workdir} {test_container} \
  vendor/bin/phpunit --testdox --stop-on-failure --stop-on-error {optional_filter}
  1. Timeout: if the command is killed at 120s (e.g. exit 124), treat the run as dead/hung — abort, report blocker, do not silently retry
  2. Never run vendor/bin/phpunit or phpunit.sh on the host

Filtered runs (single class or method) use the same flags and timeout.

Phase 4 — Report

  • Pass: list files added/changed
  • Fail: first failing test name + assertion from --testdox output
  • Hung/timeout: state 120s limit exceeded; invoke ns-code-investigator if root cause unclear

References

FileWhen
references/backend-testing-architecture.mdLayout, bootstrap, run contract
ns-pm-unit-test-task-generatorTask contract source

Related skills

  • ns-pm-unit-test-task-generator — planning tasks
  • ns-code-investigator — failing or hung test debugging
  • ns-code-coder — ad-hoc fixes outside planned unit-test tasks

Comments

Markdown supported