techprotrade's picture
Deploy ATOM FastAPI command center runtime (part 7)
cc036ff verified
|
Raw
History Blame Contribute Delete
15.8 kB
# Bug Discovery Test Templates
Templates for consistent, high-quality bug discovery tests that comply with `TEST_QUALITY_STANDARDS.md` (TQ-01 through TQ-05).
## Overview
**Purpose:** Ensure consistent test quality and documentation across all bug discovery tests by providing standardized templates that enforce test quality standards.
**What are bug discovery tests?**
Automated tests that discover bugs through:
- **Fuzzing:** Coverage-guided crash discovery with Atheris
- **Chaos Engineering:** Failure injection with blast radius controls
- **Property-Based Testing:** Invariant validation with Hypothesis
- **Browser Discovery:** Console errors, accessibility violations, broken links
**Why use templates?**
- **Consistency:** All tests follow same structure and quality standards
- **TQ Compliance:** Templates enforce TQ-01 through TQ-05 automatically
- **Speed:** Copy template, fill placeholders, write test faster
- **Documentation:** Built-in documentation for each test type
## Template Structure
All templates include these sections:
1. **Purpose** - What the test validates (bug type, target, expected findings)
2. **Dependencies** - Required libraries, fixtures, target modules
3. **Setup** - Environment setup instructions (install, configure, verify)
4. **Test Procedure** - Step-by-step implementation with code examples
5. **Expected Behavior** - What constitutes a bug/finding
6. **Bug Filing** - How to file bugs using `BugFilingService` with metadata
7. **TQ Compliance** - How the test meets TQ-01 through TQ-05 standards
**Additional sections (template-specific):**
- **Invariant** (PROPERTY) - Document invariant before writing test
- **Blast Radius Controls** (CHAOS) - Isolation mechanisms for safety
- **pytest.ini Marker** - Pytest markers for CI/CD integration
## Template Usage
### Step 1: Choose the Right Template
| Bug Type | Template | Key Features |
|----------|----------|--------------|
| Input validation bugs | `FUZZING_TEMPLATE.md` | Atheris, coverage-guided, crash detection |
| Resilience failures | `CHAOS_TEMPLATE.md` | Failure injection, blast radius controls |
| Invariant violations | `PROPERTY_TEMPLATE.md` | Hypothesis, counterexample shrinking |
| UI bugs | `BROWSER_TEMPLATE.md` | Playwright, console/a11y/link checks |
**How to choose:**
- **Fuzzing:** "I want to crash this function with random input"
- **Chaos:** "I want to test if system survives database drops"
- **Property:** "I want to verify this invariant holds for all inputs"
- **Browser:** "I want to find console errors on this page"
### Step 2: Copy Template to Test File
```bash
# Copy template
cd backend/tests/bug_discovery
cp TEMPLATES/FUZZING_TEMPLATE.md test_[target]_fuzzing.md
# Or create test file from template
cat TEMPLATES/FUZZING_TEMPLATE.md | sed 's/\[target\]/[actual_target]/g' > test_[actual_target]_fuzzing.py
```
### Step 3: Fill in Placeholders
Replace `[bracketed placeholders]` with your specific test details:
**Template:**
```markdown
# Fuzzing Test: [Target Module/Function]
## Purpose
Fuzz [target function] to discover [vulnerability type]
## Dependencies
- Target: `backend/api/[routes].py`
```
**Filled:**
```markdown
# Fuzzing Test: Agent Execution
## Purpose
Fuzz `execute_agent()` to discover input validation bugs in agent execution
## Dependencies
- Target: `backend/api/agent_routes.py`
```
### Step 4: Document Invariants (Property Tests Only)
**CRITICAL:** For property-based tests, document invariant BEFORE writing test.
```python
# BAD: Write test first, no invariant documented
def test_workflow_serialization():
workflow = Workflow(steps=[...])
# ... test code
# GOOD: Document invariant first
"""
Invariant: Workflow serialization is lossless for all step lists.
Property:
- For any list of workflow steps, serializing and deserializing
produces an equivalent workflow with the same steps.
"""
def test_workflow_serialization_roundtrip(steps):
# ... test code
```
### Step 5: Verify TQ Compliance Checklist
Before committing test, verify TQ compliance:
- [ ] **TQ-01 (Independence):** Uses isolated fixtures (db_session, authenticated_page)
- [ ] **TQ-02 (Pass Rate):** Deterministic inputs, no flaky tests
- [ ] **TQ-03 (Performance):** Timeout settings (<30s per test)
- [ ] **TQ-04 (Determinism):** Same input = same output
- [ ] **TQ-05 (Coverage Quality):** Tests behavior, not implementation
### Step 6: Run Test and Verify Bug Filing
```bash
# Run test
pytest backend/tests/bug_discovery/test_[target]_fuzzing.py -v
# Verify bug filing integration (if test discovers bug)
# Check GitHub issues for new bug filed by BugFilingService
gh issue list --label "automated,test-type:fuzzing"
```
## TQ Compliance Mapping
Templates enforce `TEST_QUALITY_STANDARDS.md` requirements:
| TQ Standard | Template Enforcement |
|-------------|---------------------|
| **TQ-01: Independence** | Isolated fixtures (db_session, authenticated_page) |
| **TQ-02: 98% Pass Rate** | Deterministic inputs, no flaky markers, reproducible examples |
| **TQ-03: <30s per test** | Timeout fixtures, Hypothesis deadline settings, Playwright default |
| **TQ-04: Determinism** | Same input = same output, frozen time, fixed seeds |
| **TQ-05: Coverage Quality** | Test behavior (crashes, resilience, invariants), not implementation |
**How templates enforce TQ standards:**
**TQ-01 (Test Independence):**
- All templates require isolated fixtures (db_session, authenticated_page)
- Each test creates/cleans up own data
- No shared state between tests
**TQ-02 (Pass Rate):**
- Fuzzing: Crashes are reproducible with same input
- Chaos: Same failure injection produces same behavior
- Property: Same input produces same output (deterministic function)
- Browser: Same page produces same console output
**TQ-03 (Performance):**
- Fuzzing: 300s timeout for fuzzing campaigns
- Chaos: 60s timeout for failure injection
- Property: Hypothesis deadline (30s default, 5s CI profile)
- Browser: 30s per-test timeout (Playwright default)
**TQ-04 (Determinism):**
- Fuzzing: Same crash input produces same crash
- Chaos: Toxiproxy provides deterministic network conditions
- Property: Hypothesis uses fixed seed (reproducible examples)
- Browser: API-first auth (deterministic JWT tokens)
**TQ-05 (Coverage Quality):**
- Fuzzing: Tests crashes (observable behavior), not parsing code
- Chaos: Tests resilience (observable degradation), not error handling
- Property: Tests invariant (observable property), not implementation
- Browser: Tests user-facing bugs (console, a11y, links)
## Template Selection Guide
### Fuzzing Template (`FUZZING_TEMPLATE.md`)
**When to use:**
- Testing input validation (parsers, deserializers, API endpoints)
- Looking for memory safety bugs (buffer overflows, null pointer dereferences)
- Testing with random byte arrays, strings, JSON
**Examples:**
- Fuzz agent execution endpoint with malformed JSON
- Fuzz workflow deserialization with invalid step data
- Fuzz canvas presentation with corrupted canvas state
**Key features:**
- Atheris coverage-guided fuzzing
- Crash detection (segfaults, assertions, timeouts)
- Corpus management for interesting inputs
### Chaos Template (`CHAOS_TEMPLATE.md`)
**When to use:**
- Testing resilience to failures (network latency, database drops)
- Validating graceful degradation (error handling, retry logic)
- Testing recovery behavior (automatic recovery, data integrity)
**Examples:**
- Inject 2000ms network latency to database
- Drop database connections for 10 seconds
- Allocate 500MB memory for 30 seconds
**Key features:**
- Toxiproxy for network chaos
- Blast radius controls (isolated test database)
- Safety checks (never production)
### Property Template (`PROPERTY_TEMPLATE.md`)
**When to use:**
- Testing invariants (properties that must hold for all inputs)
- Testing stateless logic (serializers, transformers, validators)
- Looking for edge cases with automatic test generation
**Examples:**
- Workflow serialization is lossless for all step lists
- Agent execution is idempotent for all agent IDs
- JSON round-trip preserves data for all valid objects
**Key features:**
- Hypothesis automatic test generation (100+ examples)
- Counterexample shrinking (minimal failing case)
- Invariant-first thinking (document before writing test)
### Browser Template (`BROWSER_TEMPLATE.md`)
**When to use:**
- Testing for console errors (JavaScript errors, unhandled rejections)
- Testing accessibility (WCAG 2.1 AA violations)
- Testing for broken links (404 responses, 5xx errors)
**Examples:**
- Discover console errors on agent dashboard
- Check WCAG violations on workflow editor
- Find broken links on canvas presentation page
**Key features:**
- Playwright browser automation
- API-first authentication (10-100x faster than UI login)
- Axe-core for accessibility checking
## Pytest Markers
Templates reference pytest.ini markers for CI/CD integration:
```ini
# backend/pytest.ini
[pytest]
markers =
fuzzing: Fuzzing tests (Atheris, slow, may crash)
chaos: Chaos engineering tests (failure injection, isolated environment, slow)
property: Property-based tests (Hypothesis, slow, thorough)
browser: Browser bug discovery tests (Playwright, slow, console/a11y/link checks)
visual: Visual regression tests (Percy, screenshots, slow)
slow: Slow tests (>10s, skip in fast CI)
```
**Run specific test types:**
```bash
# Only fuzzing tests
pytest backend/tests/bug_discovery/ -v -m fuzzing
# Only chaos tests
pytest backend/tests/bug_discovery/ -v -m chaos
# Only property tests
pytest backend/tests/property_tests/ -v -m property
# Only browser tests
pytest backend/tests/browser_discovery/ -v -m browser
```
**Skip slow tests in fast CI:**
```bash
# Fast PR tests (<10 minutes)
pytest backend/tests/ -v -m "not slow"
# Weekly bug discovery (~2 hours)
pytest backend/tests/bug_discovery/ -v -m "slow"
```
## Bug Filing Integration
All templates include `BugFilingService` integration for automated bug filing:
```python
from tests.bug_discovery.bug_filing_service import BugFilingService
BugFilingService.file_bug(
test_name="test_[target]_fuzzing",
error_message="Crash discovered by fuzzing",
metadata={
"test_type": "fuzzing",
"target_function": "[function_name]",
"crash_input": crash_data.hex()
}
)
```
**Automatic bug filing:**
- Fuzzing: On crash (segfault, assertion failure, timeout)
- Chaos: On resilience failure (crash, data loss, no recovery)
- Property: On invariant violation (counterexample found)
- Browser: On discovery (console errors, a11y violations, broken links)
**Bug metadata:**
- Test type (fuzzing, chaos, property, browser)
- Target (function, service, page)
- Discovery details (crash input, failure scenario, counterexample)
- Screenshot (for browser tests)
- Logs/stack traces
## CI/CD Integration
### Fast Pipeline (Pull Requests)
Run fast tests only (<10 minutes):
```yaml
# .github/workflows/test-pr.yml
- name: Run fast tests
run: |
pytest backend/tests/ -v -m "not slow" --tb=short
```
**Excludes:**
- Fuzzing tests (slow, 300s timeout)
- Chaos tests (slow, failure injection)
- Property tests (slow, 200 examples)
- Browser tests (slow, 30s per page)
### Weekly Bug Discovery Pipeline
Run comprehensive bug discovery (~2 hours):
```yaml
# .github/workflows/bug-discovery.yml
on:
schedule:
- cron: '0 0 * * 0' # Weekly: Sunday midnight
- name: Run fuzzing tests
run: pytest backend/tests/bug_discovery/ -v -m fuzzing
- name: Run chaos tests
run: pytest backend/tests/bug_discovery/ -v -m chaos
- name: Run property tests
run: pytest backend/tests/property_tests/ -v -m property
- name: Run browser tests
run: pytest backend/tests/browser_discovery/ -v -m browser
```
**Includes:**
- All bug discovery tests
- Automated bug filing to GitHub
- Result aggregation and triage
## Best Practices
### 1. Invariant-First Thinking (Property Tests)
**Document invariant BEFORE writing test:**
```python
# BAD: Write test first, no invariant
def test_workflow_serialization():
# ... test code
# GOOD: Document invariant first
"""
Invariant: Workflow serialization is lossless.
Property: For any workflow, serialize(deserialize(w)) == w
"""
def test_workflow_serialization_roundtrip(workflow):
# ... test code
```
### 2. Blast Radius Controls (Chaos Tests)
**Never run chaos tests against production:**
```python
def assert_blast_radius():
"""Ensure failure is scoped to test environment only."""
db_url = os.getenv("DATABASE_URL")
assert "test" in db_url, f"Unsafe: {db_url}"
```
### 3. API-First Authentication (Browser Tests)
**Use API-first auth (10-100x faster than UI login):**
```python
# GOOD: API-first auth (fast, 0.1-0.5s)
authenticated_page = create_authenticated_page()
authenticated_page.goto("/dashboard")
# BAD: UI login (slow, 10-30s)
page.goto("/login")
page.fill("input[name='email']", "test@example.com")
page.click("button[type='submit']")
```
### 4. Corpus Management (Fuzzing Tests)
**Save interesting inputs to corpus:**
```bash
# Create corpus directory
mkdir -p backend/tests/bug_discovery/corpus/[target_name]
# Run fuzzing with corpus
pytest backend/tests/bug_discovery/test_[target]_fuzzing.py -v \
--fuzzing-corpus=backend/tests/bug_discovery/corpus/[target_name]
```
### 5. Timeout Settings
**Set appropriate timeouts per test type:**
- Fuzzing: 300s (5 minutes) for coverage-guided fuzzing
- Chaos: 60s (1 minute) for failure injection
- Property: 30s (default) or 5s (CI profile)
- Browser: 30s (Playwright default)
## See Also
### Documentation
- **`backend/docs/TEST_QUALITY_STANDARDS.md`** - Full TQ-01 through TQ-05 requirements
- **`backend/tests/e2e_ui/README.md`** - E2E test infrastructure guide
- **`backend/tests/bug_discovery/bug_filing_service.py`** - Automated bug filing
### Templates
- **`FUZZING_TEMPLATE.md`** - Atheris fuzzing test template
- **`CHAOS_TEMPLATE.md`** - Chaos engineering test template
- **`PROPERTY_TEMPLATE.md`** - Hypothesis property test template
- **`BROWSER_TEMPLATE.md`** - Playwright browser discovery template
### External Resources
- **[Atheris Documentation](https://github.com/google/atheris)** - Coverage-guided fuzzing for Python
- **[Hypothesis Documentation](https://hypothesis.readthedocs.io)** - Property-based testing
- **[Toxiproxy Python](https://github.com/ihucos/toxiproxy-python)** - Network chaos testing
- **[Playwright Documentation](https://playwright.dev/python/)** - Browser automation
- **[Axe-Core Documentation](https://www.deque.com/axe/)** - Accessibility testing
## Contributing
**Adding new templates:**
1. Create new template in `TEMPLATES/` directory
2. Follow standard structure (Purpose, Dependencies, Setup, Test Procedure, Expected Behavior, Bug Filing, TQ Compliance)
3. Enforce TQ-01 through TQ-05 standards
4. Add pytest.ini marker reference
5. Update this README with template description
**Template checklist:**
- [ ] All 7 required sections present
- [ ] TQ-01 through TQ-05 compliance documented
- [ ] Pytest marker referenced
- [ ] Code examples provided
- [ ] Bug filing integration included
- [ ] 80+ lines for test templates, 50+ lines for README
---
**Version:** 1.0
**Last Updated:** 2026-03-24
**Maintainer:** Atom QA Team