Decision Table Testing
Map every combination of conditions to their expected actions in a table. Each column is a test case. This technique is the gold standard for testing complex business rules.
1 The Hook
A Benefits NZ-style benefits portal has a rule for a hardship top-up payment: an applicant qualifies if they are currently receiving a main benefit, AND they have a dependent child, AND their cash assets are below a threshold. Three conditions. The team tests the happy path — all three true, payment granted — and a couple of obvious fails. It passes. It ships.
Weeks later, complaints arrive from two opposite directions. Some applicants with a dependent child but assets just over the threshold are being granted the top-up anyway. Others, who qualify cleanly, are being declined because they have no dependent child recorded — even though the rule should still consider them under a separate clause. The combinations that broke were never tested, because nobody wrote down the full set of combinations in the first place. They tested the cases they happened to think of.
Three yes/no conditions produce eight distinct combinations. The team tested maybe three of them. The five they skipped were not exotic edge cases — they were ordinary applicants whose particular mix of circumstances simply never came up in ad-hoc testing. When rules interact, the only way to be sure you have covered every combination is to lay them all out in a grid.
A decision table is a grid where every combination of yes/no conditions gets its own column — each column is one test case — giving you a provable, exhaustive map of complex business rules. Use it whenever two or more conditions interact to drive an outcome (eligibility, discounts, approvals), especially when you need to demonstrate full coverage to a stakeholder or auditor. The mistake most testers make is collapsing columns too early: you must build the full 2N table first and confirm each combination produces the same action before merging any — collapsing prematurely hides exactly the defects the technique was designed to catch.
The most destructive mistake I see experienced teams make — not juniors, experienced testers — is building the decision table after they have already written their test cases, then filling in the grid to match what they planned to run. The table becomes a justification document rather than a design tool, which is exactly backwards. The whole value is that you build it first and let the empty columns tell you what you have not thought of yet. Those missing-combination defects do not announce themselves — they sit quietly in Rule 4 or Rule 6 until a real Benefits NZ claimant hits that path. Build the table before you write a single test case. Every time. If you do not have the discipline to do it in a sprint, at minimum sketch the 2N grid on a whiteboard in your planning session and confirm that someone owns every column.
2 The Rule
When several conditions combine to drive an outcome, list every combination of those conditions as columns in a table and define the expected action for each — every column is one test case, and the table proves no combination was missed.
3 The Analogy
A KiwiSaver eligibility checklist at the bank.
When a bank works out whether a first-home buyer can withdraw their KiwiSaver, they do not rely on the teller remembering the rules. They run down a grid: Are you a member? For at least three years? Is this your first home? Will you live in it? Each combination of answers leads to a defined outcome — eligible, not eligible, or refer to a specialist. The grid exists precisely so that no combination of answers gets a made-up response on the day.
A decision table is that grid for your test cases. Every row of conditions, every combination of yes and no, has an agreed result written down in advance. You are not testing whatever scenarios spring to mind — you are working through a complete, exhaustive checklist where every line is a test.
What it is
A decision table is a matrix that systematically covers all combinations of input conditions and shows what action should result from each combination. It forces you to think about every scenario — including the ones you'd otherwise miss.
It's most useful when: multiple conditions interact, business rules are complex, or you need to prove exhaustive coverage to stakeholders.
Table structure
- Conditions (rows, top half) — the inputs or rules that can be true or false.
- Actions (rows, bottom half) — what the system does in response.
- Rules (columns) — each column is one combination of conditions. Each column = one test case.
For N binary conditions, the full table has 2N columns. 3 conditions = 8 test cases. Many can be merged when the action is identical regardless of one condition's value.
Worked example
A discount system: users get a discount if they are a member AND their order total is > $100. Members always get free shipping; non-members only get free shipping on orders > $100.
| Condition / Action | Rule 1 | Rule 2 | Rule 3 | Rule 4 |
|---|---|---|---|---|
| Is member? | Y | Y | N | N |
| Order > $100? | Y | N | Y | N |
| Apply discount? | Yes | No | No | No |
| Free shipping? | Yes | Yes | Yes | No |
Each column (Rule 1–4) maps directly to a test case with defined inputs and expected outcomes. No ambiguity, no missed scenarios.
Reducing the table
When an action is the same regardless of one condition's value, you can collapse columns using a "don't care" value (often written as — or *). This reduces test count while maintaining coverage.
In the example above, free shipping for members applies regardless of order total — Rules 1 and 2 could be merged for the free-shipping action.
ISTQB mapping
| Ref | Topic | Level |
|---|---|---|
| 4.2.3 | Decision Table Testing | CTFL Foundation |
| FL-4.2.3 K3 | Apply decision table testing to derive test cases | Foundation LO |
| CTAL-TA 3.2.3 | Advanced decision tables, minimisation, cause-effect | Advanced / Senior |
When to use it
- When there are 2–5 conditions with interactions that matter
- When business logic is defined as "if A and B but not C, then..."
- When you need to show a stakeholder you've covered all scenarios
- As a precursor to test case writing — the table is your test design
Avoid for simple cases: If there's only one condition, use EP/BVA instead. Decision tables shine with 2+ interacting conditions.
Practice this technique: Try Junior Practice 09 — Checkbox & radio logic, Junior Practice 04 — NZ checkout form.
NZ example — GST pricing rules
New Zealand GST (Goods and Services Tax) is 15%. An e-commerce checkout must apply GST correctly based on two conditions: whether the customer is GST-registered (they can claim it back) and whether the product is GST-exempt (some items like financial services are exempt).
| Condition / Action | Rule 1 | Rule 2 | Rule 3 | Rule 4 |
|---|---|---|---|---|
| Customer is GST-registered? | Y | Y | N | N |
| Product is GST-exempt? | N | Y | N | Y |
| Show price | Ex-GST | GST-exempt | GST-inclusive | GST-exempt |
| Add GST line item? | Yes | No | No | No |
Each rule = one test case. The decision table ensures all four combinations are covered. A common bug is that GST-registered customers get charged GST on exempt products (Rule 2 missing or wrong).
NZ online store — free shipping decision table
A NZ online store gives free shipping based on two conditions: (A) customer has an active loyalty card, (B) order total is $75 or more. The condition rows are filled in for you — complete the action rows by selecting Yes or No for each rule.
| Condition / Action | Rule 1 | Rule 2 | Rule 3 | Rule 4 |
|---|---|---|---|---|
| Loyalty card? | Y | Y | N | N |
| Order ≥ $75? | Y | N | Y | N |
| Free shipping? | ||||
| Loyalty discount? |
| Condition / Action | Rule 1 | Rule 2 | Rule 3 | Rule 4 |
|---|---|---|---|---|
| Loyalty card? | Y | Y | N | N |
| Order ≥ $75? | Y | N | Y | N |
| Free shipping? | Yes | Yes | Yes | No |
| Loyalty discount? | Yes | Yes | No | No |
Free shipping: loyalty card OR order ≥ $75 (either condition is sufficient).
Loyalty discount: loyalty card only (regardless of order total).
4 Industry Reality
- Requirements rarely arrive pre-formatted as clean boolean conditions. You will get a paragraph of prose from a business analyst describing "the eligibility rules" for a government benefit, a loan approval, or an insurance claim — and your first job is to extract the conditions yourself before you can even start the table. Senior testers have learned to ask: "Is there anything else that changes this outcome?" because there always is one more condition hiding in someone's head.
- In NZ government projects (Revenue NZ, Benefits NZ, CoverNZ) decision tables are often the only artefact that makes complex policy rules testable. The policy document may span 40 pages; the decision table collapses it to eight rows. Auditors and business owners will sign off on a table in 10 minutes where they'd spend days arguing over test cases written in prose.
- You will almost always find a "don't care" condition that nobody noticed — a condition that one group of developers ignored because their module never saw that combination. Those untested cells are where the live defects live. Teams that have never built the full 2N table are always surprised when you show them the combinations they have never run.
- Time pressure on real projects means you will frequently deliver a partial decision table — covering the highest-risk rules first and noting which columns were deferred. That is acceptable and honest. What is not acceptable is calling ad-hoc testing "complete" when a structured table would show obvious gaps. Document what you chose not to cover and why.
- Legacy codebases often have hardcoded special cases that violate the documented decision table. When you find a discrepancy, raise a defect against the requirement or ask the business whether the code or the spec is the ground truth — because sometimes the code is right and the spec is out of date. Either way, the table surfaced the mismatch.
Senior engineer insight
The moment that changed how I use decision tables was on an Revenue NZ tax-rate project. We had four conditions in the spec — residency status, income bracket, superannuation flag, and a transitional tax credit. I built the full 2&sup4; table (16 columns) as a conversation tool with the policy team, not to run every column, but to walk through each one. By column 9, the policy owner stopped me and said, “Wait — that combination can’t exist in our system.” Three more columns triggered the same conversation. By the end we had collapsed 16 columns to 7 valid scenarios, raised two formal requirement ambiguities, and discovered that the developer had hard-coded a case that the spec said was a “don’t care.” None of that surfaces if you just write test cases from memory and call it done. The table is a thinking tool first and a test design second.
The most common mistake I see graduates make is building the table in isolation — designing it at their desk and handing it to the developer as a finished artefact rather than walking it through with the business analyst first, where the real ambiguities live.
From the field
We were testing an Revenue NZ visa-holder tax-rate portal where the rate depended on three conditions: NZ tax residency status, whether the person held a valid NZ-issued visa, and whether their annual income exceeded the $70,000 bracket threshold. The team assumed that the residency and visa conditions always moved together — if you were a resident, you had a valid visa — so they collapsed those two rows immediately and ended up running only three of the eight possible columns. What they missed was the transitional scenario: a recently lapsed visa but residency status not yet revoked, which triggered a different withholding-rate calculation entirely. That combination slipped to production and generated incorrect PAYE deductions for about 200 contractors before it was caught. The lesson that generalises: never collapse conditions before you have confirmed, with the business analyst and a policy reference, that the combination truly cannot occur — because in government systems, the “impossible” combinations are exactly where edge-case legislation lives.
5 When to Use It — and When Not To
✓ Use it when
- Two or more yes/no conditions interact to drive the same outcome (discounts, approvals, eligibility, pricing rules)
- The spec uses "if A and B but not C" language — that phrasing is a direct signal that a table is needed
- You need to demonstrate exhaustive coverage to a business owner, auditor, or regulator — the table is its own evidence
- Different combinations produce meaningfully different system behaviour, not just different data values (use EP/BVA for data ranges)
- The team is likely to test happy paths only — the table forces them to sign off on every combination before a single test is written
✗ Skip it when
- There is only one condition — equivalence partitioning is simpler and sufficient; decision tables add no value here
- The outcome is driven by a range of numeric values, not boolean flags — use boundary value analysis instead
- Conditions have more than two meaningful values (e.g. status = pending/approved/declined/cancelled) — the table explodes; use state-transition testing or cause-effect graphing
- The system under test has 6+ conditions — 64 columns is rarely tractable; use pairwise testing or risk-based sampling to reduce to a manageable subset
- You are exploratory testing an unfamiliar feature where you do not yet know all the conditions — charter-based exploration first, then build the table once the rules are clear
Context guide
How the right level of Decision Table Testing effort changes based on project context.
| Context | Priority | Why |
|---|---|---|
| Regulated government system (Benefits NZ, Revenue NZ, CoverNZ, TransitNZ) | Essential | Eligibility rules and compliance obligations require provable exhaustive coverage — auditors expect a signed-off table, not a memory-based test list; missed combinations create financial liability or legal risk under the Social Security Act, Revenue NZ tax rules, or Privacy Act 2020. |
| Financial services — banking, insurance, KiwiSaver pricing engines | Essential | Loan approval logic, overdraft eligibility, and insurance premium calculation all involve 2–5 interacting boolean conditions where an untested combination incorrectly approves or declines a customer — the financial and reputational exposure is high and regulators (FMA, RBNZ) may require audit trails. |
| Enterprise with complex business rule engines (ERP, policy platforms) | High | Pricing engines, discount rules, and approval workflows commonly have 3–5 interacting conditions spread across multiple teams; a decision table creates a shared artefact that product owners, developers, and testers all work from, reducing the ambiguity that causes mid-sprint rework. |
| Legacy system migration or integration | High | Legacy systems often have undocumented special-case rules baked into the code; a decision table built by reverse-engineering existing behaviour exposes discrepancies between what the code does and what the spec says — critical before migration when the old system is the de facto source of truth. |
| Agile sprint work — standard product feature with 2–3 conditions | Medium | Worth building as a design aid and BA sign-off tool when sprint stories involve interacting boolean conditions; collapse to the 4–8 highest-risk columns given time pressure — document which columns were deferred rather than skipping silently. Lightweight table in a Confluence page or Jira description is enough. |
| Early-stage startup — pre-product-market-fit, single-condition flows | Low | Simple checkout flows, single-toggle feature flags, or MVP flows with one condition driving the outcome do not benefit from a full decision table — equivalence partitioning and exploratory testing deliver faster feedback. Revisit when the rule set grows to 2+ interacting conditions. |
Trade-offs
What you gain and what you give up when you choose Decision Table Testing.