test-case-design
Apply systematic test case design techniques including equivalence partitioning, boundary value analysis, decision tables, and state transition testing.
SKILL.md
Full skill instructions
Test Case Design Techniques
When to Use This Skill
Use this skill when:
- Test Case Design tasks - Working on apply systematic test case design techniques including equivalence partitioning, boundary value analysis, decision tables, and state transition testing
- Planning or design - Need guidance on Test Case Design approaches
- Best practices - Want to follow established patterns and standards
Overview
Systematic test case design techniques ensure thorough coverage while minimizing test case count. These black-box techniques derive test cases from specifications without knowledge of internal implementation.
Equivalence Partitioning
Divide input data into equivalent classes where any value should produce the same behavior.
Process
- Identify input conditions
- Divide into valid and invalid partitions
- Select one representative value from each partition
- Create test cases for each partition
Example: Age Validation (18-65)
| Partition | Range | Representative | Expected |
|---|---|---|---|
| Invalid (below) | < 18 | 10 | Reject |
| Valid | 18-65 | 30 | Accept |
| Invalid (above) | > 65 | 70 | Reject |
Test Cases:
- TC1: age = 10 → Reject (invalid below)
- TC2: age = 30 → Accept (valid)
- TC3: age = 70 → Reject (invalid above)
Multiple Input Partitions
Combine partitions systematically:
Input A: {Valid, Invalid}
Input B: {Valid, Invalid}
Combinations:
1. A-Valid, B-Valid → Expected: Success
2. A-Valid, B-Invalid → Expected: Error for B
3. A-Invalid, B-Valid → Expected: Error for A
4. A-Invalid, B-Invalid → Expected: Error for both
Boundary Value Analysis
Test at and around partition boundaries where defects commonly occur.
Process
- Identify boundaries from equivalence partitions
- Test at minimum, just below, just above, and maximum
- Include special values (0, empty, null)
Example: Age Validation (18-65)
| Boundary | Test Values | Expected |
|---|---|---|
| Below minimum | 17 | Reject |
| At minimum | 18 | Accept |
| Above minimum | 19 | Accept |
| Normal | 40 | Accept |
| Below maximum | 64 | Accept |
| At maximum | 65 | Accept |
| Above maximum | 66 | Reject |
Extended Boundaries:
- 0 (edge case)
- -1 (negative)
- MAX_INT (overflow)
- null (missing)
.NET Example
public class AgeValidationTests
{
[Theory]
[InlineData(17, false)] // Below minimum
[InlineData(18, true)] // At minimum
[InlineData(19, true)] // Above minimum
[InlineData(40, true)] // Normal
[InlineData(64, true)] // Below maximum
[InlineData(65, true)] // At maximum
[InlineData(66, false)] // Above maximum
[InlineData(0, false)] // Zero
[InlineData(-1, false)] // Negative
public void ValidateAge_ReturnsExpected(int age, bool expected)
{
var result = _validator.IsValidAge(age);
Assert.Equal(expected, result);
}
}
Decision Table Testing
Test complex business rules with multiple conditions systematically.
Process
- Identify conditions (inputs)
- Identify actions (outputs)
- Create table with all condition combinations
- Simplify using "don't care" conditions
Example: Discount Calculation
Conditions:
- Is member? (Y/N)
- Order > $100? (Y/N)
- Has coupon? (Y/N)
Actions:
- Apply member discount (10%)
- Apply bulk discount (5%)
- Apply coupon discount (15%)
| Rule | Member | Order>$100 | Coupon | Member% | Bulk% | Coupon% |
|---|---|---|---|---|---|---|
| R1 | Y | Y | Y | X | X | X |
| R2 | Y | Y | N | X | X | - |
| R3 | Y | N | Y | X | - | X |
| R4 | Y | N | N | X | - | - |
| R5 | N | Y | Y | - | X | X |
| R6 | N | Y | N | - | X | - |
| R7 | N | N | Y | - | - | X |
| R8 | N | N | N | - | - | - |
.NET Example
public class DiscountCalculationTests
{
public static TheoryData<bool, decimal, bool, decimal> DiscountScenarios => new()
{
{ true, 150m, true, 0.30m }, // R1: Member + Bulk + Coupon
{ true, 150m, false, 0.15m }, // R2: Member + Bulk
{ true, 50m, true, 0.25m }, // R3: Member + Coupon
{ true, 50m, false, 0.10m }, // R4: Member only
{ false, 150m, true, 0.20m }, // R5: Bulk + Coupon
{ false, 150m, false, 0.05m }, // R6: Bulk only
{ false, 50m, true, 0.15m }, // R7: Coupon only
{ false, 50m, false, 0.00m }, // R8: No discount
};
[Theory]
[MemberData(nameof(DiscountScenarios))]
public void CalculateDiscount_ReturnsExpected(
bool isMember, decimal orderTotal, bool hasCoupon, decimal expectedDiscount)
{
var discount = _calculator.Calculate(isMember, orderTotal, hasCoupon);
Assert.Equal(expectedDiscount, discount);
}
}
State Transition Testing
Test systems with distinct states and transitions between them.
Process
- Identify states
- Identify valid transitions
- Create state transition table/diagram
- Design tests for each transition
- Include invalid transition tests
Example: Order State Machine
┌──────────┐
│ Draft │
└────┬─────┘
│ submit()
▼
┌──────────┐
┌────│ Pending │────┐
│ └────┬─────┘ │
│ │ approve()│ reject()
│ ▼ ▼
│ ┌──────────┐ ┌──────────┐
│ │ Approved │ │ Rejected │
│ └────┬─────┘ └──────────┘
│ │ ship()
│ ▼
│ ┌──────────┐
└────│ Shipped │
└────┬─────┘
│ deliver()
▼
┌──────────┐
│Delivered │
└──────────┘
State Transition Table
| Current State | Event | Next State | Valid |
|---|---|---|---|
| Draft | submit | Pending | ✓ |
| Draft | approve | - | ✗ |
| Pending | approve | Approved | ✓ |
| Pending | reject | Rejected | ✓ |
| Approved | ship | Shipped | ✓ |
| Shipped | deliver | Delivered | ✓ |
| Delivered | * | - | ✗ |
.NET Example
public class OrderStateTests
{
[Fact]
public void Draft_Submit_TransitionsToPending()
{
var order = new Order { Status = OrderStatus.Draft };
order.Submit();
Assert.Equal(OrderStatus.Pending, order.Status);
}
[Fact]
public void Draft_Approve_ThrowsInvalidStateException()
{
var order = new Order { Status = OrderStatus.Draft };
Assert.Throws<InvalidOperationException>(() => order.Approve());
}
[Fact]
public void Delivered_AnyAction_ThrowsFinalStateException()
{
var order = new Order { Status = OrderStatus.Delivered };
Assert.Throws<InvalidOperationException>(() => order.Cancel());
}
}
Pairwise Testing
Efficiently test combinations when full combinatorial testing is impractical.
Concept
Most defects are caused by interactions between 2 parameters. Testing all pairs covers most risks with fewer tests.
Example: Browser Compatibility
Parameters:
- Browser: Chrome, Firefox, Safari, Edge
- OS: Windows, macOS, Linux
- Version: Latest, Previous
Full combinations: 4 × 3 × 2 = 24 tests Pairwise coverage: 8-12 tests (covers all pairs)
Pairwise Test Set
| Test | Browser | OS | Version |
|---|---|---|---|
| 1 | Chrome | Windows | Latest |
| 2 | Firefox | macOS | Previous |
| 3 | Safari | macOS | Latest |
| 4 | Edge | Windows | Previous |
| 5 | Chrome | Linux | Previous |
| 6 | Firefox | Windows | Latest |
| 7 | Chrome | macOS | Latest |
| 8 | Edge | Linux | Latest |
Use tools like PICT, AllPairs, or online generators.
Error Guessing
Experience-based technique to identify likely defect areas.
Common Error Patterns
| Category | Examples |
|---|---|
| Null/Empty | null input, empty string, empty collection |
| Boundaries | off-by-one, overflow, underflow |
| Format | Invalid date, malformed email, wrong encoding |
| State | Race conditions, stale data, concurrency |
| Resources | Memory exhaustion, connection limits, timeouts |
| Security | SQL injection, XSS, path traversal |
Error Guessing Checklist
- What if input is null?
- What if input is empty?
- What if input contains special characters?
- What if input exceeds maximum length?
- What if concurrent requests occur?
- What if external service fails?
- What if database connection drops?
- What if input is negative?
- What if list has duplicates?
Technique Selection Guide
| Scenario | Recommended Technique |
|---|---|
| Range validation | Boundary Value + Equivalence |
| Complex business rules | Decision Table |
| State-dependent behavior | State Transition |
| Multi-parameter input | Pairwise |
| Error handling | Error Guessing |
| Critical calculations | All techniques combined |
Integration Points
Inputs from:
- Requirements → Test conditions
test-strategy-planningskill → Coverage targets
Outputs to:
acceptance-criteria-authoringskill → Scenario coverage- Test automation → Test data
