skip to content

Suite and Folder Shape

How a TestRail- or Xray-class repository shapes one stored case before anybody runs it - its steps, its reused blocks, its variant rows, its labels - and what that shape lets a result say.

on this pageshow

explore

questions

19

In a TestRail- or Xray-class test case repository, what does attaching a variant table to one stored case do, and how does a placeholder in a step get its value?

level: juniorimportance: must knowfreq 72%

answer

  1. one stored case, many rows
  2. steps authored once, values vary
  3. placeholder names a column
  4. expansion happens at run generation
  5. one row, one execution record

basics

~20 s

A variant table holds one row of values per run of the same stored case. Placeholders in the step text name a column, and the repository substitutes that row's value, producing one execution per row.

solid answer

~40 s

A data-driven case is one stored case with a small table of values bound to it: each column is named, each row is one variation. The steps are authored once, with placeholders that name a column instead of holding a literal value. When the case goes into a run, the repository expands it into one execution per row, substituting that row's values into the step text so the tester reads concrete values and records an outcome for that row alone. Binding is by column name, so the same placeholder can appear in several steps and again in an expected result. The point is leverage: twelve rows give twelve executions but still one set of steps to maintain, one place to fix a typo, and one case in the inventory.

go deeper

for a junior

Be able to say plainly that one case plus a twelve-row table runs twelve times, and that a placeholder in a step is replaced by the value from that row's named column.

for a middle

Explain the mechanics: binding is by column name rather than position, expansion happens when the executions are generated, and the same placeholder resolves identically everywhere it appears in that row.

for a senior

Show where the shape breaks in practice - renamed columns leaving unresolvable steps, rows that quietly need an extra step, and the linear tester cost of a wide table on a manual case.

for a principal

Own the economics: the table multiplies executed volume without multiplying maintained artefacts, which also means case counts stop describing the work. Say how you would keep sizing honest.

## What a data-driven case actually is A **data-driven case** — a variant case, a parameterised case, an iteration case; the label differs by product — is **one** stored case with a small table of values attached to it. The table has named columns and one row per variation. The steps are authored once. Nothing about the steps is repeated per row, and nothing about a row is repeated inside the steps. Four terms carry the whole idea: - **Variant table** — the rows of values bound to the case. Each **column** has a name; each **row** is one complete set of values. - **Placeholder** — a marker inside a step's action text, its expected result, or a precondition that names a column instead of holding a literal value. - **Binding** — substituting, for one row, that row's value into every placeholder that names that column. - **Execution** — one recorded attempt of that case with one row bound in. ## How a placeholder gets its value 1. The author writes the steps once, putting a placeholder wherever the value varies. 2. The author fills the table: one column per varying value, one row per variation. 3. The case is put into a run or cycle, and the repository **expands** the single case into as many executions as the table has rows. 4. Each execution renders its own step text with its own row substituted, so the person testing reads concrete values rather than markers. 5. An outcome is recorded against that execution — that is, against that row — and not against the stored case. Two properties of step 4 matter more than they look. First, **binding is by column name, not by position**: the same placeholder may appear in several steps and again in an expected result, and every occurrence resolves to the same value for that row. Reordering columns changes nothing; renaming a column breaks every step that referenced the old name. Second, the substitution normally reaches the text the execution is listed under, which is what lets a reader tell row four from row nine in a list of results without opening either one. Notice what the author never does: they never copy the steps, and they never edit the case between rows. The repetition is the repository's job, and it happens at the moment executions are generated, not at the moment the case is saved. ## What multiplies, and what does not | Thing | With a twelve-row variant table | |---|---| | Stored cases in the inventory | 1 | | Sets of steps to maintain | 1 | | Places to fix a typo in a step | 1 | | Executions produced by one run | 12 | | Outcomes recorded | 12 | | Rows that can fail independently | 12 | That asymmetry is the whole reason the shape exists. The count of **what you ran** multiplies; the count of **what you maintain** does not. Adding coverage becomes appending a row instead of cloning a case, and cloning is exactly what turns a repository into a place where the same wrong expected result is stored eleven times and corrected in one of them. ## Where the arrangement stops paying - **A row that needs an extra step is not a row.** As soon as the step text starts saying things like *if this row is a closed account, skip step four*, the variation has outgrown the table. - **A renamed or deleted column** leaves placeholders naming something that no longer exists. Depending on the product the run either refuses to expand that row or renders the marker as literal text, and the tester meets an instruction with a hole in it. - **Manual execution cost is linear in rows.** Authoring a row is nearly free; performing one is not. Forty rows on a case a person works through by hand is forty times the tester minutes. - **Values that mean something only in one environment** quietly turn a portable case into a local one, and it fails everywhere else for reasons that have nothing to do with the product. ## Three things this shape is not - **It is not a way of storing many cases.** Rows never surface in the inventory as cases. Anyone sizing the work by counting cases will undercount the executions by the size of the tables. - **It is not where the values come from.** Deciding which rows are worth having, and producing or protecting the values inside them, are separate concerns. The table is only where the chosen values sit and how they reach the steps. - **It is not a way to fail a case.** One bad row is one failed execution. The rows that passed passed, and re-running the whole case to re-check a single row is wasted effort that the per-row record exists precisely to prevent.

  • A column in the variant table is renamed but a step still names the old one. What does the run show?
    The placeholder resolves to nothing. Depending on the product the row either refuses to expand or renders the marker as literal text, and the tester is handed an instruction with a hole in it. Either way it is an authoring defect against the case, not a product failure, and the fix is to bring the step text and the column name back into agreement before the cycle starts.
  • Does appending rows to the table change how many cases the repository holds?
    No. The inventory still shows one case however wide the table gets. Only the execution volume grows. That is worth saying out loud, because anyone sizing a cycle by counting cases will undercount the real work by the size of every variant table in scope.

