Module 5 Session 5.1 Test Case Design Foundations

Test Case Design Foundations

Review design heuristics that keep test suites focused yet comprehensive — ISTQB Foundation Level §4 | Chowdhury Chapter 4 & 9

Learning Objectives
  • Explain why well-designed test cases are the prerequisite for an efficient, manageable test suite.
  • Identify and apply the key attributes that make a test case focused and unambiguous.
  • Describe the three heuristic families: black-box, white-box, and experience-based.
  • Apply Equivalence Partitioning, Boundary Value Analysis, Decision Tables, and State Transition heuristics to design representative test cases.
  • Apply statement, branch, and path coverage criteria as white-box design heuristics.
  • Recognise and avoid common test case design anti-patterns that cause suite bloat and redundancy.

Why Test Case Design Matters

Before a test suite can be minimized, prioritized, or selected (all topics of Module 5), its individual test cases must be well designed. A poorly designed test suite will:

Explode in size
Redundant cases are added because earlier ones were not clearly scoped, leading to uncontrolled growth.
Miss defects
Random or intuition-driven cases cluster around happy paths, leaving boundary conditions and error paths untested.
Resist maintenance
Ambiguous expected results make it unclear whether a test failure is a product defect or an outdated expectation.
Slow regression cycles
Duplicate cases consume execution time repeatedly without adding coverage value.
The foundational insight: The quality of a test suite is determined at design time. Minimization and prioritization can only work with the material they are given. Good design heuristics are the upstream control that keeps suites lean, comprehensive, and maintainable from the outset.
Module 5 roadmap:
SessionTopicRelationship to Design
5.1 (this session)Test Case Design FoundationsUpstream: prevent bloat and gaps at creation time
5.2Why Test Suites GrowDiagnose: identify what causes suites to expand
5.3Test Suite MinimizationRepair: remove redundancy after the fact
5.4Benefits of MinimizationJustify: quantify the gains
5.5 – 5.7Prioritization & MetricsOptimise: order execution for maximum early defect detection

Anatomy of a Well-Formed Test Case

A test case is a documented specification of a single executable test scenario. Each attribute has a precise purpose in keeping the suite focused and unambiguous:

Test Case ID Unique identifier. Enables unambiguous reference in bug reports, selection decisions, and traceability matrices. Format: <MODULE>-<NUMBER> e.g. AUTH-042.
Test Objective One sentence stating what property or behaviour is under test. Prevents scope creep — a case that checks more than one objective should be split.
Preconditions System state and data that must hold before the test executes. Flaky tests are almost always caused by missing or under-specified preconditions.
Test Steps Ordered, deterministic sequence of actions. Each step must be executable by a person or automation framework with no ambiguity.
Test Data Exact input values. Vague data (e.g., "enter a valid name") introduces variability and makes results non-reproducible.
Expected Result Precise, verifiable outcome for each step. "System should work correctly" is not a valid expected result. "Login page redirects to dashboard; session cookie auth_token is set with HttpOnly flag" is.
Postconditions System state after execution. Required for test isolation — especially database-backed tests that must restore state for the next case.
Traceability Link Reference to the requirement, user story, or risk item the test covers. Without this, impact analysis for regression selection is impossible.
Example: Well-formed vs poorly-formed test case
AttributePoorly FormedWell Formed
ObjectiveTest loginVerify that a registered user with correct credentials is authenticated and redirected to the dashboard
Test DataValid username and passwordusername: alice@test.com, password: P@ssw0rd!
Expected ResultLogin should succeedHTTP 200; redirect to /dashboard; auth_token cookie set; user name "Alice" displayed in header
Traceability(none)REQ-AUTH-001, US-12

The Focused vs. Comprehensive Tension

Good test case design must simultaneously satisfy two goals that can pull in opposite directions:

Focused
  • Each case tests exactly one aspect of behaviour.
  • Minimal overlap with other cases in the suite.
  • Fast to execute; easy to diagnose when it fails.
  • Reduces redundancy and keeps the suite small.
