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…
In a hypothetical suite review, two refund cases have almost identical steps. Both open an order, submit a refund, and check the result. One uses a finance account; the other starts with finance access but removes it before retrying a timed-out request. Removing the second case because its title looks familiar would discard a different authorization check.
Test suite optimization needs a coverage decision behind every retirement proposal. Duplicate test cases exercise the same behavior under equivalent relevant conditions and check equivalent outcomes. Obsolete test cases no longer apply to the product, supported variants, or obligations the team still needs to verify. Similar wording and an old creation date establish neither condition.
Use the following checks before proposing retirement. The possible outcomes include retaining a case, repairing it, consolidating overlapping specifications, excluding it from one release, or retiring it with recoverable history. Selecting fewer tests for a particular change is a narrower decision than removing them from the reusable regression suite.
Start with the behavior the case is supposed to protect. Find the applicable requirement, acceptance criterion, business rule, or documented risk, then compare its current meaning with the case's preconditions and expected results. A link to the right story is insufficient if the story changed after the case was approved.
For a hypothetical refund policy change, a case expecting every refund to receive supervisor approval may need revision if approval now applies only to particular conditions. That does not make the entire refund flow obsolete. Identify the changed rule and decide whether to update the existing specification or preserve a variant for a supported product version.
Work in both directions. From the candidate case, identify its source and purpose. From the affected requirement, inspect which remaining cases would verify it after the proposed change. This prevents a cleanup list assembled from existing tests from overlooking a requirement that already lacks coverage.
A missing requirement link is an investigation task. The case might cover an undocumented cross-cutting risk, a previous defect, or a still-valid operational constraint. Ask its owner before classifying it as obsolete. Likewise, a removed feature can leave supported legacy deployments, migration paths, or retained-data obligations that still need testing. Record the support boundary that makes retirement appropriate, rather than writing only “old feature.”
Compare what the cases test, not how closely their titles match. Read the preconditions, starting state, actor, actions, expected outcomes, and reason for keeping the check. Two differently worded cases can be duplicates; two nearly identical specifications can exercise different failure paths.
In the hypothetical refund pair, checking authorization on initial submission and checking it again after a timeout protect different transitions. A successful refund and a rejected unauthorized refund also remain distinct even when most navigation steps are shared. Identify those differences explicitly before choosing a surviving specification.
Repeated setup alone does not establish redundant coverage. Logging in, preparing an order, and navigating to the same page may be necessary for independent tests. Sharing setup can reduce maintenance without removing either behavioral check. Preserve isolation so that the surviving tests do not depend on another case having run first.
Text search, similarity scores, and AI suggestions can help assemble a candidate review list. Treat their matches as leads, not proof that deleting a case is safe. A reviewer still needs to identify the behavior retained elsewhere and the relevant conditions under which the two checks are equivalent.
When the overlap is partial, keep the unique behavior or rewrite the cases around clearer responsibilities. Do not merge everything into a long journey whose early failure prevents later checks from running or makes a failed outcome difficult to diagnose.
A changed account, amount, browser, or product version may carry the entire purpose of a case. Before consolidating apparently repeated specifications, list the variations and explain which behavior each one is expected to expose.
Equivalence partitioning groups values expected to receive the same processing. It can support choosing representative inputs, but the grouping needs a defensible basis. Do not assume that two ordinary amounts are equivalent to an amount at a refund limit, an invalid amount, or a value governed by a different currency rule. Boundary checks and combinations of conditions can reveal differences that an ordinary example misses.
Include configuration in this review. The same actions in a logged-in and logged-out state, or on supported browser and product versions, can be deliberate coverage. Removing a duplicated definition should not silently remove its required configuration from execution.
A useful consolidation record identifies:
Parameterization can place several input and expected-result combinations under one maintained definition. That reduces repeated specification text, not necessarily the number of executions required. Review the resulting variations before claiming that coverage has been preserved. If the team cannot explain why a removed variation is represented by another, leave it in the suite until that uncertainty is resolved.
Identical actions do not imply identical checks. One checkout case may verify the confirmation message, another the recorded order, and another the required audit entry. Read the expected results and, for automated tests, the assertions that actually run. A description promising an audit check does not establish that the implementation performs it.
Compare each assertion with the current requirement. Keep the outcomes that would expose a distinct failure. Remove accidental repetition only after showing where those outcomes remain observable in the proposed replacement. If a case contains several assertions, consider whether a failure near the beginning prevents later ones from being evaluated.
Also investigate weak or brittle checks before treating them as retirement candidates. A test that compares an entire complex object can fail when an unrelated field changes. Narrower assertions may make its intended behavior clearer. Google's guidance on narrow assertions concerns unit tests; it does not establish that every broad integration or end-to-end check is unnecessary.
For a proposed merge, write down the expected observations before editing the specification. Review whether each still has suitable setup, data, and a reliable way to distinguish success from failure. Validate the replacement in an authorized test context before retiring coverage that depends on it. A shorter case list without a reviewed replacement is not evidence that the same behavior remains protected.
Execution history helps explain how a case is used, but inactivity alone is not a retirement rule. Review its selected releases, executed specification versions, environments, results, linked defects, and current blockers. A test absent from a recent run may have been deliberately excluded because the affected feature did not change.
Keep temporary states separate from obsolete behavior. A blocked sandbox needs a prerequisite repaired. A flaky check needs investigation into inconsistent behavior or test design. A skipped configuration may still be supported, and an expected failure may document a known defect. None of those states proves that its underlying requirement has disappeared.
Rarely executed checks deserve a risk review rather than automatic removal. Recovery, permission, migration, or exceptional transaction paths may be infrequent while still protecting consequential behavior. Ask what could fail without the check, whether another suitable test would detect it, and who accepts the remaining uncertainty.
A quiet defect history also has limits. A case that has never failed might be redundant, might be checking stable behavior, or might contain an ineffective assertion. Inspect the mechanism instead of assigning a universal retirement cutoff based on time since the last failure.
Choose the scope of the action explicitly. Excluding an unchanged area from one release's selected run can be reasonable while retaining its cases for future changes. Permanent regression suite cleanup needs the broader requirement, coverage, approval, and recovery evidence described here. Do not let a release-specific scheduling decision become an undocumented repository change.
Give a named maintainer a proposal they can challenge. “Looks duplicated” does not identify what coverage survives or why the original is no longer required. The owner should be able to trace the decision to the applicable requirement revision and inspect the proposed replacement, if there is one.
Use a short decision record with the case identity and version, reason for the proposal, affected scope, surviving coverage, unresolved risks, reviewer, and approval date. For an obsolete case, include the evidence that its behavior is no longer required. For a duplicate, identify the surviving case and the conditions and assertions it retains. Keep the relationship discoverable in both directions.
Bring in the people who understand the affected boundary. A product owner may confirm feature retirement; an engineering or security reviewer may identify a surviving compatibility or control requirement. These are recommended responsibilities to assign within the team's process, not universal mandatory roles or a claim of regulatory compliance.
Sherlock Test Management's product description offers a relevant distinction: proposed changes require human approval, approvals create baseline versions, and finished runs stay attached to the baseline version they executed. That model can help a team separate a reviewed maintenance proposal from historical execution evidence. The Sherlock baseline and release-run workflow describes this approach; it does not establish automatic duplicate detection or a specific retirement operation.
If approval is missing or a material question remains open, keep the case available and assign the next investigation. A cleanup deadline should not substitute for a decision about lost coverage.
Retiring a case from active selection should not make its earlier results impossible to interpret. Decide what another reviewer must be able to recover before changing the active suite, including the content that was executed rather than only today's editable definition.
Retain the original case identity, reviewed specification version, requirement references and revision, execution history, results, and relevant defect links. Preserve the reason for retirement, owner approval, and relationship to any surviving or replacement case. Where environment or data references are essential to understanding a result, retain controlled references that the team can still resolve.
An earlier pass belongs to the specification and candidate that were tested. Editing a surviving case must not make that pass appear to validate newly added assertions. The guidance on test case versioning and run snapshots develops the distinction between current reusable content and historical execution context.
Check the retention behavior of the system the team uses. A status label or version name does not independently establish that old content and results remain accessible. Prefer a reversible retirement process when it preserves the required evidence, and verify the consequences before authorizing any irreversible operation. This is a process recommendation, not an archive-button recipe or a claim that every tool retains the same records.
State the conditions that would reopen the decision. Examples include restoring a removed feature, adding a supported legacy version, changing the rule that justified equivalence, or discovering that the replacement omitted an important assertion. Assign responsibility for reviewing those triggers.
Confirm in an authorized safe context that the retained specification and its history can be recovered. If they cannot, repair the retention arrangement or keep the case active while the gap is resolved. Recoverability does not excuse removing unique coverage; it protects the record after a justified decision.
Start with a bounded candidate group and require one review packet that shows what remains covered, who approved the change, and how the earlier evidence can be recovered. Leave uncertain cases in place with a concrete follow-up. A defensible retirement decision is a better outcome than a smaller suite whose missing checks nobody can explain.
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.