Write test cases per the rules below. First prepare them in an md file for validation, then produce the CSV for import (or create directly via MCP, section 13).
Account for the requirements logic and existing mockups. On mismatch between mockup and implementation — log a question for the analyst.
-
Test case format:
— Name — short and clear (object: essence of the check, e.g. "Calendar
opening", "List pagination"). No URLs, selectors, or technical details
in the name (they belong in steps/objective). Do not put TC-(test case number) in the name.
— Test case preconditions (if applicable)
— Steps (maximally detailed, atomic)
— Expected result (state it only after logically significant steps)
— Priority (High / Normal / Low)
— Type (UI / Functionality / Integration — or the values used in your project)
— Reference (link or mockup name from Figma/PDF, specific element) — if applicable
— Use the EXACT names of fields, buttons, headings,
placeholders as in the implementation/mockups/spec
— If the mockup labels a field "Issued by?" — write "Issued by?",
not "Issued by (ID document)"
— Check: colons, question marks, letter case,
spaces in labels
— If names differ between requirements and mockups -
log it as a question for the analyst
-
Steps:
— One action per step
— Always spell out:
• "Click the "Button name" button"
• "Enter the value "…" in the "Field name" field"
• "Select the value "…" from the "Name" dropdown"
• "Hover over the "…" element"
• "Open the page at URL …"
— Avoid shorthand references:
❌ "similarly", "repeat the steps", "as in the previous test case",
❌ "select values per the test case name"
Each step must read independently of other test cases.
-
Expected result:
— By default — a separate Expected Result after significant steps, not one shared block at the end
— State the result after steps where:
• validation occurs
• UI state changes
• data is submitted
• an error/message is displayed, etc.
— Wording:
• "The system displays…"
• "The field is highlighted with an error…"
• "The button becomes enabled/disabled…", etc.
— Source of the expected result — requirements/spec, then mockups. The implementation/environment is NOT a source:
take only exact element names from the implementation; the expected
BEHAVIOR comes from requirements and mockups. If the implementation
diverges from the requirements — that is a bug or a question for the analyst, not a basis for the expected result.
-
Coverage:
Negatives are a required artifact, not optional. Add a dedicated "Negative/Boundary" group; in the coverage assessment (section 12) list which negative classes are covered and which are consciously skipped (with a reason). A positive-only set is incomplete, even if the object looks simple/navigational.
Overlays/modals/panels (an example pack for one object type): scroll lock (position preserved, background not scrollable, scrollbar-width compensation with no "jump"), close via ×/Esc/backdrop click/Back, deep-link and reload (state in URL), double-click/spam, resize while open, overlay stacking, fits the viewport at EVERY breakpoint (incl. tablet and short/landscape screens): content not clipped vertically OR horizontally (nothing runs off the edges), internal scroll when content is taller than the viewport, every element and button (submit/footer/close) reachable, safe padding from edges. Other object types have their own negative pack (forms, lists, navigation, APIs; see references).
Include in coverage:
— Positive scenarios
— Negative scenarios
— Boundary values
Do not duplicate identical checks without reason.
— UI states:
• default
• hover
• focus
• disabled
• error
• loading (if applicable), etc.
— Behavior on:
• page reload
• navigation
• network loss (if there are integrations), etc.
— Optimize the set thoughtfully, but never at the cost of quality and coverage
— Run checks at these resolutions (if the task involves UI/responsive layout):
Desktop: 1920x1080, 1536x864, 2560x1440
Mobile: 414x896, 360x800, 393x873, 430x926
Tablet: 768x1024, 1024x768
— Layout integrity at EVERY breakpoint — for ANY object, not just modals: nothing clipped vertically or horizontally or running off the edges; every element, text, icon and button visible and reachable; scroll when content exceeds the viewport (internal scroll for overlays); composition and placement verified against the mockup for THAT specific breakpoint (no item should disappear, move, or flip its icon side). Modals/overlays are just one instance.
— Form reuse:
• functionality after a successful submit and return
(a "Submit another" button, etc.)
• correctness of all fields and lists on repeat fill
— Sequential validation:
• error type switching as input changes
(e.g.: enter digits → clear the input → the error must
switch from "Letters only" to "Required field")
• error independence between fields
(an error in field A does not affect the error text in field B)
— Exact error texts:
• state the expected error text in Expected Result,
not an abstract "an error is displayed"
If the error text is unknown — state the expected meaning
— If a field has extra UI elements
(a "No middle name" button, a toggle, a clear icon) -
verify their presence/absence and behavior separately
-
Verification against the implementation and mockups:
— When mockups/screenshots exist — verify test cases against them
— Figma — ALWAYS look at the mockup with your own eyes, not only its structure:
the node dump (get_figma_data) gives the grid and layout as text, but part of
the content is hidden in component templates (template=…) and never reaches the
dump; breakpoint differences (desktop/mobile) are invisible in the tree. Also
download the rendered frames (download_figma_images, desktop + mobile) and view
them — only the visual gives exact button/card labels, the full contents of
groups, and catches breakpoint mismatches
— By default write expected results 1:1 with the mockup (exact headings, texts,
full list/group contents, names, icons) — max precision is the default. Relax the
content match ONLY when the user explicitly says not to tie to content (e.g. the
test environment's content differs from the mockup): then verify the block's
presence and key names/headings/icons without hardcoding a rigid full list.
Structure, headings and key names are always verified exactly
— Log discrepancies as bugs or questions
— If a field is "optional" per requirements
but the implementation requires input — that is a bug
-
Integrations:
If there are APIs / external services:
— Verify:
• correct parameter submission
• 4xx / 5xx error handling
• no UI crashes, etc.
— Reflect this in the steps and Expected Result
-
Structure:
— Test case order: High first, then Normal, then Low
— Within each group, positive scenarios first, then negative
— Group logically (Display / Validation / Navigation / Negative)
— Split Desktop and Mobile if there is responsive layout
— Target browsers — per project requirements; typical minimum:
Chrome (Desktop + Android), Safari (iOS)
— For Mobile-only test cases, prefix the name with [Mobile]
-
Style:
— Businesslike, QA style
— No filler
— Clear, unambiguous, reproducible
-
Output:
— Test cases must be ready for TMS import (CSV)
— If your TMS MCP is connected (e.g. Zephyr Scale MCP with the
create_test_case tool) — after validating the md file, offer to create
the test cases directly instead of manual CSV import; CSV remains a fallback
— No abbreviations or ambiguous wording
— File names: {TASK_KEY}_test_cases.md and {TASK_KEY}_test_cases.csv
(e.g. PROJ-1234_test_cases.md). Save to the current working directory.
-
Export for Zephyr Scale