Major refactoring of projman plugin architecture: Skills Extraction (17 new files): - Extracted reusable knowledge from commands and agents into skills/ - branch-security, dependency-management, git-workflow, input-detection - issue-conventions, lessons-learned, mcp-tools-reference, planning-workflow - progress-tracking, repo-validation, review-checklist, runaway-detection - setup-workflows, sprint-approval, task-sizing, test-standards, wiki-conventions Command Consolidation (17 → 12 commands): - /setup: consolidates initial-setup, project-init, project-sync (--full/--quick/--sync) - /debug: consolidates debug-report, debug-review (report/review modes) - /test: consolidates test-check, test-gen (run/gen modes) - /sprint-status: absorbs sprint-diagram via --diagram flag Architecture Cleanup: - Remove plugin-level mcp-servers/ symlinks (6 plugins) - Remove plugin README.md files (12 files, ~2000 lines) - Update all documentation to reflect new command structure - Fix documentation drift in CONFIGURATION.md, COMMANDS-CHEATSHEET.md Commands are now thin dispatchers (~20-50 lines) that reference skills. Agents reference skills for domain knowledge instead of inline content. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
174 lines
4.2 KiB
Markdown
174 lines
4.2 KiB
Markdown
---
|
|
name: test-standards
|
|
description: Testing requirements, framework detection, and patterns
|
|
---
|
|
|
|
# Test Standards
|
|
|
|
## Purpose
|
|
|
|
Defines testing requirements, framework detection, and test patterns.
|
|
|
|
## When to Use
|
|
|
|
- **Commands**: `/test-check`, `/test-gen`
|
|
- **Executor agent**: When writing tests during implementation
|
|
|
|
---
|
|
|
|
## Framework Detection
|
|
|
|
| Indicator | Framework | Command |
|
|
|-----------|-----------|---------|
|
|
| `pytest.ini`, `pyproject.toml` with pytest | pytest | `pytest` |
|
|
| `package.json` with jest | Jest | `npm test` or `npx jest` |
|
|
| `package.json` with vitest | Vitest | `npm test` or `npx vitest` |
|
|
| `go.mod` with `*_test.go` | Go test | `go test ./...` |
|
|
| `Cargo.toml` | Cargo test | `cargo test` |
|
|
| `Makefile` with test target | Make | `make test` |
|
|
|
|
---
|
|
|
|
## Coverage Commands
|
|
|
|
| Framework | Coverage Command |
|
|
|-----------|------------------|
|
|
| Python/pytest | `pytest --cov=src --cov-report=term-missing` |
|
|
| JavaScript/Jest | `npm test -- --coverage` |
|
|
| Go | `go test -cover ./...` |
|
|
| Rust | `cargo tarpaulin` or `cargo llvm-cov` |
|
|
|
|
---
|
|
|
|
## Test Structure Pattern
|
|
|
|
### Unit Tests
|
|
|
|
For each function:
|
|
- **Happy path**: Expected inputs → expected output
|
|
- **Edge cases**: Empty, null, boundary values
|
|
- **Error cases**: Invalid inputs → expected errors
|
|
- **Type variations**: If dynamic typing
|
|
|
|
### Example (Python/pytest)
|
|
|
|
```python
|
|
import pytest
|
|
from module import target_function
|
|
|
|
class TestTargetFunction:
|
|
"""Tests for target_function."""
|
|
|
|
def test_happy_path(self):
|
|
"""Standard input produces expected output."""
|
|
result = target_function(valid_input)
|
|
assert result == expected_output
|
|
|
|
def test_empty_input(self):
|
|
"""Empty input handled gracefully."""
|
|
result = target_function("")
|
|
assert result == default_value
|
|
|
|
def test_invalid_input_raises(self):
|
|
"""Invalid input raises ValueError."""
|
|
with pytest.raises(ValueError):
|
|
target_function(invalid_input)
|
|
|
|
@pytest.mark.parametrize("input,expected", [
|
|
(case1_in, case1_out),
|
|
(case2_in, case2_out),
|
|
])
|
|
def test_variations(self, input, expected):
|
|
"""Multiple input variations."""
|
|
assert target_function(input) == expected
|
|
```
|
|
|
|
---
|
|
|
|
## Test Strategy by Code Pattern
|
|
|
|
| Code Pattern | Test Approach |
|
|
|--------------|---------------|
|
|
| Pure function | Unit tests with varied inputs |
|
|
| Class with state | Setup/teardown, state transitions |
|
|
| External calls | Mocks/stubs for dependencies |
|
|
| Database ops | Integration tests with fixtures |
|
|
| API endpoints | Request/response tests |
|
|
| UI components | Snapshot + interaction tests |
|
|
|
|
---
|
|
|
|
## Test Check Output Format
|
|
|
|
```
|
|
## Test Check Summary
|
|
|
|
### Test Results
|
|
- Framework: pytest
|
|
- Status: PASS/FAIL
|
|
- Passed: 45 | Failed: 2 | Skipped: 3
|
|
- Duration: 12.5s
|
|
|
|
### Failed Tests
|
|
- test_auth.py::test_token_refresh: AssertionError (line 45)
|
|
- test_api.py::test_login_endpoint: TimeoutError (line 78)
|
|
|
|
### Coverage (if available)
|
|
- Overall: 78%
|
|
- Sprint files coverage:
|
|
- auth/jwt_service.py: 92%
|
|
- api/routes/auth.py: 65%
|
|
- models/user.py: NO TESTS
|
|
|
|
### Recommendation
|
|
TESTS MUST PASS / READY FOR CLOSE / COVERAGE GAPS TO ADDRESS
|
|
```
|
|
|
|
---
|
|
|
|
## Test Generation Output Format
|
|
|
|
```
|
|
## Tests Generated
|
|
|
|
### Target: src/orders.py:calculate_total
|
|
|
|
### File Created: tests/test_orders.py
|
|
|
|
### Tests (6 total)
|
|
- test_calculate_total_happy_path
|
|
- test_calculate_total_empty_items
|
|
- test_calculate_total_negative_price_raises
|
|
- test_calculate_total_with_discount
|
|
- test_calculate_total_with_tax
|
|
- test_calculate_total_parametrized_cases
|
|
|
|
### Run Tests
|
|
pytest tests/test_orders.py -v
|
|
```
|
|
|
|
---
|
|
|
|
## Do NOT
|
|
|
|
- Modify test files during `/test-check` (only run and report)
|
|
- Skip failing tests to make the run pass
|
|
- Run tests in production environments
|
|
- Install dependencies without asking first
|
|
- Run tests requiring external services without confirmation
|
|
|
|
---
|
|
|
|
## Error Handling
|
|
|
|
**If tests fail:**
|
|
1. Report the failure clearly
|
|
2. List failed test names and error summaries
|
|
3. Recommend: "TESTS MUST PASS before sprint close"
|
|
4. Offer to help debug specific failures
|
|
|
|
**If framework not detected:**
|
|
1. List what was checked
|
|
2. Ask user to specify the test command
|
|
3. Offer common suggestions based on file types
|