Flaky Test Quarantine: Owners, Expiry, and Nonblocking CI Results
A confirmed flaky test can block unrelated changes without providing a dependable release signal. Removing that obstruction is reasonable only if someone still sees…
A checkout change can affect payment methods, customer types, delivery options, and browsers at the same time. Testing the familiar path in each browser leaves interaction gaps. Testing every complete configuration may consume more effort than the change warrants. A useful alternative is to select configurations systematically, then state precisely what that selection covers.
Pairwise testing, also called all-pairs testing, selects complete test configurations so that every feasible pair of values from different input factors appears in at least one configuration. Feasible means the pair can occur in a complete configuration that satisfies the model's constraints. A test still uses all the factors in its row; the coverage target concerns pairs, not an instruction to execute with only two inputs.
The difficult work is deciding which factors and values represent the feature, expressing valid combinations correctly, and checking the generated result. A short matrix is useful only when its coverage claim survives those checks.
Consider an illustrative checkout feature with the following invented requirements. This is a test-design example, not a customer case or a report of executed checkout tests. The scope is configuration selection for placing an order; taxes, stock rules, discounts, and payment-provider failures are outside this small model.
Factor | Selected Levels |
|---|---|
Browser | Chrome, Firefox, Safari |
Customer | Guest, Member |
Payment | Card, Wallet |
Delivery | Standard, Express |
These levels are representative categories, not every browser version, account condition, or payment state. Before using the model in a project, select supported browser versions and test environments, define what makes an account a Member, and specify which wallet implementation is in scope. A label such as Wallet is too vague if different wallets follow different rules.
Assume the product owner confirms two constraints:
The second rule is deliberately specific to this fictional feature. Do not copy it as a general checkout rule. Each real constraint needs an approved requirement or a documented environmental limitation, because an incorrect constraint can exclude the behavior a test should investigate.
Without constraints, the model has 3 × 2 × 2 × 2 = 24 complete configurations. Enumerating the configurations and applying both rules leaves 15 valid configurations. These are different denominators: 24 describes the unconstrained Cartesian product; 15 describes the valid full configurations for this model.
Guest plus Wallet is infeasible because the wallet rule requires Member. Wallet plus Express is also infeasible, although neither individual rule directly bans that pair on its own. Wallet forces the customer to be Member; Member together with Express forces the payment to be Card. There is no value for the remaining factors that makes Wallet plus Express valid.
This is why checking only directly forbidden pairs is insufficient when constraints involve several factors. The question is whether at least one valid complete configuration contains the candidate pair. For a small model, enumerate the valid configurations and project their pairs. Larger models need a constraint-aware method that establishes the same feasibility condition without necessarily listing every configuration.
Keep the positive configuration model separate from rejection requirements. Excluding Guest plus Wallet from valid checkout configurations does not remove the need to test how the application rejects that attempted operation.
The matrix below was produced by a locally executed, standard-library Python example. It enumerated valid complete configurations, collected their feasible pairs, and repeatedly selected the row covering the most uncovered pairs. Ties followed the declared factor and level order. This deterministic greedy procedure produced eight rows; it does not prove that eight is the smallest possible suite.
The generator selected configurations only. It did not run a checkout application, Microsoft PICT, NIST ACTS, or a CI pipeline.
Case | Browser | Customer | Payment | Delivery |
|---|---|---|---|---|
1 | Chrome | Guest | Card | Standard |
2 | Firefox | Member | Card | Express |
3 | Safari | Member | Wallet | Standard |
4 | Safari | Guest | Card | Express |
5 | Chrome | Member | Card | Express |
6 | Firefox | Guest | Card | Standard |
7 | Chrome | Member | Wallet | Standard |
8 | Firefox | Member | Wallet | Standard |
A row covers several pairs simultaneously. Case 3 includes Safari plus Member, Safari plus Wallet, Safari plus Standard, Member plus Wallet, Member plus Standard, and Wallet plus Standard. Other rows can repeat some of these pairs. Pairwise coverage requires each feasible pair at least once, not exactly once.
An independent checker recomputed the valid full configurations and their pair universe without importing the generator. It checked every selected row against the declared levels and constraints, then compared the pairs present in the matrix with the required universe.
Factor Pair | Feasible Value Pairs | Covered by the Matrix |
|---|---|---|
Browser and Customer | 6 | 6 |
Browser and Payment | 6 | 6 |
Browser and Delivery | 6 | 6 |
Customer and Payment | 3 | 3 |
Customer and Delivery | 4 | 4 |
Payment and Delivery | 3 | 3 |
The result is 28 covered pairs out of 28 feasible pairs, with no invalid selected rows. The three Browser comparisons each have six feasible value pairs. Customer and Payment has three because Guest plus Wallet is impossible. Payment and Delivery also has three because Wallet plus Express has no valid full extension. Customer and Delivery retains all four possibilities.
The eight-row matrix therefore covers all feasible pairs while selecting only part of the 15 valid complete configurations. It does not cover all configurations, all requirements, or all defects. The independent check also rejected deliberately altered examples with missing pair coverage, an invalid row, an impossible pair added to the reported universe, or changed factor levels.
Avoid generating an unconstrained matrix and deleting invalid rows afterward. Microsoft's PICT documentation explicitly warns that a removed row may also be the only row covering another, valid pair. Generate with constraints, or regenerate and independently measure coverage after any removal or edit. A visual scan of a small-looking table cannot establish completeness.
For practical tool selection, PICT documents constraint-aware generation and higher interaction orders. NIST's current tools page describes ACTS support for constraints and variable-strength tests, while distinguishing the Advanced constraint-supporting tool from the Basic download. Check the chosen tool's actual distribution and model semantics. A tool's reputation does not verify your constraints, and a row-count comparison does not establish equivalent coverage.
Case 3 says Safari, Member, Wallet, Standard. It does not say what the checkout should display, charge, save, or reject. Those expectations need a separate test oracle: an approved rule for deciding whether the observed outcome is correct.
For this fictional case, additionally assume that a valid order must use the approved item total and Standard delivery charge, create one order, and show its confirmation. Also assume that repeating the same logical submission must not create another order. These are illustrative acceptance criteria, not properties inferred from pairwise coverage.
Prepare an authorized test environment with a supported Safari version, a synthetic Member account, an approved test wallet, an available item, and an independently known expected total. Define how to inspect the order and payment outcome. Start from an isolated basket so another test cannot change the fixture halfway through.
A useful case specification would cover these actions and observations:
Record the fixture, build, environment, actual observations, and evidence separately from this reusable case. If the required order or payment evidence cannot be inspected, report the check as blocked or limited rather than assuming that a success screen proves the entire outcome.
The repeat-submission check adds a sequence to this particular case. It is not evidence that the configuration matrix covers other sequences or timing conditions. Likewise, a generated row becomes an executed test only after its actions and assertions have run and their actual outcome has been recorded.
The same independent calculation found 35 feasible three-factor value combinations in the model. The selected matrix covers 28 of them, leaving seven absent. Pairwise completeness therefore coexists with incomplete triple coverage in this concrete example.
One missing triple is Chrome plus Guest plus Express. It has a valid full extension with Card payment. Chrome plus Guest appears in Case 1, Chrome plus Express in Case 5, and Guest plus Express in Case 4, yet no selected row combines all three. A defect that requires that exact triple could remain undiscovered despite complete pair coverage.
When a requirement, incident history, or risk review identifies a critical triple, retain an explicit case for it or select an appropriate higher-strength coverage target. Variable-strength testing can apply stronger coverage to a selected group of factors. Recheck the resulting suite rather than assuming that adding a tool option also validates the underlying model. Higher strength expands interaction coverage; it still does not supply missing expected results or guarantee defect detection.
Static configurations also leave other questions unanswered:
Constraints should describe which positive configurations are valid, not become a reason to skip unsafe-input handling. The negative-testing guide gives a separate structure for rejection, business non-effects, and recovery checks. Keep those cases visible alongside the valid configuration suite.
Do not translate a pair-coverage ratio into a promised percentage of bugs detected. Detection also depends on whether the model includes the relevant values, whether the triggering conditions occur, and whether the assertions reveal the failure.
Treat the factor model as a reviewed test-design artifact rather than a disposable input file. A new payment method changes the required pair universe. A revised delivery rule can make previously impossible combinations valid. Old rows may remain useful, but their earlier coverage result applies to the earlier model.
Use a repeatable workflow:
Report planned configuration coverage separately from executed coverage. Here, 28 out of 28 means the generated matrix contains every feasible pair in the illustrative model. If a real run skips or blocks rows, recompute which pairs were exercised; the generation result cannot establish that they ran or passed.
For the next feature with a growing configuration list, approve a small explicit model and its expected results first. Then generate and verify the matrix, and keep the higher-order and behavior-specific tests that the model cannot replace.
A confirmed flaky test can block unrelated changes without providing a dependable release signal. Removing that obstruction is reasonable only if someone still sees…
A green automated test history can help a developer identify a safe-looking change while leaving a QA lead unable to answer a different question:…
A sprint can contain carefully estimated testing work and still overload the only person who can perform it. The missing input may be a…
Create traceable test cases, prepare release-specific test runs, and keep approved coverage current as the product changes.