It is a mail merge. One letter is written, an address list supplies the rows, and printing produces one letter per address; a smudged copy of the third letter is a bad print, not a broken template.

saying these in an interview costs you the question

  • Says each variant row is a separate stored case
  • Expects the tester to edit steps between rows
  • Thinks placeholders bind by column position
  • Confuses the table with where values are sourced
  • Assumes one outcome covers the whole table
open as a page

In a TestRail-class case repository, what is a shared step block, and how does referencing one differ from pasting the same steps into each case?

level: juniorimportance: must knowfreq 66%

basics

~20 s

A shared step block is one stored step sequence that many cases point at instead of each holding a copy. Edit the block and every referencing case changes at once; edit a pasted copy and only that case changes.

open as a page

In a TestRail- or Xray-class test case repository, what are the parts of one stored manual test case, and what does each part hold?

level: juniorimportance: must knowfreq 70%

basics

~20 s

A stored manual case has a title naming what is checked, a preconditions block giving the starting state, numbered step rows that pair each action with its own expected result, and attributes that classify the case.

open as a page

Why does a stored manual test case carry an expected result on every numbered step rather than one expected result for the whole case?

level: middleimportance: must knowfreq 62%

basics

~20 s

Per-row expectations make each step independently checkable, so a divergence can be attached to the action where it happened instead of to the case as a whole. A single case-level expectation pushes that detail into free text nobody can search.

open as a page

In a TestRail-class case repository, a folder tree and case attributes such as component and type both index the same cases — what different question does each answer?

level: middleimportance: must knowfreq 76%

basics

~20 s

A folder answers where a case lives: one home, browsable, the unit permissions and ownership usually follow. Attributes answer what a case is: independent facts that cut across the tree, which a saved query can combine to select a run.

open as a page

A single row of a data-driven case fails during a run in a TestRail- or Xray-class repository. What has actually failed, and what should the run's record show?

level: seniorimportance: must knowfreq 62%

basics

~10 s

One execution failed, not the case. Each row produces its own execution record, so the failure carries that row's values, its own evidence and its own defect link, and only that row is retested.

open as a page

A shared step block referenced by dozens of cases that already carry execution history needs correcting. When do you edit it in place, and when do you create a new block and repoint the cases at it?

level: seniorimportance: must knowfreq 58%

basics

~20 s

Edit in place when the change is cosmetic: same action, same expected result, clearer words. Fork a new block and repoint when the action or expected result changes, because an in-place edit leaves history describing steps nobody performed.

open as a page

A regression suite in a TestRail-class case repository is defined by pointing at a folder path. What goes wrong when the folder tree is reorganised, and how do you define the suite so it survives?

level: seniorimportance: must knowfreq 66%

basics

~20 s

