Skip to main content

Manual Testing

Test Case Design Techniques That Actually Cut Bugs, Not Just Paperwork

Vuk KazimirovicOct 6, 20263 min read
Test Case Design Techniques That Actually Cut Bugs, Not Just Paperwork

When I review a set of test cases someone's written from experience alone, the pattern is almost always the same. They've tested a normal case, a clearly wrong case, and maybe one thing that looked tricky. What's usually missing isn't obvious in the moment, and that's exactly the problem: it takes a structured technique to see it, not more experience.

Equivalence partitioning

Group inputs into classes that should behave the same way, then test one representative from each class instead of every possible value. A field accepting ages 18 to 65 has three real classes: below range, in range, above range. Testing 20, 35, and 50 all inside the "valid" class tells you nothing new after the first one. Testing one value from each class covers the actual logic with a fraction of the effort a tester defaults to without thinking about it this way.

Boundary value analysis

Most real defects cluster at boundaries, not in the middle of a range, because off-by-one errors are the single most common logic mistake in condition checks. If the valid range is 18 to 65, test 17, 18, 65, and 66, not 40. That's four test cases instead of one, and they're the four that actually catch the < versus <= bug that a middle-of-the-range value never would.

Decision tables for combined conditions

When several independent conditions interact, discount eligibility, access permissions, a pricing rule with multiple qualifying factors, a table is the only reliable way to see every combination that needs a check. Writing test cases for combined logic freehand almost always misses at least one combination, because holding four independent booleans and their sixteen combinations in your head at once isn't something intuition is built for. A table makes the gap visible before you've written a single test.

Where I don't bother

I don't reach for these on a simple CRUD form with one obviously valid path and one obviously invalid one. Building a full decision table for a form with two straightforward fields slows the team down for no real gain. These techniques earn their cost on actual branching logic: pricing, permissions, state machines, anything where the number of paths through the logic is larger than what a person can hold in their head while writing cases from memory.

The output of boundary analysis, specifically the boundary values themselves, is also exactly what should be feeding your test data strategy: if your test data doesn't include the edge values these techniques identify, you're back to the same gap with extra steps. And a test suite built around these techniques is one of the things we look at when a team's manual testing process has more bugs slipping through than the test case count would suggest it should.