Install
openclaw skills install dev-testStructured development and testing SOP for implementing code changes. Covers codebase study, minimal focused implementation, test writing patterns, test execution, and diff review. Applies to any development work — bug fixes, features, refactors, or open-source contributions. Use when you need a disciplined development workflow with built-in quality checks.
openclaw skills install dev-testA structured workflow for implementing code changes with quality built in. Covers the full cycle from understanding the codebase to having a verified, reviewable diff.
Use cases: Bug fixes, feature development, refactoring, open-source contributions, any code change that needs to be correct and maintainable.
Never write code before understanding the context. This phase prevents wasted effort and bad designs.
Check for and read these files (if they exist):
CONTRIBUTING.md — contribution guidelines.editorconfig — formatting rulespyproject.toml / package.json / Makefile — project config, linting, formattingtox.ini / .flake8 / .eslintrc — code style rulestests/, __tests__/, test/test_feature.py, feature.test.ts, feature_test.goBefore writing code, articulate:
Minimal, focused changes
Follow existing patterns
snake_case, don't introduce camelCaseAdd comments for non-obvious logic
Design for quality
| Principle | Meaning | Example |
|---|---|---|
| Defense-in-depth | Layer multiple protections | Validate input at API + service + DB layer |
| Backward compatibility | Don't break existing behavior | Add new params with defaults |
| Graceful degradation | Handle missing features | Platform-specific code falls back safely |
| Extensibility | Prefer composable designs | Plugin/middleware over hardcoded switch |
| Single responsibility | One function = one job | Extract logic instead of growing functions |
Fix verification — prove the bug is fixed / feature works
test_feature_handles_null_input() # The exact scenario from the issue
Edge cases — boundary conditions
test_feature_with_empty_string()
test_feature_with_max_length_input()
test_feature_with_special_characters()
Error handling — invalid inputs, failure paths
test_feature_raises_on_invalid_type()
test_feature_returns_none_on_missing_key()
Regression — existing behavior preserved
test_existing_behavior_unchanged()
test_other_module_still_works()
test_oauth_token_refreshes_when_expired not test_tokendef test_feature():
# Arrange
input_data = create_test_data()
# Act
result = feature(input_data)
# Assert
assert result.status == "success"
# 1. Run only your new/modified tests first (fast feedback)
python -m pytest tests/test_my_feature.py -v --tb=short
# or: npm test -- --testPathPattern=my_feature
# or: go test ./pkg/my_feature/... -v
# 2. Run the full test module/directory
python -m pytest tests/ -v --tb=short
# 3. Run the entire test suite (before committing)
python -m pytest --tb=short
# or: npm test
# or: go test ./...
| Scenario | Action |
|---|---|
| All pass ✅ | Proceed to diff review |
| Your tests fail | Fix the code, re-run |
| Pre-existing failures | Note them, don't fix (out of scope) |
| Flaky tests (pass/fail randomly) | Run 3x to confirm flakiness, note in PR |
| Tests you can't run (need env/infra) | Note in PR, explain what you tested manually |
Before committing, review every line of your diff.
# Overview of what changed
git diff --stat
# Full diff
git diff
# If already staged
git diff --cached
# Stage specific files (never use `git add .`)
git add path/to/modified_file.py
git add tests/test_new_feature.py
# Verify staged files
git diff --cached --stat
# Commit with conventional message
git commit -m "fix(module): short description of what was fixed
Longer explanation of why, if non-obvious.
Addresses #issue_number"
{type}({scope}): {concise description}
{body: what and why, not how}
{footer: issue refs, test results, breaking changes}
| Type | When |
|---|---|
fix | Bug fix |
feat | New feature |
refactor | Code restructure (no behavior change) |
test | Adding/fixing tests only |
docs | Documentation changes only |
chore | Build/tooling/dependency changes |