Harness Testing Skill
Specialized testing skill for the autonomous harness system. Runs comprehensive tests and reports results to Archon for tracking.
Triggers
Use this skill when:
- Verifying features in harness workflow
- Running comprehensive test suites
- Performing E2E browser testing
- Validating code changes
- Keywords: harness test, verify feature, run tests, test suite, e2e testing, browser testing, validation
Core Mission
Provide thorough testing and verification of features:
- Run test suites - Unit, integration, and E2E tests
- Browser automation - Test UI features via Playwright MCP
- Report results - Update Archon tasks with test status
- Identify issues - Document any failures clearly
Testing Modes
Mode 1: Verify Specific Feature
Test a specific feature by task ID.
Mode 2: Run Full Test Suite
Run all tests in the project.
Mode 3: Health Check
Quick validation that the project builds and basic tests pass.
Mode 4: E2E Browser Testing
UI testing with browser automation.
Testing Protocol
STEP 1: Determine Test Scope
Identify:
- Target: Specific feature or full suite?
- Task ID: Which Archon task to update?
- Test Type: Unit, integration, E2E, or all?
STEP 2: Read Harness Configuration
cat .harness/config.json
# Get project configuration
config = find_documents(
project_id=PROJECT_ID,
document_type="guide",
query="Harness Configuration"
)
testing_strategy = config["content"]["testing_strategy"]
# Could be: "unit", "unit+integration", "full-e2e", "manual"
STEP 3: Run Appropriate Tests
Unit Tests
# Node.js / TypeScript
npm test -- --coverage
# Python
pytest tests/unit/ -v --cov
# Go
go test ./... -v -cover
# Rust
cargo test --lib
# .NET
dotnet test --filter Category=Unit
Integration Tests
# Node.js
npm run test:integration
# Python
pytest tests/integration/ -v
# Or with specific database/services
docker-compose up -d test-db
npm run test:integration
docker-compose down
E2E Browser Tests
For web applications, use Playwright MCP for browser automation:
# Using Playwright MCP
mcp__playwright__browser_navigate(url="http://localhost:3000")
mcp__playwright__browser_snapshot()
# Test user flow
mcp__playwright__browser_type(
element="Email input",
ref="input[name='email']",
text="test@example.com"
)
mcp__playwright__browser_type(
element="Password input",
ref="input[name='password']",
text="testpassword123"
)
mcp__playwright__browser_click(
element="Login button",
ref="button[type='submit']"
)
mcp__playwright__browser_wait_for(text="Dashboard")
# Verify result
snapshot = mcp__playwright__browser_snapshot()
# Check for expected elements
STEP 4: Collect and Analyze Results
Parse test output to determine:
- Total tests run
- Tests passed
- Tests failed
- Test coverage (if available)
- Specific failure messages
STEP 5: Report Results to Archon
# Update task with test results
manage_task("update",
task_id="<TASK_ID>",
description=f"""[ORIGINAL_DESCRIPTION]
---
## Test Results (Verified by harness-tester)
**Timestamp**: {timestamp}
**Status**: {"PASSING" if all_passed else "FAILING"}
### Summary
| Type | Passed | Failed | Total |
|------|--------|--------|-------|
| Unit | {unit_passed} | {unit_failed} | {unit_total} |
| Integration | {int_passed} | {int_failed} | {int_total} |
| E2E | {e2e_passed} | {e2e_failed} | {e2e_total} |
### Coverage
- Statements: {stmt_coverage}%
- Branches: {branch_coverage}%
- Functions: {func_coverage}%
{"### Failures" if failures else ""}
{failure_details if failures else ""}
### Verification
- [x] Unit tests executed
- [x] Integration tests executed
- [x] E2E tests executed
- [x] Results logged to Archon
"""
)
STEP 6: Update Session Notes (if significant)
Only update session notes for failures or important findings:
if failures:
notes = find_documents(project_id=PROJECT_ID, query="Session Notes")
# Add test failure note
manage_document("update",
project_id=PROJECT_ID,
document_id=notes["id"],
content={
...notes["content"],
"blockers": notes["content"]["blockers"] + [
{
"type": "test_failure",
"task_id": TASK_ID,
"feature": FEATURE_NAME,
"details": failure_summary,
"timestamp": timestamp
}
]
}
)
Test Patterns by Project Type
Web Application (React/Vue/Next.js)
// Unit test pattern
describe('Component', () => {
it('should render correctly', () => {
render(<Component />);
expect(screen.getByText('Expected')).toBeInTheDocument();
});
});
// Integration test pattern
describe('API Integration', () => {
it('should fetch data', async () => {
const response = await api.getData();
expect(response.status).toBe(200);
});
});
# Run commands
npm test # Unit tests
npm run test:integration # Integration
npx playwright test # E2E
Python API (FastAPI/Flask)
# Unit test pattern
def test_service_function():
result = service.process(input_data)
assert result == expected
# Integration test pattern
def test_api_endpoint(client):
response = client.post("/api/endpoint", json=data)
assert response.status_code == 200
# Run commands
pytest tests/unit/ -v
pytest tests/integration/ -v
pytest tests/e2e/ -v
CLI Application
# Test CLI commands
./mycli --help | grep "Usage"
./mycli process input.txt | diff - expected_output.txt
echo $? # Should be 0
Output Format
Success Output
## Tests Passed
**Feature**: [FEATURE_NAME]
**Task**: [TASK_ID]
### Results
| Type | Status | Count |
|------|--------|-------|
| Unit | Pass | 15/15 |
| Integration | Pass | 8/8 |
| E2E | Pass | 3/3 |
### Coverage
- Statements: 87%
- Branches: 72%
- Functions: 91%
**Archon Updated**: Yes
Failure Output
## Tests Failed
**Feature**: [FEATURE_NAME]
**Task**: [TASK_ID]
### Results
| Type | Status | Count |
|------|--------|-------|
| Unit | Pass | 14/15 |
| Integration | Fail | 6/8 |
| E2E | Skip | 0/3 |
### Failures
#### Integration Test: `test_user_creation`
AssertionError: Expected status 201, got 400 at tests/integration/user.test.ts:45
Possible causes:
- Validation logic changed
- Database constraint not met
- Missing required field
### Recommended Actions
1. Check validation rules in `src/services/user.ts`
2. Verify database schema matches model
3. Review request payload structure
**Archon Updated**: Yes (marked as failing)
Browser Testing Guidelines
When running E2E browser tests:
Do:
- Test as a real user would (clicks, typing)
- Take snapshots at key verification points
- Wait for elements before interacting
- Test error states and edge cases
- Verify both functionality AND appearance
Don't:
- Use JavaScript evaluation to bypass UI
- Skip visual verification
- Test only happy paths
- Assume elements are immediately available
- Ignore console errors
Common Browser Test Patterns
# Login flow test
async def test_login():
await navigate("http://localhost:3000/login")
await fill("input[name='email']", "user@test.com")
await fill("input[name='password']", "password123")
await click("button[type='submit']")
await wait_for_text("Dashboard")
snapshot = await take_snapshot()
assert "Welcome" in snapshot
return {"passed": True}
# Form validation test
async def test_form_validation():
await navigate("http://localhost:3000/signup")
await click("button[type='submit']") # Submit empty form
await wait_for_text("Email is required")
snapshot = await take_snapshot()
assert "Email is required" in snapshot
assert "Password is required" in snapshot
return {"passed": True}
Critical Rules
- NEVER modify tests to make them pass - Fix code, not tests
- ALWAYS report results to Archon - Even if tests pass
- ALWAYS include failure details - Specific error messages
- RUN ALL relevant test types - Based on configuration
- DOCUMENT flaky tests - Note if a test is intermittent
- BLOCK on failures - Don't allow completion without passing tests
扫码联系在线客服