Browse the Knowledge Hub56 resources
Test cases
Dashboard test cases, for the number that is wrong but plausible
Twenty eight cases covering reconciliation against source records, widgets that disagree with each other, date range and timezone aggregation, zero baselines, no data rendered as zero, permission leaks through aggregates, drill down mismatches, data freshness, partial failures and export fidelity.
All 28 test cases, ready to copy
Free to use and adapt, no sign-up. Download as CSV or Markdown, or copy it straight into your own tooling.
Last updated
28 worked examples
Reconcile a metric against the underlying records
TypeStatePriorityHigh- Test data
- A known data set with a hand calculated expected total
- Expected result
- Widget figure equals the hand calculated total exactly. This is the only case that proves the metric is right rather than merely stable.
Keep two widgets showing the same measure consistent
TypeStatePriorityHigh- Test data
- A summary tile and a chart that both report revenue for the same period
- Expected result
- Both agree. Two widgets built from different queries drift apart, and the disagreement destroys trust in the whole dashboard.
Match the total to the sum of its breakdown
TypeBoundaryPriorityHigh- Test data
- A total tile beside a breakdown by category, including records with no category
- Expected result
- Breakdown sums to the total, and uncategorised records appear as an explicit group rather than silently disappearing from the breakdown.
Apply the date range filter to every widget
TypeFunctionalPriorityHigh- Test data
- Set a custom range and check each widget on the dashboard
- Expected result
- Every widget honours the range. One widget ignoring the filter while the others obey it is the most common source of an apparently impossible figure.
Handle date range boundaries inclusively and consistently
TypeBoundaryPriorityHigh- Test data
- A range whose endpoints exactly match record timestamps, and single day ranges
- Expected result
- Inclusivity matches the specification, and a record at the boundary is counted in exactly one period across every widget.
Resolve the timezone for aggregation explicitly
TypeBoundaryPriorityHigh- Test data
- Records near midnight viewed by users in two timezones, and a range spanning a daylight saving change
- Expected result
- Aggregation uses a documented timezone consistently, the same day boundary applies to every widget, and the repeated hour does not double count.
Compare against a previous period correctly
TypeBoundaryPriorityHigh- Test data
- A month over month comparison across months of different lengths, and one spanning a leap day
- Expected result
- Comparison period is the documented equivalent, its length is stated, and the percentage change is calculated on comparable spans.
Handle a percentage change from a zero baseline
TypeBoundaryPriorityHigh- Test data
- A previous period value of zero, and a current value of zero after a positive period
- Expected result
- No division by zero, no infinity and no misleading figure. The interface shows a defined indicator rather than a number that cannot be computed.
Distinguish zero from no data
TypeStatePriorityHigh- Test data
- A period with a genuine zero, and one where the source has not reported yet
- Expected result
- Rendered differently. A pending period shown as zero makes a chart look like a collapse in activity and triggers investigations into nothing.
Show an explicit empty state
TypeNegativePriorityHigh- Test data
- A filter combination that matches no records
- Expected result
- A clear empty state naming the active filters, rather than a blank panel or a chart with axes and no series, which both read as a loading failure.
Apply row level permissions to every widget and export
TypeSecurityPriorityHigh- Test data
- A restricted user viewing each widget, drilling down, and exporting
- Expected result
- Restricted records are absent from figures, from drill downs and from exports. An aggregate that includes hidden rows leaks their existence and their values.
Suppress an aggregate small enough to identify individuals
TypeSecurityPriorityMedium- Test data
- A filter narrowing a group to a single record
- Expected result
- Documented suppression rule is applied where the data is sensitive, so a permitted aggregate cannot be narrowed until it reveals one person figures.
Refuse a widget or dashboard belonging to another account
TypeSecurityPriorityHigh- Test data
- Request a dashboard identifier owned by another tenant, and a widget data endpoint directly
- Expected result
- Both refused. The data endpoint behind a widget needs its own authorisation rather than relying on the page that renders it.
Drill down to records that match the widget figure
TypeFunctionalPriorityHigh- Test data
- Click a chart segment showing a count, then count the rows returned
- Expected result
- Row count equals the figure. A drill down that applies different filters than the aggregate is a defect even when both are individually defensible.
Carry filters into the drill down and back
TypeStatePriorityMedium- Test data
- Apply two filters, drill down, then return to the dashboard
- Expected result
- Filters apply in the detail view and are still applied on return, rather than resetting and quietly changing every figure on the page.
Preserve dashboard state in the URL
TypeStatePriorityHigh- Test data
- Set filters and a date range, then copy the URL into a new tab
- Expected result
- Identical view is restored, so a figure shared with a colleague is the figure they see rather than the default range.
Show data freshness honestly
TypeStatePriorityHigh- Test data
- A dashboard served from a cache, and one where the pipeline is delayed
- Expected result
- The as at time is displayed and reflects the data rather than the page load, and a stale or delayed pipeline is surfaced rather than presented as current.
Handle a partial data failure per widget
TypeStatePriorityHigh- Test data
- Make one widget query fail while the others succeed
- Expected result
- Failing widget shows its own error with a retry while the rest render. A single failure must not blank the dashboard or, worse, render as zero.
Round and format numbers without changing their meaning
TypeFunctionalPriorityHigh- Test data
- Values requiring rounding, abbreviated large numbers, negative values and percentages
- Expected result
- Rounding is applied consistently, abbreviated values are unambiguous, the sum of rounded parts is not presented as an exact total, and units are always shown.
Format currency by the reporting currency, not the viewer locale
TypeBoundaryPriorityHigh- Test data
- A dashboard viewed by users in two locales, with source records in two currencies
- Expected result
- Reporting currency is stated, conversion uses a documented rate and date, and mixed currency records are not summed as though they were one.
Scale the axis without misleading the reader
TypeFunctionalPriorityMedium- Test data
- A series with a narrow range, one with an outlier, and one crossing zero
- Expected result
- Axis behaviour is documented and consistent, a truncated axis is labelled as such, and zero is visible where the chart implies proportion.
Render a large series without freezing the interface
TypePerformancePriorityHigh- Test data
- A chart over 100,000 points and a dashboard of twelve widgets loaded together
- Expected result
- Load stays inside the stated budget through aggregation or sampling, sampling is disclosed, and the interface stays responsive while loading.
Load widgets independently rather than blocking
TypePerformancePriorityMedium- Test data
- One deliberately slow widget among fast ones
- Expected result
- Fast widgets render immediately with their own loading states, and the slow one does not hold the whole page behind it.
Export a widget that matches what is displayed
TypeStatePriorityHigh- Test data
- Export a chart underlying data with filters and a date range applied
- Expected result
- Export honours every active filter, the totals match the widget, and values beginning with an equals sign are neutralised so the file cannot execute formulas.
Schedule a report that matches the live dashboard
TypeStatePriorityMedium- Test data
- A scheduled export delivered while the dashboard is viewed for the same period
- Expected result
- Figures agree, the schedule runs in a documented timezone, and the report states the period and the as at time it covers.
Rearrange and persist a customised layout
TypeStatePriorityMedium- Test data
- Move and resize widgets, remove one, then reload and sign in on another device
- Expected result
- Layout persists per user, a removed widget stays removed, and a newly released widget appears without destroying the saved arrangement.
Remain readable on a narrow viewport and when printed
TypeCompatibilityPriorityMedium- Test data
- A twelve widget dashboard on a mobile viewport and sent to print
- Expected result
- Widgets stack and remain legible, wide charts scroll inside their own container rather than the page body, and printing does not clip axes or legends.
Make every figure available without relying on colour or hover
TypeAccessibilityPriorityHigh- Test data
- Screen reader navigation across widgets, and a chart distinguished only by colour
- Expected result
- Each widget exposes its figures as text or a table, series are distinguishable without colour alone, and values behind a hover tooltip are reachable by keyboard.
What goes in each field
ID
RequiredStable identifier, prefixed by module.
Test case
RequiredWhat is being verified, in one line.
Type
Functional, negative, boundary, security, state, performance, accessibility or compatibility. Use it to check coverage is spread rather than clustered on the happy path.
Priority
Risk based, weighted by the decisions the number drives. Anything that reports a wrong figure plausibly, disagrees with another widget, or shows a user data outside their scope is High.
Test data
The specific values, including the invalid and boundary ones.
Expected result
RequiredThe precise observable outcome, including message text where the wording itself is the requirement.
Calculate one number by hand
A dashboard bug is not a broken screen, it is a believable wrong figure. These four conditions are how you find one.
Reconcile against the raw rows
Take a known data set, calculate the expected total by hand, and compare. Nothing else in this set proves the metric is correct rather than merely consistent.
Compare two widgets showing one measure
A summary tile and a chart built from different queries will drift apart. Users notice the disagreement and stop trusting every other figure on the page.
Separate zero from not yet reported
A pending period rendered as zero makes a chart look like activity collapsed. People investigate an outage that never happened, then learn to ignore the dashboard.
Drill down and count
Click a segment showing a count and count the rows returned. A drill down applying different filters than the aggregate is a defect even when both look defensible alone.
Why reporting defects go unreported
Dashboards fail differently from the rest of an application. A broken screen gets a support ticket within minutes; a wrong number gets acted on. Nobody can tell by looking whether revenue for last month should be that figure, so the only test that establishes correctness is reconciliation against the underlying records with a hand calculated expectation. Everything else confirms that the widget is stable, which is not the same thing. The second most valuable case is cross widget consistency, because two panels reporting the same measure from different queries will diverge, and that divergence is the thing users do notice and the thing that discredits the whole page.
Time is where aggregation quietly goes wrong. A day boundary depends on a timezone, and if that timezone is the viewer device rather than a documented reporting timezone, two people looking at the same dashboard see different numbers and both are convinced the other is mistaken. Ranges need consistent inclusivity so a record at the boundary is counted in exactly one period, and period comparisons need to state their span, because a month over month change across February and March is comparing twenty eight days with thirty one.
Empty and zero are different states and rendering them the same way causes real damage. A period where the pipeline has not reported yet is not a period with no activity, and showing it as zero turns a delayed job into an apparent business collapse. The related case is the honest freshness indicator: an as at time that reflects page load rather than the data behind it is worse than no indicator, because it actively asserts that stale figures are current.
Finally, aggregates leak. Row level permissions applied to a detail view but not to a summary let a restricted user infer the values they were not allowed to see, and narrowing a filter until a group contains one record turns a permitted aggregate into an individual disclosure. The widget data endpoint needs its own authorisation rather than trusting the page that renders it, and the export path needs the same filters and the same permissions as the screen, plus neutralisation of any cell starting with an equals sign so a downloaded file cannot execute formulas in the recipient spreadsheet.
Suggest an improvementTesting a reporting or BI layer?
QAble tests analytics end to end, including reconciliation against source data, aggregation boundaries, permission enforcement in aggregates and export fidelity.
BI testing servicesMore test case sets
View allTest cases for a login page
Test cases25 cases across functional, negative, boundary, security, session and accessibility paths, including account enumeration and lockout.Test cases for a registration form
Test cases28 cases covering validation, duplicate accounts, email verification, password rules and the enumeration leak most signup forms ship with.Test cases for search functionality
Test cases28 cases across relevance, partial and fuzzy matching, filters, pagination, empty states, injection attempts and performance under load.Test cases for a shopping cart
Test cases27 cases on quantity limits, price recalculation, stock changes, coupon stacking, guest to account merge and cart persistence.Test cases for checkout and payment
Test cases30 cases including 3D Secure, declines, timeouts, duplicate charges, idempotency, refunds and partial captures.Test cases for file upload
Test cases28 cases on size and type limits, spoofed content types, malicious filenames, progress, resume, virus scanning and storage limits.Test cases for forgot password
Test cases26 cases on reset token expiry, single use enforcement, session invalidation and the enumeration and rate limit gaps that are routine here.Test cases for OTP verification
Test cases26 cases on expiry, resend throttling, attempt limits, code reuse, delivery failure and the brute force window teams forget to close.Test cases for user roles and permissions
Test cases26 cases on horizontal and vertical privilege checks, direct object access, role changes mid-session and permission inheritance.Test cases for form validation
Test cases27 rules-based cases on required fields, length and numeric boundaries, client and server parity, hidden field tampering and error accessibility.Test cases for a date picker
Test cases26 cases on timezone shifts, ambiguous day and month order, impossible dates, min and max limits, leap years and keyboard operation.Test cases for pagination
Test cases24 cases on ordering stability, records changing mid-session, page size caps, deep offset cost, permission-filtered totals and state restore.Test cases for push notifications
Test cases26 cases on app states, deep link routing, token release on sign out, lock screen privacy, preferences, provider failures and platform differences.Test cases for reports and data export
Test cases25 cases on permission filtering in the file, spreadsheet formula injection, encoding, typed numbers and dates, row limits and audit logging.Test cases for a chatbot
Test cases28 cases on paraphrased intents, context, fallback loops, human handoff, policy grounding, prompt injection and data scoping.Test cases for net banking transactions
Test cases28 cases on duplicate debits from a retried request, concurrent transfers against one balance, daily limits across channels, beneficiary cooling periods, second factor binding and reconciliation.Test cases for wallet and UPI payments
Test cases28 cases on payments that time out with no response, idempotency on retry, racing balances, caps across devices, collect request fraud, mandates and refunds.Test cases for insurance claim submission
Test cases28 cases on coverage at the date of loss, waiting periods, deductibles and sub limits, exclusions and riders, duplicate claims and settlement reconciliation.Test cases for patient records in an EHR
Test cases28 cases on duplicate detection and merge, wrong patient entry, units of measure, allergy and interaction alerting, break glass access and audit of reads.Test cases for CRM lead management
Test cases28 cases on duplicate leads under concurrency, routing and the unrouted fallback, round robin races, territory visibility, conversion and bulk import.Test cases for an ERP purchase order
Test cases28 cases on approval thresholds, amendments that must reset approval, budget commitment races, over receipt tolerance, three-way match and duplicate invoices.Test cases for OTT video playback
Test cases28 cases on bitrate recovery after a dip, DRM renewal mid stream, concurrent stream limits and leaked slots, resume conflicts, ad cue points and offline expiry.Test cases for game level progression
Test cases28 cases on save corruption during a crash write, cloud save conflicts, offline queue replay, unlock gating, currency exploits and purchase restore.Test cases for a REST API
Test cases28 cases on status code correctness, cross tenant resource access, mass assignment, idempotent retries, cursor pagination, rate limits and contract drift.Test cases for SSO and social login
Test cases28 cases on linking an account on an unverified email, state and code replay, redirect allow lists, token signature and issuer, deprovisioning and session rotation.Test cases for subscription and billing
Test cases28 cases on mid cycle proration, duplicate and out of order webhooks, renewal double charges, dunning and grace, trials, coupons, metered usage and tax.Test cases for data tables, filters and sorting
Test cases28 cases on unstable sorts across pages, filters that must reset pagination, selection surviving a filter change, bulk action scope and export fidelity.Test cases for session timeout and concurrent login
Test cases28 cases on tokens that survive sign out, refresh token reuse, idle against absolute lifetime, multi tab expiry, session limits and remote revocation.Test cases for a multi step form wizard
Test cases28 cases on values lost to back navigation, refresh and session expiry, step skipping, server side revalidation, duplicate submission and conditional branches.Test cases for email verification
Test cases28 cases on token reuse and expiry, invalidating earlier links, account enumeration, header injection, safe address change and mail scanner prefetching.Test cases for booking and reservation
Test cases28 cases on concurrent bookings for the last slot, inventory holds that leak, payment without a booking, cancellation boundaries and channel sync.Test cases for mobile app install and update
Test cases28 cases on migration chains across skipped versions, crashes during post upgrade migration, forced update lockouts, deep links and clean reinstall.Test cases for accessibility (WCAG 2.2 AA)
Test cases28 cases on keyboard only completion, focus management, live region announcements, contrast, reflow at 320 pixels, target size and screen reader verification.Test cases for performance and load
Test cases28 cases on spikes with no ramp, recovery after peak, soak and leak detection, pool exhaustion, cold caches, retry storms and data correctness under load.Test cases for the OWASP Top 10
Test cases28 cases on broken access control, mass assignment, injection across every input surface, credential stuffing, session invalidation, SSRF and exposed secrets.Test cases for cross browser compatibility
Test cases28 cases on storage that throws in private mode, blocked third party cookies, engine date parsing, mobile viewport units, in app browsers and ad blockers.Test cases for database and data integrity
Test cases28 cases on uniqueness under concurrency, lost updates, counter races, orphaned rows, migration and backfill safety, replica lag and verified restores.Test cases for localisation and multi language support
Test cases28 cases on text expansion, concatenated sentences, plural rules, locale date parsing, decimal separators, right to left layout, collation and encoding.Want your reported numbers proven, not assumed?
QAble covers functional, boundary and data integrity paths with ISTQB-certified engineers. Start with a free QA audit of your platform.