A path selects by location, so cases moved out of the subtree silently leave the suite and cases added elsewhere never join it. The suite shrinks with no error. Define it by attribute and label values instead, so selection follows the case rather than its current home.

open as a page

In a TestRail- or Xray-class test case repository, what is the difference between a controlled attribute such as component or priority and a free-text label typed onto a stored case?

level: juniorimportance: should knowfreq 60%

basics

~20 s

A controlled attribute is a field defined once with a fixed value list, so every case answers the same question the same way. A free label is text anyone can invent — cheap to add, easy to misspell, never complete.

open as a page

In a TestRail- or Xray-class case repository, what changes when a case's variant rows are stored inside the case itself rather than in a shared table several cases point at?

level: middleimportance: should knowfreq 55%

basics

~20 s

Rows stored inside the case make it self-describing and independent, at the cost of duplicating the same values across cases. A shared table gives one edit for every case bound to it, but changes their meaning invisibly.

open as a page

In a case repository, a case references a shared step block. What is the difference between resolving that reference at authoring time and resolving it at execution time?

level: middleimportance: should knowfreq 57%

basics

~10 s

Authoring-time resolution copies the block into the case's own rows at save, so later edits never reach it. Execution-time resolution keeps a pointer and assembles the text each time the case is rendered.

open as a page

In a TestRail- or Xray-class case repository, what is the difference between a built-in case field and a custom one, and what does adding a custom field cost?

level: middleimportance: should knowfreq 54%

basics

~20 s

Built-in fields belong to the product's own model of a case, so its filtering, exports and integrations already understand them. Custom fields are declared by an administrator with a name, a type and allowed values, and each adds something everyone must fill.

open as a page

Before you save an edit to a shared step block, a case repository shows the list of cases that reference it. What do you do with that list, and what does it fail to tell you?

level: seniorimportance: should knowfreq 51%

basics

~10 s

Read the list for owners outside your team and for cases where the block carries the assertion, not the setup. It shows reach, not consequence: it cannot see pasted copies or open runs.

open as a page

How do you decide how fine-grained the numbered steps in a stored manual test case should be, and what goes wrong at each extreme?

level: seniorimportance: should knowfreq 50%

basics

~20 s

Give an action its own row when its expected result is separately observable and a divergence there would mean something different from a divergence in the row beside it. Too fine is unmaintainable noise; too coarse leaves a divergence naming nothing.

open as a page

A saved query that selects cases by label in a TestRail-class case repository quietly returns fewer cases each release, though nothing was deleted. What causes that drift and how do you catch it?

level: seniorimportance: should knowfreq 55%

basics

~20 s

New cases are authored without the label, spellings fork into near-duplicates, bulk edits drop values, and the query keeps returning a valid, shorter set. Catch it by recording the result count every run and reconciling the selection against the same area counted another way.

open as a page

Some entries in a manual test case repository have no numbered steps at all — what does that stored shape hold instead, and what do you give up by using it?

level: seniorimportance: nice to knowfreq 36%

basics

~20 s

A step-free entry holds a title, a scope paragraph and the usual attributes, with a free-text body filled at execution time. Without a step table there are no per-row expectations, so nothing finer than the entry itself can carry an outcome.

open as a page

In a TestRail- or Xray-class case repository, how do you decide whether a variation belongs as another row in a case's variant table or as a stored case of its own?

level: principalimportance: nice to knowfreq 40%

basics

~20 s

Keep it as a row when only the values differ and the steps and expected result are identical. Split it into its own case when it needs different steps, a different expected result, or its own attributes.

open as a page

How do you decide how much of a case's step list belongs in shared blocks, when heavy reuse means one edit ripples into cases several teams own?

level: principalimportance: nice to knowfreq 41%

basics

~10 s

Share a step sequence only when it is one named action every caller would want corrected together. Fragments shared to save typing multiply the ripple surface, and a block nobody dares edit has fossilized.

open as a page

In a case repository shared by several teams, how do you decide which selectors become controlled attribute fields with a fixed vocabulary and which stay free labels anyone can invent?

level: principalimportance: nice to knowfreq 44%

basics

~20 s

Promote a selector to a controlled field when a decision depends on the set being complete and the dimension is stable and universal. Leave it a label when it is temporary, local to one team, or nobody will claim completeness over it.

open as a page