Comprehensive
  • Together, cases cover all significant input partitions.
  • Boundary values and error paths are explicitly represented.
  • Every requirement and risk item has at least one trace.
  • No major defect type escapes the suite entirely.
Resolution: Design heuristics are the tool that achieves both goals simultaneously. They give us a systematic method to identify the minimum representative set of inputs and conditions that exercises all meaningful behaviour — without enumerating every possible input (exhaustive testing is infeasible). The heuristics below are the practical resolution of the focused–comprehensive tension.

Heuristic Families Overview

Test case design heuristics fall into three families, each exploiting different knowledge about the system under test:

FamilyKnowledge SourceKey HeuristicsWhen to Apply
Black-Box
(Specification-based)
Requirements, user stories, specs — no access to source code needed Equivalence Partitioning, Boundary Value Analysis, Decision Tables, State Transition, Use Case Testing Always; the primary design approach at all test levels
White-Box
(Structure-based)
Source code, control flow, data flow — requires code visibility Statement Coverage, Branch Coverage, Path Coverage, Condition Coverage, MC/DC Unit and component testing; when coverage gaps in black-box cases must be closed
Experience-Based Tester expertise, defect history, domain knowledge Error Guessing, Exploratory Testing, Checklist-Based Testing Supplement formal heuristics; fill gaps that spec and code analysis miss
Relationship between families: Black-box heuristics drive the initial case set. White-box heuristics then reveal any structural paths not covered by the black-box cases. Experience-based heuristics fill defect-history-informed gaps. Together they provide overlapping but non-redundant coverage.

Black-Box Design Heuristics

1. Equivalence Partitioning (EP)

Principle: Divide the input domain into equivalence classes — groups of values that are expected to be processed identically by the system. One representative from each class is sufficient. Testing more values from the same class adds no information.

Heuristic rule: For each input variable or combination of variables, identify:

  • Valid partitions — values the system should accept and process correctly.
  • Invalid partitions — values the system should reject with an appropriate error.

Suite discipline: Select exactly one representative from each partition. If you find yourself selecting two values from the same class "just to be safe", you are adding redundancy, not coverage.

Example: Age field for a cinema booking system
PartitionRangeTypeRepresentative Value
Child1 – 12Valid8
Teen13 – 17Valid15
Adult18 – 64Valid35
Senior65 – 120Valid70
Zero / Negative≤ 0Invalid0, −5
Exceeds maximum≥ 121Invalid150
Non-integerDecimal, stringInvalid17.5, "abc"

Result: 7 partitions → 7 test cases cover the entire age domain. Without EP, a tester might write 50 cases testing age 1, 2, 3… providing no additional defect-finding value.

2. Boundary Value Analysis (BVA)

Principle: Defects cluster at boundaries between partitions — the classic "off-by-one" error. BVA supplements EP by adding test cases at the exact boundary and just beyond it on each side.

Heuristic rule: For each boundary between a valid and invalid partition, test:

  • On-point: The exact boundary value itself.
  • Off-point (just inside): One step inside the valid range.
  • Off-point (just outside): One step outside the valid range (into invalid territory).
Example: Password length (6–20 characters)
BVA PointValueExpected ResultWhy
Just below lower bound5 charsReject: too shortOff-point (invalid side)
Lower bound6 charsAcceptOn-point (minimum valid)
Just above lower bound7 charsAcceptOff-point (valid side)
Just below upper bound19 charsAcceptOff-point (valid side)
Upper bound20 charsAcceptOn-point (maximum valid)
Just above upper bound21 charsReject: too longOff-point (invalid side)

Focused design discipline: BVA gives 6 targeted cases for this field. These 6 cases replace dozens of arbitrary length-test cases that would add no additional defect-finding value.

3. Decision Table Testing

Principle: When system behaviour depends on combinations of conditions, a decision table systematically enumerates all relevant combinations — preventing the common error of testing only one condition at a time.

