skip to content

Requirement and Defect Links

How a case repository joins the tracker that holds requirements and defects: what must be agreed before a link exists, what a failed run files, where a coverage number comes from, and how they drift.

on this pageshow

explore

questions

17

In a TestRail-class case repository, a requirement-coverage panel reports a single percentage — what sits in the numerator and what forms the denominator?

level: juniorimportance: must knowfreq 60%

answer

  1. it is a fraction, both halves configured
  2. the filter sets the denominator
  3. covered is a chosen condition
  4. one requirement, one vote

basics

~20 s

The denominator is the set of requirements the panel's saved filter selects; the numerator is how many of those satisfy the panel's configured covered condition. The unit counted is the requirement, not the test case.

solid answer

~40 s

A requirement-coverage panel is a fraction over requirements. The panel's saved filter chooses the population — a release, a component, a label — and that population is the denominator. The numerator is the count of those requirements that satisfy whatever the panel treats as covered, and that condition is configurable: a link merely existing, a linked case executed in the selected cycle, or a linked case passed. Because the unit is the requirement, one requirement with forty linked cases contributes exactly one, and one case linked to five requirements contributes to five different requirements. Before quoting the figure anywhere, state which filter and which condition produced it; without those two facts the percentage is not comparable to any other reading of the same panel.

go deeper

for a junior

Know that the panel counts requirements rather than cases, and that the percentage is the share of a filtered requirement set meeting some covered condition. Be ready to name the two facts you would ask for before repeating the number.

for a middle

Be ready to explain how a many-to-many link graph collapses to one vote per requirement, and why a broad case linked to five requirements moves the figure five times as far as a deep case linked to one.

for a senior

Show that you check the population and the condition before believing a coverage number in a release conversation, and that you read the uncovered list rather than the headline percentage.

for a principal

Own which single coverage reading your organisation publishes and how it is qualified, because an unqualified percentage invites teams to optimise the filter and the definition instead of the testing.

## The panel is one fraction, and both halves are configured A requirement-coverage panel — the summary a case repository such as a TestRail-class product, or a tracker-resident tool like Xray or Zephyr, puts at the top of a requirement list — renders as a single number, and that visual simplicity is exactly what makes it misread. It is a fraction, and neither half of the fraction is fixed by the product. - **The denominator** is the **population**: the set of requirements the panel is currently looking at. That set comes from a saved filter — a release, a component, a label, an epic, a date window, or a hand-picked list. Change the filter and the denominator changes, with no change to any test artefact at all. - **The numerator** is the count of requirements in that same population that satisfy the panel's **covered condition**. Most products let that condition be chosen from a small ladder: a link exists at all, a linked case was executed in the selected cycle, or a linked case passed. So the honest reading of a coverage panel is always three-part: *this share of **this** requirement set meets **this** definition of covered.* Drop either qualifier and the number stops meaning anything a second reader can reconstruct. ## The unit of counting is the requirement The single most common misreading is to treat the percentage as a share of test cases. It is not. Coverage panels count requirements, and the link graph between requirements and cases is many-to-many, so the collapse from graph to fraction is lossy in two directions: 1. **A requirement with many linked cases still counts once.** Forty deep cases against one requirement and one shallow smoke case against another are, to this panel, the same: one covered requirement each. The figure carries no notion of depth. 2. **A case linked to many requirements counts many times.** One broad end-to-end case linked to five acceptance criteria can flip five requirements to covered in a single execution. This is why coverage percentages respond so much faster to *linking work* than to *testing work*. Some products link at the granularity of an acceptance criterion rather than the whole requirement. That changes what one row in the denominator is, and therefore changes the percentage, without changing anything about the tests. When two teams report coverage from products that link at different granularity, the numbers are not comparable even when both are honest. ## What the figure establishes, and what it does not | The panel tells you | The panel does not tell you | |---|---| | How many filtered requirements meet the covered condition | Whether the linked cases are any good | | Which requirements have no qualifying link | Whether the requirement itself is correct or complete | | The shape of the gap within the chosen population | Anything about requirements the filter excluded | | That work exists, at the strictness you configured | That the behaviour actually works, unless the condition is passed | The practical consequence: a coverage panel is a **completeness of the plan** instrument, not a quality instrument. It answers *have we pointed testing at everything we agreed to build, inside this slice?* — and only that. ## Reading a panel without being misled A short checklist that survives contact with a release meeting: - **Ask for the filter first.** A percentage without its population is a rumour. The dangerous filters are the ones that exclude unlinked requirements: the denominator shrinks, the number climbs, and the requirements most in need of attention are precisely the ones that vanished. - **Ask for the condition second.** Linked, executed and passed give three different numbers from identical data, and the gap between them is often the interesting part. - **Ask what a row is.** Whole requirement, or acceptance criterion? That decides the size of the denominator. - **Ask when the number was computed.** Some panels recompute on every read; others serve a stored roll-up refreshed on an event or a schedule. - **Read the uncovered list, not the percentage.** The panel's real value is the enumeration behind it — which specific requirements failed the condition — because that list is actionable and the percentage is not. ## Why the fraction moves the way it does Because the denominator is a filtered population and the numerator is a subset of it, the arithmetic has a few properties worth internalising. Adding requirements to the population without linking them **lowers** the figure — correctly, because newly agreed scope really is uncovered. Adding more linked cases to an already-covered requirement moves the figure **not at all**. Narrowing the filter to a component that happens to be well linked **raises** it without any testing having occurred. None of these movements are bugs; they are the direct consequence of counting requirements over a configured population, and a reader who has internalised the fraction predicts all three without being told.

  • If one test case is linked to five requirements and it passes, how far can the panel move?
    Up to five requirements can flip to covered from that one execution, because the fraction counts requirements and each of the five gets its own vote. The case itself is never a unit in the sum. That is why a handful of broad, generously linked cases lifts a coverage figure far faster than many narrow ones, and why the percentage says nothing about depth.
  • What does the panel do with a requirement that has no linked case at all?
    It stays in the denominator and fails the covered condition, so it pulls the percentage down — which is the useful behaviour. The trap is a saved filter that quietly excludes unlinked requirements from the population: the denominator shrinks, the figure climbs, and the requirements that most needed attention are the ones that disappeared from view.

