designing-tests
Knowledge and patterns for designing comprehensive test strategies and writing effective tests.
What this skill does
# Designing Tests Skill
This skill provides patterns and techniques for creating effective test suites.
## Testing Pyramid
```
/\
/ \ E2E (10%)
/----\
/ \ Integration (20%)
/--------\
/ \ Unit (70%)
/------------\
```
## Test Design Patterns
### 1. Arrange-Act-Assert (AAA)
```python
def test_user_registration():
# Arrange - Set up test data and dependencies
user_data = {"email": "[email protected]", "password": "secure123"}
# Act - Execute the code under test
result = register_user(user_data)
# Assert - Verify the outcome
assert result.success is True
assert result.user.email == "[email protected]"
```
### 2. Given-When-Then (BDD)
```python
def test_discount_for_premium_users():
# Given a premium user with items in cart
user = create_premium_user()
cart = create_cart(user, items=[item(price=100)])
# When calculating the total
total = cart.calculate_total()
# Then a 20% discount is applied
assert total == 80
```
### 3. Test Fixtures
```python
@pytest.fixture
def db_session():
"""Provide a clean database session for each test."""
session = create_session()
yield session
session.rollback()
session.close()
@pytest.fixture
def authenticated_user(db_session):
"""Provide an authenticated user."""
user = User.create(email="[email protected]")
db_session.add(user)
db_session.commit()
return user
```
### 4. Parameterized Tests
```python
@pytest.mark.parametrize("input,expected", [
("hello", "HELLO"),
("World", "WORLD"),
("", ""),
("123abc", "123ABC"),
])
def test_uppercase(input, expected):
assert uppercase(input) == expected
```
## Edge Cases Checklist
### Input Validation
- [ ] Empty/null inputs
- [ ] Boundary values (0, -1, MAX_INT)
- [ ] Invalid types
- [ ] Special characters
- [ ] Unicode strings
- [ ] Very long inputs
- [ ] Whitespace handling
### State Management
- [ ] Initial state
- [ ] After successful operation
- [ ] After failed operation
- [ ] Concurrent modifications
- [ ] Recovery from errors
### External Dependencies
- [ ] Network timeout
- [ ] Service unavailable
- [ ] Invalid response format
- [ ] Rate limiting
- [ ] Partial failures
### Time-Based
- [ ] Timezone handling
- [ ] Daylight saving transitions
- [ ] Leap years
- [ ] Date boundaries
## Mocking Strategies
### When to Mock
- External APIs
- Database calls (for unit tests)
- Time-dependent operations
- Random number generation
- File system operations
### When NOT to Mock
- The code under test
- Simple value objects
- Pure functions
- Internal implementation details
### Mock Examples
```python
# Mock external API
@patch('services.payment.stripe_client')
def test_payment_processing(mock_stripe):
mock_stripe.charge.return_value = {"id": "ch_123", "status": "succeeded"}
result = process_payment(amount=100)
assert result.success is True
# Mock time
@freeze_time("2024-01-15")
def test_subscription_expiry():
sub = Subscription(expires_at=datetime(2024, 1, 14))
assert sub.is_expired() is True
```
## Test Organization
### File Structure
```
tests/
├── unit/
│ ├── test_models.py
│ ├── test_services.py
│ └── test_utils.py
├── integration/
│ ├── test_api.py
│ └── test_database.py
├── e2e/
│ └── test_user_flows.py
├── fixtures/
│ └── conftest.py
└── factories/
└── user_factory.py
```
### Naming Conventions
```python
# Pattern: test_[action]_[condition]_[expected_result]
def test_login_with_valid_credentials_returns_token():
def test_login_with_invalid_password_returns_401():
def test_login_with_locked_account_raises_AccountLockedException():
```
## Coverage Guidelines
| Component | Target |
|-----------|--------|
| Business logic | 90%+ |
| Utilities | 85%+ |
| API endpoints | 80%+ |
| Configuration | 60%+ |
## Anti-Patterns to Avoid
- **Flaky tests** - Tests that sometimes pass, sometimes fail
- **Slow tests** - Unit tests should be < 100ms
- **Test interdependence** - Tests that rely on other tests
- **Over-mocking** - Mocking everything including the thing you're testing
- **Assert-less tests** - Tests without meaningful assertions
- **Duplicate tests** - Testing the same thing multiple ways
Related in Writing & Docs
jax-development
IncludedUse this skill when the user is writing, debugging, profiling, refactoring, reviewing, benchmarking, parallelising, exporting, or explaining JAX code, or when they mention JAX, jax.numpy, jit, grad, value_and_grad, vmap, scan, lax, random keys, pytrees, jax.Array, sharding, Mesh, PartitionSpec, NamedSharding, pmap, shard_map, Pallas, XLA, StableHLO, checkify, profiler, or the JAX repo. It helps turn NumPy or PyTorch-style code into pure functional JAX, fix tracer/control-flow/shape/PRNG bugs, remove recompiles and host-device syncs, choose transforms and sharding strategies, inspect jaxpr/lowering/IR, and benchmark compiled code correctly.
nature-article-writer
IncludedDrafts, rewrites, diagnostically critiques, and style-calibrates primary research manuscripts for Nature and Nature Portfolio journals. Use when the user wants a Nature-style title, summary paragraph or abstract, introduction, results, discussion, methods, figure legends, presubmission enquiry, cover letter, reviewer response, or when a scientific draft sounds generic, jargon-heavy, structurally weak, or AI-ish and needs precise, broad-reader-friendly prose without inventing data, analyses, or references. Best for primary research articles and letters rather than reviews or press releases unless explicitly adapting one.
deckrd
IncludedDocument-driven framework that derives requirements, specifications, implementation plans, and executable tasks from goals through structured AI dialogue. Use when user says "write requirements", "create spec", "plan implementation", "derive tasks", "structure this feature", "break down into tasks", or "document this module". Also use for reverse engineering existing code into docs (/deckrd rev). Do NOT use for direct code writing — use /deckrd-coder after tasks are generated. Do NOT use when the user only wants to run or fix existing code without planning.
clinical-decision-support
IncludedGenerate professional clinical decision support (CDS) documents for pharmaceutical and clinical research settings, including patient cohort analyses (biomarker-stratified with outcomes) and treatment recommendation reports (evidence-based guidelines with decision algorithms). Supports GRADE evidence grading, statistical analysis (hazard ratios, survival curves, waterfall plots), biomarker integration, and regulatory compliance. Outputs publication-ready LaTeX/PDF format optimized for drug development, clinical research, and evidence synthesis.
handling-sf-data
IncludedSalesforce data operations with 130-point scoring. Use this skill to create, update, delete, bulk import/export, generate test data, and clean up org records using sf CLI and anonymous Apex. TRIGGER when: user creates test data, performs bulk import/export, uses sf data CLI commands, needs data factory patterns for Apex tests, or needs to seed/clean records in a Salesforce org. DO NOT TRIGGER when: SOQL query writing only (use querying-soql), Apex test execution (use running-apex-tests), or metadata deployment (use deploying-metadata).
accelint-ac-to-playwright
IncludedConvert and validate acceptance criteria for Playwright test automation. Use when user asks to (1) review/evaluate/check if AC are ready for automation, (2) assess if AC can be converted as-is, (3) validate AC quality for Playwright, (4) turn AC into tests, (5) generate tests from acceptance criteria, (6) convert .md bullets or .feature Gherkin files to Playwright specs, (7) create test automation from requirements. Handles both bullet-style markdown and Gherkin syntax with JSON test plan generation and validation.