Heuristic rule: List all conditions (Boolean inputs). Create one column per significant combination. Assign actions (expected results) to each combination. This gives the minimum set of cases to cover all decision logic.

Example: Loan approval system

Conditions: (C1) Credit score ≥ 700? (C2) Income sufficient? (C3) Existing debt < 30%?

TC-1TC-2TC-3TC-4TC-5
C1: Credit ≥ 700YYYNN
C2: Income sufficientYYNYN
C3: Debt < 30%YNYYN
Action: ApproveYesNoNoNoNo
Action: Refer to officerNoYesYesYesNo
Action: RejectNoNoNoNoYes

Suite benefit: Without a decision table, a tester might write 3 cases (one per condition) and miss the critical combination interactions. The table guarantees combinatorial completeness with 5 focused cases.

4. State Transition Testing

Principle: For systems with state (e.g., login sessions, order workflows, device modes), defects often occur at transitions between states, especially invalid transitions. Design test cases to cover both valid and invalid transitions.

Heuristic rule: Build a State Transition Diagram (or table). Coverage criteria:

  • 0-switch coverage: Cover every valid state at least once.
  • 1-switch coverage: Cover every valid transition (state + event → state) at least once.
  • Invalid transition testing: Attempt transitions that should be rejected (e.g., paying for an already-cancelled order).
Example: Online order state machine
Current StateEventNext StateTest Case
CreatedPayPaidTC-ORD-01: Create order → pay → verify state is "Paid"
CreatedCancelCancelledTC-ORD-02: Create order → cancel → verify state is "Cancelled"
PaidShipShippedTC-ORD-03: Paid order → ship → verify state is "Shipped"
ShippedDeliverDeliveredTC-ORD-04: Shipped order → deliver → verify state is "Delivered"
CancelledPay— (invalid)TC-ORD-05: Cancelled order → attempt pay → verify error "Cannot pay cancelled order"
DeliveredShip— (invalid)TC-ORD-06: Delivered order → attempt ship → verify error "Order already delivered"

White-Box Design Heuristics

White-box heuristics use the source code structure to identify test cases that exercise code paths not covered by specification-based techniques. They are primarily used at unit and component test level.

Statement Coverage (SC)

Criterion: Every executable statement must be executed by at least one test case.

Design heuristic: After writing black-box cases, run coverage analysis. For each uncovered statement, ask: what input is required to reach this statement? Add a targeted case.

Coverage gap example:
def process_payment(amount, method): if amount <= 0: raise ValueError("Amount must be positive") # uncovered if all black-box cases use amount > 0 if method == "crypto": return crypto_gateway(amount) # uncovered if black-box cases only used card/bank return standard_gateway(amount, method)

SC-driven additions: TC-PAY-ERR-01 (amount=0) and TC-PAY-CRYPTO-01 (method="crypto") close the gaps identified by coverage analysis.

Branch Coverage (BC)

Criterion: Every decision point (if/else, switch, loop condition) must be exercised with both the true and false outcome at least once. BC subsumes SC (100% BC implies 100% SC).

Design heuristic: For every if statement, ensure you have one test where the condition evaluates true AND one where it evaluates false. For loops, test: zero iterations, one iteration, multiple iterations.

Loop boundary testing (white-box BVA):
Loop ScenarioWhy it matters
0 iterations (loop not entered)Tests initialisation and skip logic; common source of defects
1 iterationTests the loop body executes once; catches off-by-one on first pass
Typical n iterationsTests normal execution behaviour
Maximum iterationsTests upper bound and termination condition; catches infinite-loop risks
Path Coverage (PC) & MC/DC

Path Coverage: Every possible path through the control flow graph is executed. Provides the strongest structural guarantee but is often impractical (the number of paths grows exponentially with nested conditions).