It is an attendance register, not an exam mark: it records that every name on the list was signed against, and says nothing about how well anyone did.

saying these in an interview costs you the question

  • Reads the percentage as a share of test cases
  • Assumes covered always means a case passed
  • Quotes the figure without naming the filter behind it
  • Thinks adding linked cases to a covered requirement raises it
open as a page

Before a TestRail-class case repository can create a defect in a separate issue tracker, what must the two systems agree on about the destination?

level: juniorimportance: must knowfreq 68%

basics

~20 s

Two things, as a pair: which tracker project receives the item, and which item type it is created as. Trackers attach mandatory fields, closed value lists and workflow to that pair, so the mapping is defined against it.

open as a page

In a TestRail-class case repository, what does filing a defect straight from a failed execution pre-fill into the new tracker item?

level: juniorimportance: must knowfreq 64%

basics

~20 s

Filing from a failed execution pre-fills the draft ticket with the run's context: which case failed, which cycle it ran in, the environment or build under test, who recorded the result, and the comment and evidence captured at failure time.

open as a page

In a requirement-coverage panel in a test-case management product, how does the reported figure differ when covered means a link exists, versus executed in the selected cycle, versus passed?

level: middleimportance: must knowfreq 66%

basics

~20 s

Each condition is stricter than the last, so over one population the three readings form a descending ladder: a link counts intent, executed counts work actually done in the chosen cycle, passed counts behaviour confirmed. The gaps between them are the diagnosis.

open as a page

An issue tracker refuses to create an item unless a particular field is set, and the case repository filing the defect holds no value for it. How do you resolve that?

level: middleimportance: must knowfreq 62%

basics

~20 s

Name a source rather than inventing a value: a constant the team stands behind, something derived from the run or the case, a person prompted at filing time, or a destination change that drops the demand.

open as a page

When a TestRail-class case repository files a ticket from a failed run, what is the difference between attaching the evidence bytes and pasting a deep link back to the run, and how does each fail?

level: middleimportance: must knowfreq 58%

basics

~20 s