Modified Condition/Decision Coverage (MC/DC): A practical alternative used in safety-critical systems (DO-178C, IEC 61508). Each condition in a compound decision must independently affect the outcome. Stronger than branch coverage, far more practical than full path coverage.

MC/DC example: Condition: (A and B) or C
TestABCResultPurpose
T1TTFTA independently affects result (vary A, fix B=T, C=F)
T2FTFFA’s effect confirmed
T3TFFFB independently affects result
T4FFTTC independently affects result
T5FFFFC’s effect confirmed

5 cases to achieve MC/DC vs. 8 cases for exhaustive combinatorial coverage — a 37.5% reduction for this condition alone.

White-box coverage hierarchy (subsumption relationship):

Path Coverage ⊃ MC/DC ⊃ Branch Coverage ⊃ Statement Coverage

A higher-level criterion subsumes lower ones: achieving MC/DC guarantees you also achieve branch and statement coverage. For most commercial software, branch coverage (100% BC) is the standard target; MC/DC is required in safety-critical domains.

Experience-Based Design Heuristics

Specification and code analysis are systematic but cannot anticipate every failure mode. Experience-based heuristics leverage domain knowledge, defect history, and tester intuition to fill the remaining gaps.

Error Guessing

Principle: Experienced testers can predict where defects are likely to hide based on common programming mistakes, past defect patterns, and domain-specific risk areas.

Heuristic checklist for error guessing:

Null / empty inputs
What happens when a required field is empty? When a collection has zero elements? When a string is null vs. empty?
Type coercion errors
Integer overflow, floating-point precision, implicit type conversion (e.g., "10" + 5 = "105" in weakly typed languages).
Concurrency
Two users modifying the same record simultaneously. Race conditions on shared resources. Deadlock scenarios.
Resource limits
File upload at exactly max size. Database connection pool exhaustion. Memory allocation near limits.
Special characters
Apostrophes in names (SQL injection risk). Unicode and emoji in text fields. Newlines in address fields.
Time & locale
Date calculations spanning daylight-saving time transitions. Leap year (Feb 29). Different timezone offsets.
Exploratory Testing

Principle: Simultaneously design, execute, and evaluate test cases in real time. Not ad-hoc — guided by a charter that scopes the session.

Charter format: Explore [target] using [resources] to discover [information].

Example charter: "Explore the payment gateway integration using a test card that triggers a bank timeout to discover whether the system handles partial authorisation states correctly."

Suite contribution: Exploratory findings that reveal reproducible defects are then converted into regression test cases with full specification (ID, preconditions, steps, expected result). Exploration generates; regression formalises.

Checklist-Based Testing

Principle: Use curated checklists of known defect types for a domain or technology to ensure important risk areas are not forgotten.

Sample checklist: Web application security testing
  • All user inputs sanitised before use in SQL queries (SQL injection prevention)
  • Output encoding applied before rendering user content in HTML (XSS prevention)
  • Authentication tokens expire after inactivity (session management)
  • Sensitive data not transmitted in URL parameters (information exposure)
  • HTTPS enforced on all authenticated endpoints (transport security)
  • CSRF tokens present on all state-changing forms (CSRF prevention)

Combining Heuristics for a Focused, Comprehensive Suite

No single heuristic achieves both goals alone. The disciplined combination below is the recommended design process:

Step 1: Identify equivalence partitions and boundary values (EP + BVA)
Define the input space. One representative per partition + boundary cases. This gives the minimum specification-driven set.
Step 2: Apply decision tables or state diagrams where applicable
For logic-heavy behaviour or stateful workflows. Ensures combinatorial and transition coverage without case explosion.
Step 3: Measure white-box coverage of the cases from Steps 1–2
Run coverage tools. Identify uncovered statements, branches, or conditions. Add minimal targeted cases for each gap.
Step 4: Apply error guessing and checklist-based testing
Review defect history for this module. Apply domain-specific checklists. Add cases for high-risk error types not reached by Steps 1–3.
Step 5: Review for redundancy
Check whether any two cases test identical code paths with the same expected result. Merge or remove confirmed duplicates before adding the cases to the suite.
Focused + comprehensive check:
  • Every equivalence class has at least one representative → comprehensive
  • No two cases test the same partition with the same expected result → focused
  • Every branch in the code is covered → comprehensive
  • Each case tests exactly one primary behaviour → focused

Test Case Design Anti-Patterns

Anti-patterns are common design mistakes that create bloated, fragile, or gap-ridden suites. Recognising them at design time prevents the suite management problems covered in Sessions 5.2–5.4.

Anti-Pattern: The Omnibus Test Case

One test case that checks 10 different things in sequence. When it fails, the failure message cannot pinpoint which of the 10 behaviours is broken.

Fix: One test case, one objective. Split along concern lines.

Corrected: Single-Responsibility Cases

10 separate cases, each with a clearly scoped objective. Failures immediately identify the broken behaviour.

Faster diagnosis; easier to exclude or select during regression.

Anti-Pattern: Happy-Path Only

All cases use valid, "nice" inputs. Invalid partitions, boundary values, and error conditions are untested. Defects in error handling are missed entirely.

Fix: Explicitly apply EP to identify and cover invalid partitions.

Corrected: Partition-Complete Coverage

At least one case per valid AND invalid equivalence class. Error handling is explicitly tested.

Defects in input validation and error paths are exposed before production.

Anti-Pattern: Vague Expected Results

"The system should display an error message." Which message? With what content? For how long? Pass/fail is subjective and varies between testers.

Fix: Specify the exact message text, HTTP status code, UI element state.

Corrected: Precise Expected Results

"Toast notification with text 'Password must be 6–20 characters' is displayed for 3 seconds. Field border turns red. Submit button remains disabled."

Automatable; consistent between manual and automated execution.

Anti-Pattern: Arbitrary Data Clones

TC-LOGIN-01 uses alice@test.com; TC-LOGIN-02 uses bob@test.com; TC-LOGIN-03 uses carol@test.com — all testing the same happy-path login with different but equivalent users.

Fix: One representative per equivalence class. Additional data-driven variation adds zero coverage value.

Corrected: One Representative Per Class

TC-LOGIN-01 with one representative valid user covers the entire valid-credentials partition.

Suite stays compact; minimization effort is reduced at the source.

Anti-Pattern: Missing Traceability

Test cases have no link to requirements or user stories. When a requirement changes, it is impossible to identify which tests must be updated. When a test fails, it is unclear what business requirement is violated.

Fix: Every test case references at least one requirement ID or user story.

Corrected: Full Traceability

Each case references REQ-XXX or US-XXX. Change impact analysis becomes a database query: "which tests trace to the changed requirement?"

Regression selection in Sessions 4.6–4.7 is only practical with this discipline in place.

Worked Example: Designing a Focused, Comprehensive Suite

Feature under test: Discount coupon validation in an e-commerce checkout system.

Specification: A coupon code is valid if: (a) it exists in the system, (b) it has not expired, and (c) the cart subtotal meets the minimum purchase threshold. A valid coupon reduces the total by a fixed percentage (5%–50%). Invalid or expired coupons display an error message.