Attached bytes travel with the ticket, so any tracker user can open them; a deep link stays behind the repository's login and is a dead page to a developer with no account there. Copies also duplicate storage and freeze at filing time.

open as a page

In a case repository that mirrors a defect's state from an issue tracker, what is the difference between a one-way mirror and a two-way sync, and what goes wrong when both sides may write the same value?

level: middleimportance: must knowfreq 66%

basics

~20 s

A one-way mirror gives each shared field a single writer and copies it in one direction; a two-way sync lets both sides write. Without a declared owner per field, two-way sync produces echo loops and last-writer-wins races that silently overwrite real edits.

open as a page

A test case in a case repository stores a link to an item in an external issue tracker. Which identifier should that link store, and what happens to it when the item is renamed, moved to another project, or deleted?

level: juniorimportance: should knowfreq 50%

basics

~20 s

Store the tracker's immutable internal identifier, not the human-readable key or the title. A rename or a move then leaves the link intact; only a delete truly breaks it, and the repository should show it as unresolvable rather than quietly drop it.

open as a page

Two colleagues open a requirement-coverage panel in the same case management tool at the same moment and read different percentages — what accounts for that, and how do you settle which reading to quote?

level: seniorimportance: should knowfreq 54%

basics

~20 s

A coverage percentage is defined by three settings that live with the view, not with the data: the saved filter that picks the population, the covered condition, and the selected cycle. Two readings differ because at least one of those three differs.

open as a page

A tester records a passing result in a case management tool, but the requirement-coverage panel still shows the old percentage — what explains the lag, and how do you confirm it?

level: seniorimportance: should knowfreq 46%

basics

~20 s

Most likely the panel serves a stored roll-up rather than recomputing on read, and the refresh that should have followed the result was delayed, batched or missed. Confirm by comparing the panel against the requirement's own links and results.

open as a page

A case repository and an issue tracker each hold a closed list of values for a similar idea, but the lists have different members. How do you map one onto the other?

level: seniorimportance: should knowfreq 54%

basics

~20 s

Write an explicit member-to-member table, agreed by both sides, and decide in advance what happens to a source value with no counterpart. That fallback is the real design question: refuse the write, or route to a visibly marked value.

open as a page

A case repository refreshes its stored tracker links only when the tracker calls it back on a change. Why does it still drift out of agreement over time, and what does a periodic reconciliation sweep add?

level: seniorimportance: should knowfreq 58%

basics

~20 s

Callbacks are best-effort and only fire for changes a tracker chooses to announce, so a lost delivery leaves the repository confidently wrong with no visible signature. A periodic sweep re-reads stored links and is the only path that finds items that quietly went missing.

open as a page

In a mapping between a case repository and an issue tracker, several fields can be edited on both sides. How do you decide who owns each one?

level: principalimportance: should knowfreq 46%

basics

~20 s

Assign ownership field by field, not system by system, choosing the side where the value is actually decided. Then mark each field one of three ways: written once at creation, kept current by its owner, or never written.

open as a page

You have configured a new field mapping from a case repository into an issue tracker. How would you prove it works before the first real defect is filed through it?

level: middleimportance: nice to knowfreq 34%

basics

~20 s

Create a throwaway item through the mapping into a destination nobody triages, then read it back. Only a real create exercises mandatory-field checks and list validation; the configuration screen shows your intent, not the tracker's rules.

open as a page

A shared environment breaks and forty cases fail in one cycle of a TestRail-class case repository. What stops that becoming forty tracker items, and where does that protection stop working?

level: seniorimportance: nice to knowfreq 44%

basics

~20 s

Suppression covers a repeat filing of the same case within the same cycle: the action offers the existing item instead of creating another. It cannot help here - forty different cases are forty keys, so each is a legitimate first filing.

open as a page

A sync creates an item in an issue tracker, then crashes before it stores the identifier the tracker returned, and on the next pass it creates a second item. How do you make that write safe to retry?

level: seniorimportance: nice to knowfreq 42%

basics

~20 s

Record the intent before calling the tracker and carry a locally generated token into the created item, so a retry searches for the token and adopts what the lost call already made. Creation is the one sync write that is not naturally repeatable.

open as a page