Step 1: Equivalence Partitions
DimensionValid Partition(s)Invalid Partition(s)
Coupon existenceExists in systemDoes not exist (typo / unknown code)
ExpiryExpiry date ≥ todayExpiry date < today (expired)
Cart subtotal vs thresholdSubtotal ≥ minimum thresholdSubtotal < minimum threshold
Discount %5, 10, 25, 50 (valid range)<5% or >50% (data integrity; test via boundary)
Step 2: Boundary Value Cases
BoundaryTest ValueExpected Result
Expiry: today is boundaryCoupon expires today (same date)Accept: coupon is still valid on expiry date
Expiry: yesterdayCoupon expired yesterdayReject: "Coupon has expired"
Cart at exactly minimum thresholdCart = $50.00, threshold = $50.00Accept: minimum met
Cart one cent below thresholdCart = $49.99, threshold = $50.00Reject: "Minimum purchase not met"
Discount at 5% (lower bound)Coupon with 5% discountAccept: correct calculation
Discount at 50% (upper bound)Coupon with 50% discountAccept: correct calculation
Step 3: Decision Table for combined conditions
TC-D1TC-D2TC-D3TC-D4TC-D5
Coupon exists?YYYNY
Not expired?YYNY
Threshold met?YNY (boundary)
ActionApply discountReject: thresholdReject: expiredReject: invalid codeApply: boundary OK
Step 4: Error Guessing additions
  • Apply coupon twice to the same cart — should only apply once.
  • Coupon code with leading/trailing whitespace: "SAVE10 " — should the system trim it?
  • Coupon code in lowercase "save10" when stored as "SAVE10" — case sensitivity?
  • Apply coupon after a cart item is removed (cart subtotal drops below threshold mid-session).
Step 5: Result — focused, comprehensive suite

Total cases designed: ~16 cases (4 EP + 6 BVA + 5 decision table + 4 error guessing).

Without heuristics, a team might write 50+ cases testing random coupon codes with no systematic coverage, while still missing the threshold boundary and the whitespace error-guessing scenario.

Test Case Design Quality Checklist

Use this checklist before adding test cases to the suite to prevent anti-patterns and ensure each case earns its place:

#Quality CheckWhy it Matters
1Does this case have exactly one clearly stated objective?Prevents omnibus cases; enables precise failure diagnosis
2Does this case represent a partition or boundary not already covered by another case?Prevents arbitrary-data-clone redundancy
3Are preconditions fully specified (data state, system state, user role)?Prevents flaky, environment-dependent failures
4Is the expected result precise enough to be verified by an automated assertion?Prevents subjective pass/fail judgements
5Is the test data specific (exact values, not "valid input")?Ensures reproducibility across executions and environments
6Does the case have a traceability link to a requirement or risk item?Enables impact analysis for regression selection
7Are postconditions defined (clean-up steps for shared resources/data)?Prevents test-order dependencies and data contamination
8Does removing this case reduce coverage (partition, branch, or risk)?If no — the case is a candidate for immediate removal

Common Mistakes in Test Case Design

Confusing EP and BVA
EP selects one representative from the middle of a class. BVA targets the edges between classes. Both are needed — EP without BVA misses boundary defects; BVA without EP misses mid-range behaviour.
Treating code coverage as a design target
Coverage is a measurement, not a design technique. Designing cases purely to hit 100% branch coverage can produce cases with no meaningful expected result. Design for requirements first; use coverage to find gaps.
Skipping invalid partitions
Input validation defects are among the most exploited security vulnerabilities. Invalid partition cases test error handling, and their absence creates both quality and security gaps.
One enormous test data file shared by all cases
Cases that share test data become order-dependent. A case that modifies shared data corrupts the state for later cases. Each case should own or restore its own data.
Adding error guessing without formalising the result
Exploratory testing finds defects; it does not replace structured cases. When error guessing reveals a defect, a formal case must be written and added to the regression suite to prevent recurrence.
Not reviewing for redundancy before adding to the suite
Every redundant case added today is a case that will need to be removed during minimization (Session 5.3). Redundancy prevention at design time is far cheaper than redundancy removal after the fact.

Class Activity

Feature: User registration form for a university portal with the following specification:
  • Student ID: Must be a 10-digit number starting with the 4-digit year (2020–2026) followed by 6 digits.
  • Email: Must end in @vitap.ac.in. Max 60 characters total.
  • Date of Birth: User must be 17–30 years old at time of registration.
  • Programme: One of: B.Tech, M.Tech, MBA, PhD.
  • Password: 8–24 characters; must contain at least one uppercase letter, one digit, and one special character.
Tasks (in groups of 3–4):
  1. Apply Equivalence Partitioning to all five fields. Create a partition table listing valid and invalid classes for each. Count the minimum number of cases this generates.
  2. Apply Boundary Value Analysis to Student ID (year boundary), Date of Birth (age boundary), and Password (length boundary). List the on-point, off-point (valid side), and off-point (invalid side) cases for each.
  3. Design a Decision Table for password complexity: treat the three complexity conditions (uppercase present, digit present, special character present) as Boolean conditions. How many combinations need testing?
  4. Apply error guessing to the Email field: list 5 error-guessing test cases beyond what EP and BVA would generate (e.g., special characters, international domains).
  5. Review your full case list. Identify any redundant cases (same partition, same expected result). Remove them and report the final case count vs. the initial count before review.
Evaluation Rubric (10 marks)
  • 2 marks: EP table is complete (all five fields, both valid and invalid partitions).
  • 2 marks: BVA cases correctly identify on-point and both off-points for all three fields.
  • 2 marks: Decision table is structurally correct and all combinations are covered.
  • 2 marks: Error guessing cases are genuinely beyond EP/BVA scope and well-specified.
  • 2 marks: Redundancy review is performed and justified; final count is lower than initial count.

Exit Ticket

  1. A numeric age field accepts values 0–150. Using EP, identify all equivalence classes. Using BVA, identify the boundary test values. How many total test cases do EP + BVA together produce?
  2. A function has the code: if (x > 0 and y != null). What is the minimum number of test cases required for (a) branch coverage and (b) MC/DC? Explain the difference.
  3. A team achieves 95% branch coverage with their black-box test cases. A tester then adds 20 additional cases purely to reach 100% branch coverage. Are these 20 cases well-designed? What question should the tester ask before adding each one?
  4. Name two design anti-patterns that directly cause test suite bloat (covered in Session 5.2). Explain how a design heuristic from this session prevents each one.

Summary & Assignment

Well-designed test cases are the upstream control for test suite efficiency. Black-box heuristics (EP, BVA, decision tables, state transitions) define the minimum representative set from the specification. White-box heuristics (statement, branch, MC/DC) identify structural gaps. Experience-based heuristics (error guessing, exploratory charters, checklists) fill domain-specific risks. Together, and with a redundancy review before cases enter the suite, they produce a suite that is simultaneously focused and comprehensive — the foundation that makes minimization, selection, and prioritization effective.

Key takeaways:
  • A test case must have: unique ID, single objective, precise preconditions, deterministic steps, exact test data, verifiable expected result, and a traceability link.
  • EP divides the input domain into classes; one representative per class. BVA targets boundaries between classes. Together they cover the specification space systematically.
  • Decision tables handle combinatorial logic; state transition testing handles workflow and mode-based behaviour.
  • Branch coverage subsumes statement coverage. MC/DC subsumes branch coverage. Higher criteria are used for safety-critical domains.
  • Error guessing and exploratory testing supplement formal heuristics with domain expertise and defect history.
  • Anti-patterns (omnibus cases, happy-path only, vague expected results, data clones) create bloat and gaps — preventing them at design time is cheaper than fixing them with minimization later.
Assignment (Module 5.1):
  1. Select one module from your mini-project (minimum 3 functions / 1 user story). Apply EP and BVA to design a focused, specification-driven test case set. Document each case with all 8 attributes from the anatomy checklist.
  2. Run your EP+BVA cases through a coverage tool. Report the resulting statement and branch coverage. For each branch not covered, add a targeted white-box case and explain which structural gap it closes.
  3. Apply error guessing to your module: write 5 error-guessing cases based on the defect history (git blame / issue tracker) of your project or a domain-specific risk checklist.
  4. Apply the 8-point quality checklist to your complete case set. Identify any cases that fail one or more checks. Revise or remove them. Report the before/after case count.
  5. For each case in your final set, add a traceability link to the corresponding requirement or user story. Confirm that every requirement has at least one case and no case exists without a requirement link.